Загрузись с помощью GRUB!

Boot with GRUB
May 1st, 2001 by Wayne Marshall in Software

GRUB - это не название гусеницы, еды из ресторана быстрого питания или модного акронима в стиле GNU. GRUB - это GNU GRand Unified Bootloader.

И он действительно величайший из загрузчиков, способный загрузить любой Линукс, да и вообще практически любую операционную систему, проприетарную ли, опенсорсную ли, неважно.

GRUB не связан с какой-либо системой, наоборот, о нем можно думать как об очень маленькой и весьма специализированной по функционалу ОС. Основная цель ядра GRUB - распознавать файловые системы и загружать в память загрузочные образы, и для выполнения этих действий у него есть интерфейс, базирующийся на меню, а также интерфейс командной строки.

Интерфейс командной строки - весьма мощный и функциональный, с историей команд и автодополнением, как привыкли пользователи bash.

GRUB - обычный компонент мультизагрузочных систем, понимающий загрузочные образы всех Линуксов, BSD-систем, GNU/Hurd, BeOS, систем дяди Билла. Даже если ваш основной загрузчик - LILO, неглупым ходом будет иметь загрузочную дискету с GRUB, чтобы максимально быстрым и простым способом восстановить, например, убитую загрузочную запись диска (MBR).

Поэтому далее можно опустить рассуждения на тему "Почему GRUB" и перейти к экспериментам.

Установка

Как обычно, установка GRUB - двухстадийный процесс. Первая стадия заключается в сборке GRUB в своем рабочем системном окружении, и мы для этого будем использовать Линукс. Вторая стадия есть установка и настройка загрузчика в качестве основного для мультизагрузочной конфигурации.

Первый шаг обычен: загрузим исходники, растарим их и запустим ./configure, make, make install:

tar -xzvf grub-0.5.96.1.tar.gz
cd grub-0.5.96.1
./configure
make
make install

Будут собраны исполняемые файлы: grub, grub-install и mbchk; вспомогательные файлы установятся в /usr/local/share/grub/i386-pc/, также скопируются маны и информация GNU.

Для освоения второй стадии создадим загрузочный флоппи с GRUB. После того, как эксперименты в рамках песочницы на дискете станут привычными и понятными, можно устанавливать загрузчик в MBR основного диска. Даже если вы не станете устанавливать GRUB, наличие такой дискеты не помешает. Мало ли что.

Подготовка дискеты

GRUB распознает ряд различных файловых систем, включая Linux ext2fs, Reiser, MINIX, BSD's ffs, а также FAT, таким образом, можно получить загрузочную дискету, снабженную любой файловой системой из этого набора. В данном примере будем использовать FAT, поскольку это наименьший общий знаменатель и многие ОС могут читать/писать в FAT.

Поройтесь в своих корзинках для мусора в поисках неиспользуемых флоппи-дисков, один из которых даже может оказаться исправным, и отформатируйте найденное сокровище:

fdformat /dev/fd0
mkfs -t msdos /dev/fd0

Мы собираемся поместить ряд файлов на этот диск, поэтому смонтируйте его в ваше обычное место для монтирования флоппиков:

mount -t msdos /dev/fd0 /floppy

Далее создадим каталоги и поместим туда файлы GRUB:

mkdir -p /floppy/boot/grub
cp /usr/local/share/grub/i386-pc/stage* /floppy/boot/grub

Далее отмонтируем диск, но оставим его во флопповоде. Диск готов к последнему шагу: превращению себя в загрузочный, то есть мы перезапишем MBR дискеты.

Поскольку исполняемые файлы GRUB уже есть в системе, можем запустить командную оболочку GRUB. Выглядит, как на рисунке 1.

Рисунок 1. GRUB в режиме командной строки

Обсудим свойства оболочки немного позднее. Сейчас же выполним:

$ grub
grub> root (fd0)
grub> setup (fd0)
grub> quit

Эта последовательность команд завершит инсталляцию GRUB на дискету. Теперь она загрузочная и с ее помощью можно загрузить любую систему с вашего жесткого диска.

