9.1.1. Начальная загрузка: LILO и GRUB
9.1.1. Начальная загрузка: LILO и GRUB
Общие механизмы
Как известно, первая программа, которая выполняется после включения компьютера, — это BIOS. Она находит загрузочное устройство, считывает в память его первый (нулевой) сектор и передает на него управление. В этом секторе находится MBR (Master Boot Record) — главная загрузочная запись размером в 512 байт, в которой помещаются:
? первичный загрузчик;
? таблица разделов диска (Partition Table) размером в 64 байта, описывающая четыре первичных раздела: номера их первого и последнего цилиндров, тип файловой системы и признак активности раздела;
? «волшебное число» (0xAA55), предназначенное для проверки, служит ли данный сектор загрузочным.
Формат MBR стандартен для всех операционных систем, а содержание области, отведенной под первичный загрузчик, может различаться. Этот загрузчик очень мал, поэтому перед ним стоит всего одна задача: найти на диске и считать в память код загрузчика следующего этапа, разворачивающего уже саму операционную систему, и передать ему управление.
В ОС Windows 9x первичный загрузчик передает управление на Boot Record — первый сектор того первичного раздела, который отмечен как активный (bootable — такой может быть только один). В более сложных системах из MBR запускается диспетчер загрузки (NTLoader для Windows NT, LILO и GRUB — для Linux), позволяющий выбрать вариант загрузки и даже загружаемую ОС. Такую гибкость диспетчеру обеспечивает возможность не ограничиваться тем объемом данных, который помещается в MBR, а читать необходимые данные из файлов на диске. Достигается эта гибкость ценой зависимости от файловой системы: существуют файловые системы (например, XFS и ReiserFS с включенным режимом оптимизации дискового пространства), с которыми ОС Linux может работать, но загружаться с них не может. Отдельный раздел /boot, о котором говорилось в п.1.2.2 в связи с «барьером 1024 цилиндра», необходим еще и поэтому: на нем должна быть создана файловая система ext2fs или ext3fs, а для всех остальных разделов файловые системы можно выбирать произвольно.
Загрузчик LILO
Стандартный загрузчик Linux — LILO (LInux LOader) — состоит из двух частей: первичного загрузчика LI и вторичного LO. LI располагается в MBR и только и умеет, что загружать LO, а тот уже передает управление ядру или вызывает другой первичный загрузчик (например, Windows 9x). LO находится в файле на диске (по умолчанию /boot/boot.b). О файловых системах LI не знает, поэтому карта размещения этого файла хранится в нем в виде «цилиндр/головка/сектор». Помещает ее туда утилита /sbin/lilo, которую нужно запускать после любого изменения LO или его конфигурационного файла /etc/lilo.conf.
У вторичного загрузчика LO есть собственная карта размещения файлов (по умолчанию /boot/map). По ней он ищет загружаемое ядро и образ виртуального диска, поэтому после любого изменения ядра или загружаемых модулей тоже обязательно запускать утилиту lilo.
Что такое виртуальный диск? Представьте себе загрузку Linux со SCSI-диска или другого устройства, драйвер которого не вкомпилирован в ядро, а подгружается в виде модуля. LILO сможет найти и прочитать с него файл образа ядра. Теперь ядру предстоит смонтировать корневую файловую систему. Чтобы сделать это, нужно подключить драйвер SCSI, а чтобы найти драйвер в /lib/modules, нужно смонтировать корневую файловую систему.
Похожая проблема возникает при первоначальной установке ОС Linux: для работы инсталлятора нужна файловая система со стандартными утилитами, а на диске ее еще нет. Обе проблемы решаются в Linux с помощью технологии initrd (INITial Ram Disk): вместе с ядром LILO загружает в память образ стартового диска, и ядро монтирует его как обычную файловую систему. В этой файловой системе находятся модули, необходимые для работы с нестандартными внешними устройствами и сетью, и утилиты для их подгрузки. Подключив модули, ядро отсоединяет виртуальный диск и монтирует настоящую корневую файловую систему.
Файл образа виртуального диска обычно называется /boot/initrd-<версия_ядра>. Если нестандартных устройств у вас нет или их драйверы встроены в ядро, то этот файл для загрузки не нужен.
Поведение LILO зависит от настроек в его конфигурационном файле /etc/lilo.conf. Ниже приведен пример такого файла. Символ #, как обычно, служит для комментариев.
Листинг 9.1. Примерный файл /etc/lilo.conf
# LILO version: 21.5
# Общий раздел
#
# использовать MBR первого жесткого диска первого
# контроллера IDE
boot=/dev/hda
#
# Карта LO
map=/boot/map
#
# Файл вторичного загрузчика
install=/boot/boot.b
#
# Режим для загрузочных дискет. У меня закомментирован.
# compact
#
# Режим VGA: normal - 80x25, ext - 80x50
vga=normal
#
# Раскладка клавиатуры
keytable=/boot/ru4.kit
# Диск поддерживает режим LBA (Large Block Access) —
# трансляцию
# физических адресов в логические так,
# чтобы число цилиндров не превышало
# понятных BIOS 1024. Другое значение этого
# параметра - linear. Не меняйте значения, выставленного
# инсталлятором, если вы не знаете точно, что делаете.
lba32
#
# Сообщение, которое выдается при загрузке
message=/boot/message
#
# Задержка 5 секунд (в других версиях LILO этот параметр
# называется delay)
timeout=50
#
# Вывести message и приглашение
# к выбору загружаемого ядра на
# timeout/10 секунд, после которых загружается ядро,
# выбранное по умолчанию.
# Если prompt не установлен, добиться приглашения
# можно, удерживая <Shift> во время загрузки.
prompt
#
#Цветовая схема
menu-scheme=wb:bw:wb:bw
#
# Ядро, загружаемое по умолчанию. Если не указано, то
# загружается первое в списке
default=Fedora
#
# Список вариантов загрузки, не более 16.
# В каждой секции варианта должна быть строка
# label. Это имя, которое вводится в ответ на приглашение
# LILO или является командой меню и служит для выбора
# загружаемого ядра или ОС.
#
image=/boot/vmlinuz-2.4.20 # ядро
label=linux-initrd # метка
initrd=/boot/initrd-2.4.20.img
root=/dev/hda6 # монтировать этот раздел как корневой
read-only # режим монтирования / на время загрузки
#
image=/boot/vmlinuz-2.6.9-1.667
label=Fedora
root=/dev/hda2
read-only
#
image=/boot/vmlinuz
label=failsafe
root=/dev/hda6
append=" mem=64M failsafe" # параметры, передаваемые ядру
read-only
#
other=/dev/hda1 # ОС - не Linux
label=WindowsXP # root не указывается
table=/dev/hda # где находится таблица разделов
Если вы определили секцию other=/dev/hda1, то в корневом каталоге раздела /dev/hda1 (диска С:) должен находиться вторичный загрузчик. У меня, например, на одном из компьютеров с много вариантной загрузкой там находится NTLoader (поскольку WindowsXP была установлена до Linux), и LILO успешно загружает WindowsXP.
Команда append позволяет передать ядру необходимые параметры. Ее формат:
append=" параметр1[=значение1][, значение2...] [параметр2[=значение3][,значение4...]...]"
Значения разделяются запятой без пробелов, параметры разделяются пробелами. Например, у вас есть устройство CD-RW, которое вы до сих пор использовали как обыкновенный CD-ROM, подключив его как Secondary Slave, то есть /dev/hdd. Чтобы записывать компакт-диски под Linux, CD-RW должен быть устройством SCSI, значит, это устройство нужно эмулировать. Команда выглядит так:
append=" hdd=ide-scsi "
Не забудьте после каждого изменения конфигурационного файла запустить утилиту lilo. Некоторые ее полезные ключи:
? -V — показать версию LILO;
? -q — показать текущую карту загрузки;
? -t — проверить lilo.conf на ошибки;
? -u — удалить LILO. После удаления вы сможете загрузить Linux только с внешнего носителя (дискеты).
Если вы решили пока не удалять LILO, то при очередной загрузке системы вас встретит приглашение LILO. Нажмите <Ввод>, чтобы загрузить вариант по умолчанию. Нажмите <Tab> для просмотра вариантов. Иногда на экран выдается только подсказка:
LILO
Чтобы выбрать ядро, нужно нажать клавишу «Shift», после чего появится подсказка:
LILO boot:
и только теперь можно нажать <Tab>. Если вы введете команду help, то получите список всех команд LILO.
Чтобы загрузиться в однопользовательском режиме (например, для восстановления системы после аварии), введите в строке приглашения:
<метка_варианта> single
Если вы переустановили Windows, а она заменила вам содержимое MBR, то восстановить его можно, загрузившись с дискеты или компакт-диска и введя команду lilo. Таким же образом можно установить LILO, если при инсталляции системы вы выбрали другой диспетчер загрузки.
Любопытно, что четыре буквы приглашения LILO — это отметки об успешном окончании четырех шагов загрузки. Если вы видите меньше четырех букв, то это значит:
? L<xx>: первичный загрузчик запустился, но не смог загрузить вторичный. Двузначное число xx — это код ошибки. Обычно причина ошибки — аппаратный сбой.
? LI: LI смог загрузить вторичный загрузчик, но не смог передать ему управление. Причина: перемещение /boot/boot.b без запуска утилиты lilo. Чаще всего это значит, что вы удалили или добавили раздел.
? LIL: LO запустился, но не смог прочитать карту размещения файлов. Аппаратный сбой.
? LIL?: LO загрузился по неправильному адресу. Причина — перемещение /boot/boot.b без запуска утилиты lilo.
? LIL-: испорчена карта размещения файлов. Причина — перемещение /boot/map без запуска утилиты lilo.
? Еще одной причиной любой из этих ошибок может быть неправильное указание геометрии диска (несовпадение ее с фактической).
Загрузчик GRUB
Другой известный диспетчер загрузки — это набирающий все большую популярность GNU GRUB (GRand Unified Bootloader). В дистрибутивах Mandrake и Fedora Core этот загрузчик используется по умолчанию, хотя я рекомендую вам сменить его на проверенный временем LILO.
GRUB использует несколько отличную от LILO схему загрузки. Вторичный загрузчик хранится не в каком-то файле, а в не используемом системой пространстве. Обычно это вся первая дорожка диска. Если места для полноценного вторичного загрузчика там недостаточно, туда помещается маленький загрузчик промежуточного этапа, «полуторный», состоящий из драйвера файловой системы и инструкций для вызова настоящего, большого, вторичного загрузчика. Благодаря такой организации GRUB поддерживает большинство файловых систем (FAT и FAT32, ext2fs и ext3fs, ReiserFS, XFS, BSD FFS), понимает большинство форматов исполняемых файлов и — не главное, но самое заметное для начинающего системного администратора, — изменения в конфигурационном файле вступают в силу сразу же, без прописывания их в специальном месте специальной утилитой.
Конфигурационный файл GRUB называется /boot/grub/grub.conf. В мгновенно устаревающих руководствах вы можете встретить другое название — /boot/grub/menu.1st — но это не страшно: этот файл является символической ссылкой на первый. Пример такого файла приведен ниже.
Листинг 9.2. Примерный файл /boot/grub/grub.conf
#boot=/dev/hda
default=0
fallback=1
timeout=5
splashimage=(hd0,1)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.9-1.667)
root (hd0,1)
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/hda2
initrd /initrd-2.6.9-1.667.img
title WindowsXP
rootnoverify (hd0,0)
chainloader +1
Закомментированная команда boot указывает загрузочный диск. Команда default говорит, какая метка (title) будет загружена по умолчанию, а fallback — какая система будет загружена в случае неудачи. Команда timeout указывает время (в секундах) ожидания ввода команды или выбора другой операционной системы.
Команда splashimage указывает, какой рисунок будет использован в качестве фона. Если у вас что-то не ладится с видеорежимом, закомментируйте это строку.
Труднее всего смириться с тем, как GRUB именует жесткие диски и их разделы. Диски отсчитываются не с буквы «а», а с нуля, а разделы — не с единицы, а тоже с нуля. Таким образом, раздел, который Linux именует /dev/hda1, a Windows — С:, GRUB называет (hd0,0). Круглые скобки обязательны.
Команда rootnoverify нужна для не-Linux систем, a chainloader +1 —для ОС, понимающих только «цепочечную» загрузку (MBR ? загрузочная запись активного раздела). Если вы зачем-то разместили Windows на неактивном разделе, откуда она сама загрузиться не сможет, то команде chainloader должна предшествовать команда makeactive.
GRUB имеет графический интерфейс, но попасть в его командную строку все-таки можно: увидев меню вторичного загрузчика, выберите курсором нужную позицию и нажмите <с> (нажав <Ввод>, вы загрузите выбранную систему, нажав <а>, вы сможете передать ядру дополнительные параметры, а нажав <е> — отредактировать последовательность команд, выполняемых при загрузке выбранной системы).
Итак, вы в командной строке. Редактировать вводимые команды можно в стиле bash: поддерживается автодополнение команд и путей к файлам, пролистывание истории команд стрелками «вверх» и «вниз». Список всех доступных команд можно получить по команде help, а получить краткую справку о команде — введя help <имя_команды>.
Установить диспетчер загрузки GRUB (если вы не сделали этого при инсталляции системы) можно командой /sbin/grub-install /dev/hda. Утилита grub-install, как и все остальные компоненты GRUB, содержится в пакете grub, который можно скачать по адресу http://www.sisyphus.ru/srpm/grub.
Как установить графический фон загрузчика GRUB
Много интересных картинок, пригодных для установки в качестве фона загрузчика GRUB, можно найти по адресу http://ruslug.rutgers.edu/~mcgrof/grub-images/images/working-splashimages. Чтобы не загружать все эти картинки, можно просмотреть их уменьшенные изображения по адресу http://ruslug.rutgers.edu/~mcgrof/grub-images/images, а потом уже загрузить понравившуюся картинку.
Выбранную картинку поместите в каталог /boot/grub и укажите ее в директиве splashimage конфигурационного файла:
splashimage=(hd0,0)/boot/grub/image.xpm.gz
Собственную картинку можно использовать как фон для загрузчика, если преобразовать ее в формат, поддерживаемый GRUB. Преобразование выполняется утилитой convert, после чего картинку нужно сжать компрессором gzip:
# convert myimage.png -colors 14 -resize 640x480 myimage.xpm
# gzip myimage.xpm
Данный текст является ознакомительным фрагментом.