Менеджер загрузки GNU GRUB

Автор: © Jaswinder Singh Kohli
Перевод: © Александр Михайлов.


Что такое менеджер загрузки?

Менеджер загрузки - это программа, которая располагается в начальных секторах диска, т.е. в MBR (Master Boot Record - Главная загрузочная запись) жесткого диска. После проверки системы в ходе загрузки, BIOS (Basic Input/Output System), передаёт управление MBR, если система настроена на загрузку отсюда. Затем выполняется программа расположенная в MBR. Эта программа называется менеджером загрузки. Её задача - передать управление операционной системе, которая продолжит процесс загрузки.

Существует множество менеджеров загрузки, включая GNU GRUB (Grand Unified Boot Loader), Bootmanager, LILO (LInux LOader), NTLDR (менеджер загрузки для систем на базе Windows NT), и т.д. Я решил обсудить GNU GRUB и его использование.

Что такое GRUB?

GRUB - это очень мощный менеджер загрузки, который может загружать множество операционных систем, таких как Windows, DOS, Linux, GNU Hurd, *BSD и т.д.

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

GRUB - синоним слова гибкость. Его последний релиз, 0.5.96.1, поддерживает ext2 ( файловую систему, используемую Линукс), FAT16 и FAT32 (используемые Win9x и ME), FFS (Fast File System (Быстрая файловая система) используемую *BSD UNIX), ReiserFS (новую журналируемую файловую систему, разработанную для Линукс и интегрированную в ядро Линукс 2.4.1), и minix (старую файловую систему, разработанную для ОС MINIX, также используемую ранними версиями Линукс). С GRUB, вы можете "заглянуть" внутрь этих файловых систем, даже не загружая операционной системы. Например, если вы хотите увидеть дату и время, сохранённые в текстовом файле, и у вас нет времени на загрузку всей операционной системы, вы можете использовать командную оболочку GRUB (строка с подсказкой "grub>") ,введите:

grub> cat (номер раздела)/home/god/filename.txt.

Вы увидете всё содержимое текстового файла, включая даты и время.

Лучшее свойство GRUB - то, что вы можете загрузить любое ядро на любом разделе, прямо в ходе начальной загрузки. Например, если вы забыли добавить только что скомпилированное ядро в список, вам скорее всего потребуется загрузиться, добавить его в список и затем перезагрузиться, чтобы использовать его. Но с GRUB, вы можете просто использовать командную оболочку и загрузить при помощи её желаемое изображение ядра.

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

ШАГ ПЕРВЫЙ: Компиляция и установка GRUB

Загрузите исходные коды GRUB с ftp://alpha.gnu.org/pub/gnu/grub.

Извлеките содержимое сжатого архива следующей командой "tar -xvzf имя_файла.tar.gz" В моём случая имя файла выглядело как grub-0.5.96.1.tar.gz, поэтому я ввёл:

# tar -xvzf grub-0.5.96.1.tar.gz

Эта команда извлекла множество файлов и директорий в директорию, названную grub-0.5.96.1
Теперь сделайте следующее:

[root@heaven ~/grub-0.5.96.1 ]# ./configure

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

[root@heaven ~/grub-0.5.96.1 ]# ./configure --help

Эта команда покажет вам все возможные опции. Теперь используйте префиксы --enable и --disable, чтобы добавить или убрать поддержку некоторых карт.

(ПРИМЕЧАНИЕ: GRUB поддерживает загрузку через сеть.)

Чтобы запустить процесс компиляции, введите:

[root@heaven ~/grub-0.5.96.1 ]# make

Чтобы установить все файлы в нужные места, введите:

[root@heaven ~/grub-0.5.96.1 ]# make install

Теперь вы готовы к установке GRUB.

Неплохо хранить все файлы GRUB, относящиеся к загрузке, в отдельной директории, такой так /boot/grub. Чтобы сделать это, проделайте следующие нехитрые манипуляции:

  1. По умолчанию, все файлы GRUB устанавливаются в /usr/share/grub/i386-pc или /usr/local/share/grub/i386-pc, в зависимости от того, как установлены ваши переменные окружения.
  2. Создайте новую директорию -- /boot/grub. Затем скопируйте следующие файлы в эту директорию.
  3. stage1
    stage2
    *_stage1_5
    

    Я объясню назначение этих файлов позднее. Также скопируйте исполняемый файл GRUB ( который может находится в /usr/sbin или /usr/local/sbin) в директорию /boot/grub.

Перед установкой GRUB, вам нужно знать, как GRUB понимает ваш жесткий диск и информацию о разделах. Прежде всего, счет начинается с 0, а не с 1. В Линукс, ваш первый жесткий диск, присоединённый к primary master контроллеру, называется "hda". В GRUB, он станет "hd0". Подобно этому, ваш первый привод для гибких дисков в GRUB носит имя "fd0". Таким образом первый, второй и третий раздел первого жесткого диска (hda1, hda2 и hda3), станут "hd0,0","hd0,1" и "hd0,2" в GRUB. ПРИМЕЧАНИЕ: запятая это неотъемлемая часть номенклатуры названий разделов в GRUB.