Демонстрация возможностей GRUB

Для демонстрации возможностей предоставим систему, на которой имеются:

Первый Hard Disk (SCSI, Linux /dev/sda):
Первый первичный раздел: Win98
Второй первичный раздел: Linux-Slackware
Третий первичный раздел: Linux-Debian
Четвертый первичный раздел: Linux Swap

Второй Hard Disk (SCSI, Linux /dev/sdb)
Первый первичный раздел: FreeBSD
Второй первичный раздел: OpenBSD
Третий первичный раздел: BeOS

Хотя GRUB и поддерживает загрузку из логических разделов, рекомендуется везде, где только можно, использовать первичные разделы. Файловые системы первичных разделов способны монтироваться из других операционных систем, в то время как кроссмонтирование логических разделов часто бывает под вопросом.

Тестовая система имеет два жестких диска с шестью различными операционными системами. Как вам должно быть известно, каждая ОС может иметь свою собственную номенклатуру названий блочных устройств. Например, инсталляция Slackware будет видна другому Линуксу, как система, установленная в раздел /dev/sda2, в то время как FreeBSD определит свой корень, как устройство /dev/da1s1a. Вам потребуется вкурить много справочной информации по поводу этого а-б-ц-д-ешного супа для создания любой мультизагрузочной системы такого рода.

Поскольку GRUB должен уметь загрузить любую из этих систем, он имеет свою собственную нейтральную систему именования разделов. Все жесткие диски - hd, все флоппи - fd, диски именуются числами начиная с 0, разделы именуются числами начиная с 0, полные имена блочных устройств выглядят как:

первый флоппик - (fd0)
раздел Win98 - (hd0,0)
Slackware - (hd0,1)
Debian - (hd0,2)

BSD системы делят свои партиции еще на так называемые слайсы и GRUB будет обращаться к корневому разделу FreeBSD как к (hd1,0,a).

Готовы к тесту? Поместите дискету во флопповод и перезагрузите систему. При указании флоппи в качестве первого загрузочного устройства мы должны увидеть что-то, подобное картинке на рисунке 1.

Для упражненьица загрузим Slackware. Введите следующие команды в приглашение командной строки GRUB:

grub> root (hd0,1)
grub> kernel /vmlinuz root=/dev/sda2 ro vga=791
grub> boot

Бадда-бинг, бадда-бум и Тукс появляется в левом верхнем углу экрана и Линукс разворачивается в памяти в своей очередной инкарнации.

Другой пример. Перегрузите систему и введите следующие команды в приглашение GRUB:

grub> rootnoverify (hd0,0)
grub> makeactive
grub> chainloader +1
grub> boot

Экран закрывается тучей и мы думаем, что допустили какую-то ужасную ошибку. А, это всего-навсего Windows. Помню, установил ее днем раньше.

Обратим на этот пример более пристальный взгляд. Когда грузим Slackware, нам требуется указать устройство, к которому GRUB должен получить доступ. Если устройство имеет файловую систему, которую понимает GRUB, он пытается смонтировать ее и передать успех монтирования следующей команде. На экране увидим:

grub> root (hd0,1)
Filesystem type is ext2fs, partition type 0x83

Далее, ядрышко GRUB должно получить спецификацию загрузочного образа. Аргументом команды ядра GRUB должно быть имя файла ядра Линукс, которое размещается на указанном разделе. Имя файла ядра также может быть указано в спецификации устройств GRUB:

grub> kernel (hd0,1)/vmlinuz

Команда ядра GRUB предоставляет весьма большую гибкость в именовании файлов, которые должны быть загружены. То, что показано выше, работает также хорошо:

grub> kernel /vmlinuz.old root=/dev/sda2 ro vga=ask
[Linux-bzImage, setup=0xe00, size=0xfad30]

Аргументы после имени ядра Линукс передаются этому ядру и не имеют отношения к GRUB. В данном примере ядро извещается о разделе, который несет корневую файловую систему в нотации, ожидаемой Линуксом. ro - только для чтения, пока не будет выполнена проверка файловой системы. vga=791 - специфичные для фреймбуфера ядра аргументы для правильного отображения дисплея.

