Приведенный список команд не полон, но более подробное обсуждение было бы слишком объемным, тогда как еще не рассмотрены команды, с помощью которых, собственно, и выполняются варианты загрузки. Эти же команды являются основным содержанием конфигурационного файла. Файл этот называется menu.lst и располагается все в том же /boot/grub. В начале файла обычно размещаются команды задания цветов:
color light-gray/blue black/light-gray
Первая пара цветов определяет основной и фоновый цвета для "не выбранных" позиций меню, вторая - для "выбранных".
Время (в секундах) от момента вывода меню до выполнения позиции, определенной, как "умолчание", задается командой:
Позиция "по умолчанию" задается, как:
Если загрузка "по умолчанию" по какой-либо причине невозможна, то будет предпринята попытка выполнить позицию, указанную в команде:
Цифры, определяющие позицию меню, могут быть, разумеется, любыми. Обратите внимание только на нумерацию - с нуля.
Описание каждой из позиций меню начинается с команды:
где text - остаток строки от первого "непробельного" символа после title.
Группа команд одной позиции меню в обязательном порядке имеет уже упомянутую команду root. ОС, хотя бы частично соответствующие Multiboot Specification, загружаются командой kernel, причем в строке можно указывать дополнительные параметры. Так, команда
kernel (hd0,6)/boot/vmlinuz-up root=/dev/hda7 hdd=ide-scsi
vga=788
загрузит Linux, корневым каталогом назначит /dev/hda7, включит эмуляцию ide-scsi, нужную для пишущего привода CD и переведет видеоадаптер в режим 800х600 графической консоли, для работы с так называемым frame buffer device.
Для ОС, не соответствующих Multiboot Specification, сначала взводится бит "активности" раздела, выбранного командой root:
а, затем, методом "цепочки" загружается собственный загрузчик данной ОС:
Поскольку ОС семейства win'9x не могут быть загружены из соседних разделов (вне зависимости от флага активности грузится все равно первый из разделов), для их загрузки нужно использовать команды hide и unhide. Так, если первый и второй первичные разделы содержат win'9x, то для загрузки второй системы нужно включить в menu.lst следующие команды:
hide (hd0,0)
unhide (hd0,1)
root (hd0,1)
makeactive
chainloader +1
Аргументы hide, unhide и root для загрузки первой системы, думаю - очевидны.
Еще одна трудность с ОС от MicroSoft - неспособность грузиться со второго и последующих дисков. Для ее преодоления применяют технику "свопирования" (swapping technique), или, проще - "подмены". Так же, собственно, поступает и BIOS Setup, но зачем же обращаться к нему, если всего две строки в menu.lst выполнят ту же операцию:
map (hd0) (hd1)
map (hd1) (hd0)
Во всех случаях не лишним будет сначала загрузиться с дискеты, запустить grub и проверить, соответствует ли результат выбранных команд ожидаемому. В командном режиме существует специальная команда, загружающая созданный menu-файл:
configfile FILE
Еще один совет - для начала инсталлировать GRUB на дискете. Скорость загрузки с дискеты радует, что, собственно, и не удивительно: общий объем загружаемых файлов - менее 100 кбайт.
Ну, и последняя рекомендация, содержащаяся в инструкциях абсолютно ко всем менеджерам загрузки: до инсталляции нового менеджера загрузки сохраните MBR! В unix это можно сделать командой:
dd if=/dev/hd0 of=your_file bs=512 count=1
в DOS - с помощью Norton DiskDoctor например.
Сравнительный анализ различных менеджеров загрузки выходит за рамки данной статьи, но даже без такого анализа можно, наверное, согласиться, что "GRand" - вполне заслуженный титул для рассматриваемого пакета. GRUB - даже больше, чем "unified bootloader". Дискета с ним позволит проанализировать разделы потерявшего способность к загрузке винчестера, загрузить любой из первичных разделов или любое из ядер Hurd, FreeBSD, NetBSD, OpenBSD или Linux. Возможно и более "изощренное" вмешательство в структуру разделов диска, но это, пожалуй, уже другая тема.
Введение для подоконников
Зачем?
Как-то "сложилось по жизни", что на IBM PC мне всегда требовалось более одной операционной системы. Сама архитектура этого компьютера такую мультизагрузку вполне допускает, род моих занятий - программист, так что особых проблем упомянутая потребность не вызывала. В тех же случаях, когда подобная мультизагрузка требовалась кому-то ещё, я рекомендовал xboot Ильи Евсеева. С приходом 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, укладывается в сравнительно небольшое число постулатов:
* загрузка IBM PC всегда начинается с переноса в память содержимого нулевого блока загрузочного устройства (HDD, FDD, CDROM - как уж в BIOS Setup задано) и передачи на него управления. Размер блока - всего 512 байт и для всех устройств, кроме HDD, ничего, кроме инструкций загрузки следующей порции кода, в нём не содержится;
* HDD же, по замыслу создателей IBM PC, может иметь несколько загружаемых разделов. Поэтому часть главной загрузочной записи (master boot record - MBR), как уважительно назвали нулевой блок винчестера, отведена под таблицу разделов (Partition Table);
* таблица эта содержит описание не более чем четырёх первичных (primary) разделов, причём только один из них может быть расширенным (extended), в котором, в свою очередь, могут содержаться свои разделы. Эти разделы, в отличие от разделов первичных, называются логическими. Число логических разделов не ограничено;
* описание каждого первичного раздела, кроме данных о его физическом размещении, содержит пару весьма существенных байт: байт активности (загружаемости) раздела и байт типа файловой системы. Первый из этих двух байт принимает всего два значения: 0x80 или 000 (для загружаемого и не загружаемого разделов, соответственно). Типов же файловых систем существует значительно больше. Современному приверженцу MicroSoft достаточно знания следующих:
o 004 - FAT16, объёмом менее 504 MB
o 005 - расширенный раздел, заканчивающийся ниже 8 GB
o 006 - FAT16, объёмом менее 2 GB, заканчивающийся ниже 8 GB
o 007 - Windows NT NTFS
o 00B - FAT32, заканчивающийся ниже 8 GB
o 00C - FAT32, заканчивающийся выше 8 GB (как 00B, но для LBA)
o 00E - FAT16, объёмом менее 2 GB, заканчивающийся выше 8 GB (как 0х06, но для LBA)
o 00F - расширенный раздел, объёмом более 8 GB или заканчивающийся выше 8 GB (как 0х05, но для LBA)
o 0xFF - таблица дефектных блоков Xenix
Типы 00B .. 00F в настоящее время - преобладающие, как преобладающий способ адресации блоков диска - LBA.
Тип "таблица дефектных блоков Xenix" используется для "маскировки" разделов, а зачем такая "маскировка" нужна, станет ясно чуть позднее;
* прибавление 0x10 к идентификатору типа раздела делает его "скрытым" (hidden). Правда, на эту "скрытость" MicroSoft перестала обращать внимание, начиная от win'2000.
* исполняемый код MBR, в отличие от таблицы разделов, не стандартизирован и разные ОС относятся к нему по разному: некоторые при инсталляции переспрашивают, можно ли перезаписать MBR, а некоторые - нет. Младшие MS Windows - нет. Спасибо, хоть таблицу разделов не затирают. Отсюда вывод: MBR нужно уметь сохранять, восстанавливать, а лучше - формировать заново;
* и, наконец, схема загрузки, исповедуемая MicroSoft. Порядок изложения - "обратный". То есть, от загрузки собственно ОС до операций BIOS, выполняемых по включению компьютера:
o ОС загружается начальным загрузчиком, записанным в нулевой блок первичного раздела, в который инсталлировалась ОС (в отличие от MBR, он уже не "master", а просто "boot record"). Начальный загрузчик записывается ОС при инсталляции;
o начальный загрузчик, в свою очередь, загружается главным загрузчиком (тем, что записан в MBR);
o код главного загрузчика, записываемый в MBR ОС MicroSoft, бесхитростен: найти в таблице разделов первый из загружаемых первичных, считать в память его начальный загрузчик и передать на него управление;
o ну, а главный загрузчик, если помните, считывается в память самим BIOS.
В случае с NT в результате описанных выше действий запускается не ОС, а NTLoader - собственный мультизагрузчик NT.
Действия над MBR, выполняемые ОС при инсталляции (в том случае, если MBR всё-таки переписывается, разумеется), таковы:
o переписать исполняемый код MBR;
o установить бит загружаемости (активности) раздела, в котором инсталлируется ОС, сбросив его при этом у всех остальных первичных разделов.
В принципе, из вышеизложенного уже можно догадаться, что нужно сделать для достижения поставленной задачи:
* инсталлировать первую систему, не занимая ею всё дисковое пространство, разумеется;
* "маскировать" первую систему;
* инсталлировать вторую систему;
* при желании: таким же образом - третью;
* "демаскировать" все установленные системы;
* инсталлировать мультизагрузчик.
С помощью чего?
Теперь осталось выяснить: как конкретно это сделать. Переходим к инструментарию. Существует довольно много программ, с помощью которых можно редактировать MBR и, в частности, таблицу разделов. Большинству пользователей MS Windows наверняка известен Norton Disk Doctor, доживший уже до девятой, если память не изменяет, версии.
Список известных мультизагрузчиков тоже не так уж мал. А вот продукт, достаточный сам по себе для решения поставленной задачи, известен мне только один. Это GRUB - GRand Unified Bootloader. Изначально, автор - Erich Boleyn, а в настоящее время проект развивается как часть GNU - известного "бастиона" Open Source. Именно на сайте этой уважаемой организации находится страничка GRUB:
http://www.gnu.org/software/grub, а на её ftp-сервере всегда можно скачать последнюю версию пакета.
GRUB, безусловно, достоин отдельного разговора, но для наших "минималистских" целей достаточно будет рассказать о пяти-шести из почти шести десятков его команд - да простят меня авторы. Приверженцам MicroSoft я даже скачивать дистрибутив GRUB не рекомендую: проще воспользоваться его загрузочной дискетой, подготовленной мной специально для них на дискете в формате FAT (подобная дискета входит и в состав дистрибутива, только файлов на ней, не имеющих отношения к ОС от MicroSoft, много больше и прочитать её под DOS/Windows - затруднительно). Архивированный образ дискеты лежит здесь, а получить из образа дискету можно с помощью замечательной программы rawwrite, которую, пользуясь случаем, я настоятельно всем рекомендую. Размер архива - очень скромный - чуть более 50кБ.
Приступим!
Вот мы и "во всеоружии". Начали:
* описание инсталляции ОС пропустим: разные они, да и не об этом речь. Замечу только, что первичный раздел для устанавливаемой ОС лучше готовить её же средствами: практически никаких шансов ошибиться. Поскольку, по мнению fdisk-a от MicroSoft (а именно он разбивает диск на разделы) первичный (primary) раздел может быть только один, то придётся с этим для начала согласиться. Размер раздела выберите минимально достаточным. Расширенный раздел можно пока не создавать;
* убедившись в работоспособности первой инсталлированной системы, загрузимся с дискеты GRUB. Если дискета оригинальная, то Вы сразу попадёте в командный режим (на это укажет подсказка "grub>"), а если воспользовались моим предложением, то на экране появится меню загрузки. С меню разберёмся позднее, а для перехода в командный режим нужно нажать "с", о чём, кстати, напоминает и присутствующая на экране подсказка. Набираем:
где <Tab> - подразумевает нажатие клавиши табуляции.
В ответ на это вы получите варианты продолжения команды. Если у вас только один винчестер, то вариантов будет всего два: fd0 и hd0. Отмечаем: так называются и нумеруются (с нуля!) в GRUB дисковые устройства. Продолжим набор в соответствии с нашим планом:
В ответ мы получим перечень разделов диска, выбор из которых возможен. Поскольку раздел у нас пока один, то и в перечне только одна позиция. Нажимаем <Esc>, поскольку продолжать команду не нужно: всё проделанное было нужно лишь для того, что бы, заставляя GRUB выполнять автозаполнение команды, "выудить" у него информацию о разделах. Что и достигнуто. Запоминаем (лучше - записываем), что первая ОС инсталлирована в разделе (hd0,0) (нотация - GRUB), и тип её - 00b, например (у Вас, разумеется, может быть другой). Переходим к следующему пункту;
* "маскируем" первую систему командой:
grub>parttype (hd0,0) 0xff
Это уже нормальная команда и завершать её нужно вводом Enter. Если Вы ещё не догадались, то скажу, что таким образом мы поменяли байт-идентификатор типа файловой системы раздела на 0xff. С этого момента вполне нормальная система будет видеться всеми прочими, как нечто абсолютно чуждое (даже Xenix, которого все прочие будут полагать создателем этого раздела, посчитает её списком дефектных блоков);
* инсталлируем следующую систему. Инсталлятор, конечно, обнаружит на диске некоторый "Non-DOS partition", но препятствием к инсталляции это не будет. Хорошо также и то, что инсталлируемая ОС никак не модифицирует чужой раздел: спасибо MicroSoft хоть за это. Все рекомендации аналогичны приведённым для первой инсталляции;
* если Вам понравилось, то аналогичным образом Вы можете установить и третью систему, предварительно "замаскировав" вторую. А вот четвёртый раздел рекомендуется всё же сделать расширенным - пригодится. На этом этапе - самое время;
* теперь разделы можно "демаскировать". Быть может, это и лишнее, но напомню, что делается это командой:
grub>parttype (hd0,n) 0xNN
где n - номер демаскируемого раздела, а 0xNN - действительный тип его файловой системы (я надеюсь, Вы ещё не потеряли бумажку с записями об этом). Нетрудно догадаться, что после "демаскирования" грузиться будет всегда система, инсталлированная последней. Большего от кода в MBR добиться не удастся: пора переходить к подготовке мультизагрузки;
* у GRUB есть одно достоинство: меню допустимых загрузок и их алгоритмы хранятся в обычном текстовом файле. Это, безусловно, достоинство, поскольку позволяет изменять загрузку, модифицируя всего лишь один очень небольшой текстовый файл, но, как и многие достоинства, это тоже имеет свою "оборотную сторону". Состоит эта "сторона" в том, что этот самый файл должен находиться в разделе, файловую систему, которой умеет "читать" GRUB. Список читаемых файловых систем довольно обширен, да вот только NTFS в него не входит. Отсюда вывод: всё нужное для GRUB нужно размещать в разделе FAT. Надеюсь, хоть один такой у Вас имеется. Создаём в его корневом каталоге подкаталог boot/grub (не обращайте внимания на "косые": GRUB не обращает внимания на то, прямые они или обратные - и мы не будем) и переписываем в него файлы из аналогичного подкаталога дискеты. Заметьте, на котором из разделов находится этот подкаталог;
* опять загружаемся с дискеты GRUB (хорошо, что времени на это требуется заметно меньше, чем для загрузки, скажем, DOS) и выполняем следующие команды:
grub>root (hd0,n)
grub>setup (hd0)
где n - номер раздела, в котором находится подкаталог boot/grub.