Чтобы объединить два поля (номер диска и номер раздела) в одно при помощи запятой, используйте круглые скобки. Например: (hd0,0) (hd0,1) (hd0,2) и так далее. (hd0,0) это первый раздел первого жесткого диска. Аналогично, (hd1,5) это шестой раздел на втором жестком диске и (hd2,0) это первый раздел на третьем жестком диске.

ШАГ ВТОРОЙ: Установка GRUB

Установку GRUB, можно разделить на три основных части:

  1. Установка "stage1" в MBR.
  2. Установка адреса или местоположения, "stage2".
  3. Настройка загрузочного меню или набора опций, чтобы выбрать, какую операционную систему загружать.

Начните установку GRUB со следующей команды:

[root@heaven /boot/grub ]# ./grub

Эта команда проверяет устройства, пытаясь угадать диски BIOS и выдать выходное сообщение. Это может занять много времени.

end_request: I/O error, dev 02:00 (floppy), sector 0

    GRUB  version 0.5.96.1  (640K lower / 3072K upper memory)

ПРИМЕЧАНИЕ: Хотя это может показаться удивительным, но GRUB поддерживает минимальное редактирование строки в стиле Bash. Для первого слова TAB выдаёт все возможные варианты завершения команды. В любом другом месте TAB выдаёт все возможные варианты завершения имени устройства/файла. Возможно вы будете удивлены такой возможностью.

Затем появляется нечто вроде этого:

grub> 

Я подразумеваю, что вы установили ваш Линукс дистрибутив в первый расширенный раздел первого диска или /dev/hda5. Помните соглашение о наименованиях в GRUB и переименуйте приведенное выше в (hd0,4). Введите следующую команду:

grub> install (hd0,4)/boot/grub/stage1 (hd0) (hd0,4)/boot/grub/stage2 p (hd0,4)/boot/grub/menu.conf

Теперь давайте рассмотрим эту команду более детально:

install
встроенная команда, которая приказывает GRUB установить (hd0,4)/boot/grub/stage1 на (hd0), в MBR.
(hd0,4)/boot/grub/stage2
говорит GRUB, где располагается изображение stage2.
p с последующими опциями: (hd0,4)/boot/grub/menu.conf
Устанавливает файл конфигурации для отображения красивых меню. Позднее мы обсудим структуру конфигурационного файла.

Мы также может обобщить синтаксис этой команды:

  1. install
  2. местонахождение_stage1
  3. куда_установить_install
  4. местонахождения_stage2
  5. p местонахождения файла конфигурации

Всё. Вы завершили основную установку на жесткий диск.

Установка на дискету:

Чтобы установить GRUB на дискету, вы должны знать команду 'dd' и как она работает. Для создания загрузочной дискеты с GRUB, вы должны разместить файлы stage1 и stage2 в начальных секторах дискеты.

Установка stage1 на дискету

Вставьте форматированую дискету в дисковод и введите:

[root@heaven /boot/grub ]# dd if=stage1 of=/dev/fd0 bs=512 count=1

И опять, рассмотрим команду в деталях:

if=входной файл
т.е., stage1
of=выходной файл
т.е., привод для гибких дисков (эта строка может отличаться для вашего компьютера)
bs=количество байт для чтения и записи
В нашем случае 512 байт.
count=сколько раз произвести эту операцию
Каждая новая итерация копирует следующие bs байт в место назначения.

Установка stage2 на дискету

[root@heaven /boot/grub ]# dd if=stage2 of=/dev/fd0 bs=512 seek=1

Всё аналогично команде для установки stage1, исключая новый ключ seek. Seek пропускает 1 блок из "bs" байт. Например в приведённой выше команде bs = 512, поэтому seek=1 пропустит первые 512 байт дискового пространства и продолжит с 513го байта. Это сохранит результат выполнения первой операции, т.е. первые 512 байт занятые stage1 не будут перезаписаны.

Всё, вы завершили основную установку на дискету.

ШАГ ТРЕТИЙ: настройка GRUB

Вы этой секции мы увидим, как загружать различные операционные системы и создать файл menu.conf.

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

  • A. Обычная загрузка путём вызова ядра.
  • B. Загрузка по цепочке или передача контроля другому менеджеру загрузки.

Процедура загрузки используя метод A:

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

Для загрузки Линукс, я храню своё ядро в /boot/ под именем bzImage, а моя корневая файловая система расположена на /dev/hda5, или (hd0,4) в GRUB. Поэтому моя процедура загрузки выглядит следующим образом:

  1. root (hd0,4)   [Это устанавливает корневой раздел]
  2. kernel /boot/bzImage root=/dev/hda5   [Это устанавливает ядро]
  3. boot   [Это запускает загрузку Линукс]

Процедура загрузки используя метод B (этот метод подразумевает, что у вас есть другой менеджер загрузки, например LILO или NTLDR, установленный в разделе.)

  1. Установите корневой раздел, но не монтируйте его.
  2. Активируйте этот раздел.
  3. Установите первый сектор устройства, которому будет передано контроль в случае загрузки по цепочке.
  4. Перезагрузитесь и проверьте его.