Последняя команда - grub> boot.

Во втором примере, для Win98, демонстрируется так называемый цепочечный загрузчик. Этот метод загрузки ядер использует собственный загрузчик целевой ОС, который сам знает, как ему грузить свое ядро. Для передачи управления цепочечному загрузчику мы использовали:

grub> rootnoverify (hd0,0)
grub> chainloader +1

rootnoverify - команда, указывающая GRUB, что не требуется определять тип файловой системы. После этой команды GRUB не будет пытаться монтировать ее. Далее, цепочечный загрузчик будет использовать первый загрузочный сектор раздела для загрузки в память того, что он там обнаружит. Так грузятся ОС, которые в начало корневого раздела помещают собственные загрузчики. Иногда место для его записи и сам загрузчик называют PBR (от partition boot sector).

Наконец, команда makeactive выставляет флаг активности в таблицу разделов для указанного раздела, как требуют некоторые ОС, в данном случае Win98.

Оболочка GRUB не сложна для использования. Загрузите все свои системы несколько раз с помощью загрузочной дискеты с GRUB. Убедитесь, что все ваши ядра загружаются правильно. Эта информация (как именовать ядра и все такое) потребуется вам для правильного конфигурирования режима меню.

Но сначала попробуем еще несколько команд GRUB.

Команда help выведет информацию об около 40 разных команд GRUB-shell. Напечатайте help после указания конкретной команды, и вы получите помощь для этой команды. Например:

grub> help kernel

даст информацию о команде ядра GRUB - kernel.

Команда cat может быть использована для просмотра содержимого файлов. Например,

grub> cat (hd0,2)/etc/fstab

отобразит содержимое /etc/fstab для инсталляции Debian (для описываемой системы). Если обычный загрузчик загнулся, этот путь может быть полезным для просмотра различных конфигурационных параметров определенной ОС.

Подобно bash, стрелки вверх и вниз помогут вам перемещаться по истории команд GRUB-shell, а tab будет дополнять имена команд и имена файлов.

Наконец, можно вызвать специфический интерфейс меню, базирующимся на конфигурационном файле:

grub> configfile (fd0)/boot/grub/menu.lst

Эта команда переключит GRUB в режим меню с интерфейсом, определенном в файле menu.lst. Мы еще не создали его, но сейчас создадим.

Конфигурирование меню

Использование командной строки GRUB - это круто, однако после сотни стартов различных систем энтузиазм как-то слегка убывает. Требуется минимальная автоматизация. Интерфейс меню GRUB - полностью настраиваемый, так что бояться нечего.

Кроме выбора системы для загрузки меню (а точнее, его конфигурационный файл) предоставит нам такие возможности, как установка системы для загрузки по умолчанию после тайм-аута, выбор системы для загрузки, если очередная загрузка закончилась сбоем, переключение между режимами меню и командной строки, интерактивное редактирование меню, защита загрузчика паролем.

Когда GRUB загружается, он автоматически проверяет наличие файла /boot/grub/menu.lst на своем загрузочном устройстве. Если файл найден, загрузчик переходит в режим меню, как показано на рисунке 2.

Рисунок 2. Меню GRUB

Листинг файла меню /boot/grub/menu.lst:

# /boot/grub/menu.lst
# grub boot menu configuration

# general configuration:
timeout 10
default 0
fallback 2
fallback 4
color light-gray/blue red/light-gray

# boot stanzas follow
# each is implicitly numbered from 0
# in the order of appearance below

# (0) Debian (default boot):
title Debian [/vmlinuz]
root (hd0,2)
kernel /vmlinuz root=/dev/sda3 ro

# (1) Debian - runlevel 1
title Debian [/vmlinuz single]
root (hd0,2)
kernel /vmlinuz single root=/dev/sda3 ro

