Владимир Попов
2003
Как-то "сложилось по жизни", что на IBM PC мне всегда требовалось более одной операционной системы. Сама архитектура этого компьютера такую мультизагрузку вполне допускает, род моих занятий - программист, так что особых проблем упомянутая потребность не вызывала. В тех же случаях, когда подобная мультизагрузка требовалась кому-то ещё, я рекомендовал Ильи Евсеева. С приходом Pentium-II инсталлятор xboot пришлось слегка подправить по поводу run-time error 202 (ну, не предполагали разработчики TurboPascal, что так быстро всё случится), за что, пусть с опозданием, приношу извинения автору: несанкционированная модификация кода, всё же. А больше ничего и не требовалось.
Познакомившись года четыре назад с Linux, я узнал, что, кроме загрузки первичных разделов (реальных или виртуальных), загружать можно и ядра операционных систем. Причём, этих уж может быть сколько угодно: существующее ограничение на количество первичных разделов значения, в данном случае, не имеет. Дальше - больше. Оказывается, существует спецификация множественной загрузки (multiboot specification), и если бы производители ОС её придерживались, то мультизагрузка могла бы стать функцией BIOS, например. Это, однако, - из области фантазий. Пока, во всяком случае.
Постепенно примкнув к лагерю сторонников ПО с открытым исходным кодом (и в соответствии с принципами этого лагеря), я несколько раз делился опытом на виртуальных страницах различных сайтов. И вот что интересно: больше всего вопросов задали мне в связи с моим вариантом описания мультизагрузчика GRUB (GRand Unified Bootloader). Причём спрашивали не собратья linux-оиды, а именно пользователи ОС от MicroSoft. К сожалению, мои советы по поводу использования GRUB помогали им не так уж часто. И не потому, что этот мультизагрузчик плох, отнюдь, а потому, что, кроме возможности загружать УЖЕ СУЩЕСТВУЮЩИЕ на винчестере ОС, уважаемым корреспондентам требовалась ещё и возможность создавать СОСУЩЕСТВУЮЩИЕ ОС от MicroSoft на одном и том же винчестере. А вот это в прямые функции GRUB никак не входит. Сам же производитель такую возможность пользователям не предоставляет: ну, не могли они предположить такой удачи, чтобы для одного компьютера несколько ОС покупалось. Upgrade со скидкой - предположили, а две версии одной ОС, но разной, скажем, локализации - нет. Или просто две одинаковых: одну - сынишке-геймеру, другую - себе для работы...
Сожаление моё (а может - раздражение из-за необходимости повторять одну и ту же информацию, с каждым разом кажущуюся всё более банальной) постепенно достигло уровня, когда я решил предпринять ещё одну попытку разъяснения всем желающим возможности использования на одном IBM PC нескольких операционных систем производства MicroSoft. "Ещё одну", потому, что документация к любому мультизагрузчику предпринимает такую попытку в обязательном порядке, жаль только, мало, кто эту документацию читает, если судить по отзывам на эти самые мультизагрузчики. А "MicroSoft" потому, что ОС unix-клона и так предоставляют все необходимые для мультизагрузки средства, да и пользователи их, в большинстве своём, лучше представляют себе организацию данных на винчестере: и не обязательно из-за "повышенной" грамотности - по необходимости, быть может.
Итак, оставим в стороне multiboot specification и vmlinuz (традиционное название ядра Linux): просто добьёмся существования на одном винчестере двух-трёх "непритязательных" ОС: DOS, win'95 и win'98. Для решения этой задачи потребуются некоторые знания и инструментарий. И то и другое - в минимальном количестве. В стиле MicroSoft, так сказать. Дабы пользователь "не утомился".
Что касается знаний, то без них, к сожалению, не обойтись: слишком скудны средства, которыми располагает персональный компьютер в момент загрузки. Поэтому и рассчитывать на исчерпывающе-содержательный интерфейс мультизагрузчиков не приходится. Если система "не грузится", то некому поведать языком "интуитивно-понятного интерфейса", почему это случилось. Приходится рассчитывать на аскетическое ПО, размещающееся, как правило, на дискете, и на собственные знания. Минимальный набор знаний, необходимых для осуществления самостоятельных осмысленных операций над разделами диска IBM PC, укладывается в сравнительно небольшое число постулатов:
0x80 или 000 (для загружаемого и не загружаемого разделов, соответственно). Типов же файловых систем существует значительно больше. Современному приверженцу MicroSoft достаточно знания следующих:
004 - FAT16, объёмом менее 504 MB005 - расширенный раздел, заканчивающийся ниже 8 GB006 - FAT16, объёмом менее 2 GB, заканчивающийся ниже 8 GB007 - Windows NT NTFS00B - FAT32, заканчивающийся ниже 8 GB00C - FAT32, заканчивающийся выше 8 GB (как 00B, но для LBA)00E - FAT16, объёмом менее 2 GB, заканчивающийся выше 8 GB (как 0х06, но для LBA)00F - расширенный раздел, объёмом более 8 GB или заканчивающийся выше 8 GB (как 0х05, но для LBA)0xFF - таблица дефектных блоков Xenix0x10 к идентификатору типа раздела делает его "скрытым" (hidden). Правда, на эту "скрытость" MicroSoft перестала обращать внимание, начиная от win'2000.В принципе, из вышеизложенного уже можно догадаться, что нужно сделать для достижения поставленной задачи:
Теперь осталось выяснить: как конкретно это сделать. Переходим к инструментарию. Существует довольно много программ, с помощью которых можно редактировать MBR и, в частности, таблицу разделов. Большинству пользователей MS Windows наверняка известен Norton Disk Doctor, доживший уже до девятой, если память не изменяет, версии.
Список известных мультизагрузчиков тоже не так уж мал. А вот продукт, достаточный сам по себе для решения поставленной задачи, известен мне только один. Это GRUB - GRand Unified Bootloader. Изначально, автор - Erich Boleyn, а в настоящее время проект развивается как часть GNU - известного "бастиона" Open Source. Именно на сайте этой уважаемой организации находится страничка GRUB: , а на её ftp-сервере всегда можно скачать последнюю версию пакета.
GRUB, безусловно, достоин отдельного разговора, но для наших "минималистских" целей достаточно будет рассказать о пяти-шести из почти шести десятков его команд - да простят меня авторы. Приверженцам MicroSoft я даже скачивать дистрибутив GRUB не рекомендую: проще воспользоваться его загрузочной дискетой, подготовленной мной специально для них на дискете в формате FAT (подобная дискета входит и в состав дистрибутива, только файлов на ней, не имеющих отношения к ОС от MicroSoft, много больше и прочитать её под DOS/Windows - затруднительно). Архивированный образ дискеты лежит , а получить из образа дискету можно с помощью замечательной программы , которую, пользуясь случаем, я настоятельно всем рекомендую. Размер архива - очень скромный - чуть более 50кБ.
Вот мы и "во всеоружии". Начали:
fdisk-a от MicroSoft (а именно он разбивает диск на разделы) первичный (primary) раздел может быть только один, то придётся с этим для начала согласиться. Размер раздела выберите минимально достаточным. Расширенный раздел можно пока не создавать; grub>"), а если воспользовались моим предложением, то на экране появится меню загрузки. С меню разберёмся позднее, а для перехода в командный режим нужно нажать "с", о чём, кстати, напоминает и присутствующая на экране подсказка. Набираем:
grub>root (<Tab>где <
Tab> - подразумевает нажатие клавиши табуляции.
fd0 и hd0. Отмечаем: так называются и нумеруются (с нуля!) в GRUB дисковые устройства. Продолжим набор в соответствии с нашим планом:
grub>root (hd0,<Tab>В ответ мы получим перечень разделов диска, выбор из которых возможен. Поскольку раздел у нас пока один, то и в перечне только одна позиция. Нажимаем <
Esc>, поскольку продолжать команду не нужно: всё проделанное было нужно лишь для того, что бы, заставляя GRUB выполнять автозаполнение команды, "выудить" у него информацию о разделах. Что и достигнуто. Запоминаем (лучше - записываем), что первая ОС инсталлирована в разделе (hd0,0) (нотация - GRUB), и тип её - 00b, например (у Вас, разумеется, может быть другой). Переходим к следующему пункту;grub>parttype (hd0,0) 0xffЭто уже нормальная команда и завершать её нужно вводом Enter. Если Вы ещё не догадались, то скажу, что таким образом мы поменяли байт-идентификатор типа файловой системы раздела на
0xff. С этого момента вполне нормальная система будет видеться всеми прочими, как нечто абсолютно чуждое (даже Xenix, которого все прочие будут полагать создателем этого раздела, посчитает её списком дефектных блоков); grub>parttype (hd0,n) 0xNNгде
n - номер демаскируемого раздела, а 0xNN - действительный тип его файловой системы (я надеюсь, Вы ещё не потеряли бумажку с записями об этом). Нетрудно догадаться, что после "демаскирования" грузиться будет всегда система, инсталлированная последней. Большего от кода в MBR добиться не удастся: пора переходить к подготовке мультизагрузки; boot/grub (не обращайте внимания на "косые": GRUB не обращает внимания на то, прямые они или обратные - и мы не будем) и переписываем в него файлы из аналогичного подкаталога дискеты. Заметьте, на котором из разделов находится этот подкаталог; grub>root (hd0,n) grub>setup (hd0)где
n - номер раздела, в котором находится подкаталог boot/grub. Если у Вас современный винчестер, то почти наверняка GRUB сохранил весь необходимый ему для работы код в блоках нулевой дорожки, соседствующих с MBR (нулевая дорожка не используется операционными системами). Если сообщение об этом появилось на экране во время выполнения команды setup, то все файлы подкаталога boot/grub можно теперь удалить. Кроме menu.lst. Точнее, его тоже - можно, но при этом нужно позаботиться о переносе содержимого этого файла в какие-нибудь свободные блоки на диске (а хоть бы и на той же нулевой дорожке), а номера этих блоков перечислить в команде install. Как это сделать под Linux - не интересно пользователю MS Windows, а средствами самой MocroSoft этого сделать и вовсе нельзя. Поэтому лучше оставим menu.lst на месте и перейдем к анализу его содержимого на примере варианта с предложенной Вам дискеты. Вообще-то, файл этот достаточно, на мой взгляд, прокомментирован. И даже, для удобства приверженцев MicroSoft, - в кодировке win-1251. Но некоторые пояснения, быть может, и не помешают:
timeout 10 - задаётся число секунд, после которого стартует загрузка "по умолчанию", нажатие на любую клавишу прерывает отсчёт. С этого момента "само собой" ничего не произойдёт: GRUB ожидает команды или выбора позиции меню; color light-gray/blue black/light-gray - задаются цвета меню: цвет символов/фона для не выбранной и выбранной позиций меню; default 0 - задаётся та самая позиция меню "по умолчанию". Позиции меню, как можно заметить, тоже нумеруются с "нуля". Приведённая строка, кстати, смысла не имеет: в её отсутствие именно нулевая позиция меню и считается позицией "по умолчанию". Но вот если бы цифра была другой... title menu item - всегда начинает описание варианта загрузки. Текст после title станет текстом соответствующей позиции меню; root (hdm,n) makeactive chainloader +1где
m - номер диска, n - номер раздела. Оба нумеруются с "нуля". Отредактировав menu.lst, Вы получаете законченную систему с мультизагрузкой. Поздравляю. Надеюсь, предложенный мной путь не показался Вам слишком трудным - проще не смог, уж не взыщите. А приведённые ниже советы можно прочитать "чисто из любопытства" или в том случае, если Вы столкнётесь с проблемой, для разрешения которой знаний у Вас окажется недостаточно. Можно рассматривать их, как мини-FAQ к основному материалу. Итак:
menu.lst никуда не денется, если только Вы сами его ненароком не уничтожите, а вот исполняемый код MBR (который в настоящий момент представляет собой ни что иное, как stage1 GRUB) рано или поздно будет уничтожен очередной реинсталляцией продукта MicroSoft. К счастью, установка мультизагрузчика отнимает не более минуты, вот только дискета GRUB при этом - обязательное условие; root, не должна ввести Вас в заблуждение множеством разделов типа 00B или 00C. Все разделы с номерами старше трёх - логические и, хотя типы их такие же, как у разделов первичных, загружаться они не могут. На самом деле, с помощью GRUB - могут, если будут содержать в загрузочной записи (boot record) код загрузки операционной системы. Только вот Microsoft не предоставляет средств инсталляции своих ОС в логические разделы. Если же Вы воспользуетесь средствами копирования разделов независимых производителей и не ошибётесь при задании идентификатора файловой системы, то преодоление ограничения на количество загружаемых разделов перестанет быть неразрешимой задачей; help и help имя_команды - лучшие помощники при использовании командного режима; root - rootnoverify. Разница между ними в том, что rootnoverify просто объявляет указанный раздел "разделом по умолчанию", даже не пытаясь читать его. Все последующие команды будут подразумевать именно этот раздел. Пробовать можно смело: хуже не будет; chainloader использовать с опцией --force, то не будет проверяться так называемая "сигнатура" - последние два байта загрузчика раздела (boot loader), которые всегда должны быть равны 0x55 0xAA. Мне, признаться, не встречались исправные загрузчики с неверной сигнатурой, но, может быть, Вам повезёт больше; hide (hd0,1) hide (hd1,1) unhide (hd0,0)мы "скроем" при её загрузке вторые разделы первого и второго дисков и, напротив, "откроем" первый раздел первого диска.
splashimage=(hd0,0)/boot/grub/splash.xpm.gzномер диска и раздела могут быть, разумеется, любыми.
splash.xpm.gz - сжатый (gziped) файл "заставки". Команду задания цветов меню color в этом случае лучше исключить: всё равно не сработает. Формат "заставки", к сожалению, задан жёстко: 640х480, 14 цветов, xpm-кодирование. К сожалению, потому, что как простейший из архиваторов gzip, так и графический формат xpm не являются "естественными" в среде Microsoft Windows. К тому же, команда splashimage не включена в вариант GRUB, предоставляемый GNU, а только в те, которыми комплектуются дистрибутивы RedHat или ALT Linux, например. Красота, как это часто бывает, и в этом случае "требует жертв"; map (hd0) (hd1) map (hd1) (hd0) root (hd0,0) makeactive chainloader +1загрузят ОС из первого раздела второго диска. Обратите внимание, что команды
map "меняют местами" диски даже в представлении GRUB: второй диск становится после их выполнения hd0, а не hd1. Также, собственно, поступает и BIOS; \\HKLM\System\MountedDevices\Подробнее не описываю: знающему достаточно, а не знающему, что такое regedit, сначала лучше с ним поближе познакомиться, и лишь потом переходить к редактированию registry.
menu.lst после этого могут указывать уже не "туда, куда следует". Придётся вспомнить о командном режиме, определении действительных типов файловых систем, после чего отредактировать menu.lst; Разумеется, описанный способ создания системы с мультизагрузкой - не единственный. Лет пять назад, устав от необходимости несколько раз запускать Disk Editor, пока подготавливаемый к продаже компьютер не обретёт запрошенную мультисистемность, я написал четыре крошечные утилитки для сохранения и восстановления MBR, а также для просмотра и модификации пресловутых четырёх пар байт таблицы разделов. Используя возможности создания меню средствами config.sys и autoexec.bat, loadlin - для загрузки Linux из-под DOS и эти самые утилитки, также вполне можно было создать систему с мультизагрузкой. Вывод: важнее всё-таки знать, что нужно делать, а средства осуществления - найдутся.
Вот, собственно, и всё о моём любимом мультизагрузчике в варианте изложения для приверженцев MS Windows. Побольше любопытства, хладнокровия при операциях на MBR и - успехов!