Давайте рассмотрим другую ситуацию, с Windows, установленным на /dev/hda1 или (hd0,0). Процедура загрузки Windows будет выглядеть следующим образом:

  1. rootnoverify (hd0,0)
  2. makeactive
  3. chainloader +1   [+1 устанавливает первый сектор текущего корневого раздела]
  4. boot   [передаёт управление и покидает GRUB]

Файл menu.conf, используется для загрузки нескольких операционных систем и построения меню. Написание menu.conf не представляет из себя особой сложности. Как вы сможете убедиться в этой секции, он использует чистый английский язык ;).

Все пункты меню начинаются с "title TITLENAME" (название ИМЯ) без запятых. Вы можете заменить TITLENAME на то что вам хочется.

Чтобы сделать меню для загрузки Линукс:

  1. Установите название (title).
  2. Установите корневой раздел.
  3. Установите ядро с правильными параметрами.
  4. Команда загрузки (boot).

Чтобы создать работающее меню:

title Debian GNU/Linux 2.2 kernel 2.4.1
root (hd0,4)
kernel /boot/bzImage.2.4.1
boot
#----

(Хэш (#) в начале строки, означает комментарий.)

Чтобы сделать меню для Windows или DOS:

title Windoze
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
#----

Что если вы хотите иметь две установленных версии Windows. Например, одну для себя и другую для вашей семьи, но вторая версия не хочет устанавливаться, сообщив вам, что Windows уже установлен?

Существует простой способ установки обоих версий, путем сокрытия одного из разделов во время загрузки и использования другого. Вы даже можете защитить вашу опцию, так, что никто не сможет по ошибке загрузить ваш раздел. Ниже описано, как создать две установки Windows, на hda1 и hda2 или (hd0,0) и (hd0,1), используя команды lock,password,hide и unhide.

Для Windows "My Entry (Мой Вход)":

title My Entry
lock
unhide (hd0,0)
hide (hd0,1)
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
#----

Чтобы эффективно использовать команду lock, вам нужно использовать команду password (пароль) в начале конфигурационного файла. У команды password следующий синтаксис: password secret ( secret - это пароль). В любое время вы сможете ввести пароль нажав p.

Для Windows "Family Entry (Вход для семьи)"

title Family Entry
unhide (hd0,1)
hide (hd0,0)
rootnoverify (hd0,1)
makeactive
chainloader +1
boot
----

Любой сможет загрузить этот пункт, так как для него не требуется пароль.

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

password secret

/boot/grub/secret-list.conf В этой команде, "secret" это пароль и /boot/grub/secret-list.conf это файл соответвующий паролю. Перед тем как сделать это, вам нужно указать корневой раздел или задать полный путь. Например:

password secret (hd0,4)/boot/grub/secret-list.conf

Одна из важнейших команд - это команда "map", которую вы можете использовать, когда у вас есть два жестких диска и операционная система, такая как Windows, которая не хочет грузиться с второго жесткого диска. Например: вы можете подменить hd0 на hd1 и hd1 на hd0. Другими словами, вы можете виртуально поменять местами два жестких диска и загрузить выбранную операционную систему. Ниже приведены необходимые команды:

grub> map (hd0) (hd1)
grub> map (hd1) (hd0)

Для загрузки FreeBSD:

title FreeBSD 4.0
root (hd0,4,a)
kernel /boot/loader
boot
#---- 

Здесь мы вызываем загрузчик FreeBSD. Вы можете видеть, что корневой раздел (hd0,4,a), имеет три аргумента, так как FreeBSD позволяет виртуальное разбиение одного раздела. Мы называем корневой раздел "a". Если FreeBSD полностью занимает второй жесткий диск на вашей системе, это будет корневой раздел (hd0,a). Вместо того чтобы вызывать ядро, мы вызывает загрузчик FreeBSD, с которым удобнее общаться чем с ядром.

(ПРИМЕЧАНИЕ: Я рекомендую, перед тем как испытывать OpenBSD и GNU/Hurd, потренироваться в осуществлении загрузки по цепочке)

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

Некоторые дополнительные команды GRUB:

default xx
где xx это пункт для загрузки по умолчанию.
timeout yy
где yy это время (в секундах) после которого будет загружен пункт по умолчанию.
fallback zz
где zz это пункт, который будет загружен после таймаута, если первый пункт не может быть загружен.
color
Эта команда используется для раскрашивания меню. Синтаксис таков: color обычный текущий_выбор. Оба поля могут иметь два значения в формате цвет_переднего_плана/цвет_фона. Например:
color green/black или light-gray/blue
Вы также можете использовать соответвующие номера.

ПОМНИТЕ: все значения начинаются с 0, поэтому 0 это первый вход.

В моей следующей статье, я планирую протестировать GNU/Hurd, OpenBSD и возможно некий вариант сетевой загрузки. Вам придется подождать как минимум 3 месяца, или даже больше, так как я буду сдавать в это время экзамены. Ждите.

Любые комментарии и сообщения об ошибках можно направлять мне jskohli@fig.org.


Copyright ї 2001, Jaswinder Singh Kohli.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 64 of Linux Gazette, March 2001