# (2) Debian-old (first fallback)
title Debian [/vmlinuz.old]
root (hd0,2)
kernel /vmlinuz.old root=/dev/sda3 ro

# (3) Debian-kernel testing
title Debian [/vmlinuz.test]
root (hd0,2)
kernel /vmlinuz.test root=/dev/sda3 ro

# (4) Slackware (second fallback):
title Slackware
root (hd0,1)
kernel /vmlinuz root=/dev/sdb2 ro vga=791 mem=256M

# (5) FreeBSD:
title FreeBSD
root (hd1,0,a)
kernel /boot/loader

# (6) OpenBSD:
title OpenBSD
# You would like to use:
##root (hd1,1,a)
##kernel --type=openbsd /bsd
# But openbsd passes bios & kernel parameters with
# its own bootloader, the first stage of which is
# installed in the partition boot record, and in
# turn calls /boot, which in turn loads kernel /bsd.
# So just use the GRUB chainloader instead:
root (hd1,1)
makeactive
chainloader +1

# (7) BeOS:
title BeOS
rootnoverify (hd1,2)
makeactive
chainloader +1

# (8) WinDoze
title Win98
root (hd0,0)
makeactive
chainloader +1

# end file menu.lst

Как мы видим, это довольно обычный для стиля UNIX конфигурационный файл, где строки после # являются комментариями и пустые строки игнорируются.

Первый набор команд задает основные конфигурационные параметры. Timeout устанавливает время в секундах для ожидания выбора пункта меню, после истечения загрузится система по умолчанию.
Команда default как раз и задает эту систему по умолчанию. Система описывается набором строк. Наборы именуются начиная с 0. Отображение систем идет в таком же порядке, в каком они указаны в конфиге.

Команда fallback задает систему для загрузки, если предыдущая загрузка завершилась сбоем. Можно задать более одной.

Команда color позволяет вдохнуть немного жизни в текстовое меню путем изменения цвета символов. Синтаксис команды цвета:

color foreground/background [ hilite-fg/hilite-bg ]

где фон и передний план должны быть выбраны из набора цветов black, blue, green, cyan, red, magenta, brown и light-gray; dark-gray, light-blue, light-green, light-cyan, light-cyan, light-red, light-magenta, yellow и white.
Среди этих цветов только первые восемь используются для фона. hilite-fg/hilite-bg пара определяет, как будет выглядеть выбранный пункт меню.

Далее идут наборы строк для загружаемых систем, по одному набору на систему. Title определяет название системы и как она будет отображаться в меню. Различия с командной строкой - в наборах нет команды boot. Она выполняется автоматически.

Этот пример охватывает лишь некоторые из возможностей GRUB. Помимо загрузки обычных систем, вы можете загружать ядра для восстановления, тестовые ядра, ядра с различными опциями и так далее.

По сути дела, конфигурационный файл GRUB весьма схож с конфигурацией LILO. Кроме того, после некоторого освоения GRUB-shell создать простую конфигурацию должно быть относительно несложно. Не беспокойтесь о совершенстве первого опыта; вы быстро убедитесь, что изменения можно вносить быстро и интерактивно и GRUB-shell всегда доступен в любом режиме.

После создания конфигурации, смонтируйте GRUB-дискету вновь и скопируйте файл в нужную локацию:

cp mygrub.conf /floppy/boot/grub/menu.lst

Теперь при загрузке с дискеты вы увидите (бинго!) меню, как на рисунке 2. Подождите timeout секунд и система по умолчанию загрузится самостоятельно. Или используйте клавиши стрелок для перемещения на нужную позицию, где потребуется нажать Ввод. Или нажмите "c" для перехода в командный режим. Из командного режима обратно в меню можно перейти нажатием клавиши Esc.

Редактировать записи меню тоже можно. Это позволит изменить или добавить некоторые опции перед собственно загрузкой. Эти изменения будут иметь значение только в данной сессии. Для закрепления их потребуется изменить конфигурационный файл.

Испытывайте свою конфигурацию с дискеты, пока она вас совершенно не удовлетворит. Затем можно прожечь загрузчик на жесткий диск.

Установка на жесткий диск

Операции с жестким диском по установке GRUB в целом такие же, как и для установки на флоппи-диск. Разница в том, что на дискете все ресурсы, нужные GRUB, находятся тут же. Это всего-навсего каталог с файлами и загрузочная запись в MBR дискеты. При установке на жесткий диск вы должны решить, где будут располагаться эти ресурсы.

Например, вы можете расположить каталог /boot/grub на первом первичном разделе первого диска и скопировать все нужные файлы туда, как в случае с дискетой. В нашем модельном случае этот раздел будет содержать установку Win98. Но вы можете также установить каталог /boot/grub вообще на любой раздел системы, лишь бы была файловая система, о которой знает GRUB. На практике обычно располагают файлы в наиболее стабильном разделе, не в том, который переустанавливается через день.

В нашем примере мы будем использовать раздел с установкой Slackware. Создадим каталог /boot/grub, скопируем туда нужные файлы (они у нас лежат в /usr/local/share/grub/i386-pc). Созданный файл конфигурации меню поместим туда же.

Запустим оболочку GRUB (или загрузимся с помощью нашего флоппи в командном режиме). В приглашении оболочки выполним следующее:

grub> root (hd0,1)
grub> setup (hd0)
grub> quit

Собственно, все. Теперь наша система полностью оGRUBлена, с учетом перезаписи MBR. Перегрузимся и убедимся в работоспособности меню.

Несколько слов об этих командах установки. Первая,

root (hd0,1)

говорит GRUB смонтировать это устройство. Все файлы теперь имеют пути относительно этого устройства.

Вторая команда,

setup (hd0)

это упрощенный интерфейс к программе установки GRUB. Здесь мы указываем устройство - носитель MBR, то есть весь первый жесткий диск, а не первый раздел этого диска. Ваш технический писатель может допустить такую ошибку, вы же нет, так как различие критично. Каждый раздел имеет бут-сектор, но не в каждом размещение первичного загрузчика приведет к нужному результату. Главная загрузочная запись, MBR, считывается в память BIOS-ом машины, то есть при каждой загрузке. Ее то нам и надо.

Когда GRUB устанавливает себя на устройство, он в первую очередь копирует небольшой кусок себя в MBR. Этот участок кода может вызвать stage1. Когда управление передано stage1, уже имеется достаточно информации о том, откуда и как загрузить следующую стадию. Файлы найдутся в каталоге /boot/grub на уже смонтированном разделе.

Для проверки этой установки просто измените какие-нибудь параметры в /boot/grub/menu.lst . Любые изменения немедленно отразятся на следующей загрузке.

Исправление ошибок

Если испорчена MBR, можно восстановить загрузочную запись DOS. Для этого используется команда:

A:> FDISK /MBR

с загрузочной дискеты DOS.

Если испорчен загрузчик ОС, например, вы переписали по ошибке PTR, нужно восстановить сектор раздела средствами ОС. Например, для Win98 это делает команда

A:> SYS C:

опять-таки с загрузочной дискеты.

Другие ОС как правило тоже имеют средства для восстановления своих загрузочных записей. Для FreeBSD, например, нужно смотреть маны boot0cfg(8), для OpenBSD - installboot(8).

Много информации об ошибках GRUB и методах борьбы с ними содержит статья по адресу:

http://wiki.ru.unix-like.info/Некоторые_часто_встречающиеся_ошибки_GRUB

Заключение

Как и многие другие проекты GNU, GRUB имеет ряд недокументированных возможностей, среди которых, например:

* Ремапимнг дисков и манипуляция скрытыми разделами

* Сетевая загрузка с помощью BOOTP и DHCP для поддержки мультизагрузочных схем через сеть

* Ремапинг клавиатуры, прямой доступ к геометрии диска, чтение памяти, тесты портов ввода/вывода и процессора, поддержка декомпрессии некоторых форматов

GRUB находится в фазе активной разработки, так что полезно почитать документацию GNU.


Документация GRUB 2
Назад