Zenbook. Загрузка и загрузчики

Алексей Федорчук

2009-02-11

назад | к началу | вперед

Загрузчик Lilo

Lilo (LInux LOader) — традиционный и самый старый из загрузчиков Linux, единственный, который был написан специально для загрузки ядра именно этой операционной системы с жесткого диска. Его функции как мультисистемного загрузчика вторичны. Но, тем не менее, он успешно справляется с загрузкой Windows любого рода, FreeBSD и, вероятно, других BSD-систем (последнее лично мной не проверялось).

Как уже было сказано, в Lilo реализуется схема прямого обращения к ядру Linux из программы в MBR. Либо, в случае выбора загрузки ОС, отличной от Linux — передача управления на BR несущего её раздела.

То есть в общем случае Lilo записывается в MBR загрузочного диска, откуда при старте машины опознает дисковые разделы — как первичные, так и расширенные. И если раздел несет на себе метку Linux native — он загрузит с него образ ядра Linux (изначально Lilo для этого и предназначался, его функции мультисистемного загрузчика вторичны). Если же тип раздела — иной, Lilo в состоянии «по цепочке» передать управление на его загрузочный сектор, и дальнейшее будет определяться тем кодом, что записан в последнем.

Код Lilo, вместе с конфигурацией его меню, целиком лежит в MBR диска (или BR загрузочного раздела). Так что тип файловой системы для него по большому счету безразличен — то есть он способен загрузить ядро Linux с любой из ее многочисленных нативных файловых систем (и даже с файловой системы DOS, FAT16, за более поздние её модификации не скажу за незнанием).

Для разделов «чуждых» операционок тип их файловой системы для Lilo безразличен тем более — ведь, как уже было сказано, он просто передает управление на их загрузочные сектора. Таким способом — по «цепочке» — Lilo может обеспечить загрузку DOS, Windows 3.X/9X/ME и Windows NT/2000/XP, а также FreeBSD.

Каждая ОС, предусмотренная для «загрузки» через Lilo (вы ведь понимаете, почему теперь я взял это слово в кавычки? — именно потому, что в полном смысле оно применимо только к загрузке Linux), представляет собой один из вариантов выбора в меню этой программы. Важно, что таким вариантом может являться не обязательно отдельная операционка, но и разные дистрибутивы Linux, лежащие на собственных разделах, и разные версии ядра одного и того же дистрибутива, и просто разные сборки ядра одной и той же версии. Поэтому Lilo очень часто применяют для тестирования ядер этой системы, скомпилированных с разными опциями, или ядер разрабатываемой ветки.

Варианты загрузки через Lilo описываются в его специальном конфигурационном файле — /etc/lilo.conf. Это простой текстовый файл, доступный для изменения в текстовом редакторе (при наличии полномочий суперпользователя, разумеется). Он содержит несколько секций — общую (global section), описывающую условия загрузки в целом, и отдельные — описание каждого варианта загрузки.

Общая секция обычно содержит такие строки:

  • имя устройства, с которого выполняется запуск Lilo (именно Lilo, а не Linux или иной ОС), для случая первого диска это будет выглядеть как boot=/dev/sda;
  • предписание выводить меню выбора вариантов загрузки — prompt;
  • время ожидания выбора вариантов загрузки — timeout=##, где ## — время в секундах;
  • имя варианта, загружаемого по умолчанию, которое должно соответствовать тому, что далее будет указано в секции этого варианта.
Собственно, обязательной является только первая из них. Если не указать умолчальный вариант, то таковым будет выступать описанный в первой из отдельных секций, без указания времени ожидания выбора он загрузится мгновенно, ну а без строки prompt мы просто не увидим меню выбора вообще.

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

Содержание отдельных секций различается в зависимости от того, предназначен этот вариант для загрузки Linux или иной ОС. В общем случае обязательными здесь будут две строки. Первая — это метка варианта (label), то есть его уникальный идентификатор в виде произвольной, но, желательно, мнемонически прозрачной последовательности символов, например: linux, freebsd, windows. Вторая же — имя устройства, несущего загружаемую ОС или его корневую систему (вроде /dev/sda1, /dev/sda5 и так далее).

Чтобы читатель мог представить себе это зримо, приведу свой вариант общей секции файла /etc/lilo.conf с некоторыми комментариями:

# Конфигурационный файл LILO
# сгенерирован программой 'liloconfig'
#
# Начало общей секции LILO

# Добавление загрузки сплэш-картинки
append="resume=/dev/sda2 splash=silent"

# Определение загрузочного диска
boot = /dev/sda

# Имя файла сплэш-картинки
bitmap=/boot/splash.bmp

# Предписание выводить меню
prompt

# Время ожидания выбора (в секундах)
timeout = 50

# Устанавлиет разрешение и глубину цвета
# графической консоли 1024x768x64k
vga = 791

# Конец глобальной секции LILO
К вопросу, каким образом всё это было получено, мы ещё вернёмся.

Субсекция для каждого варианта, загружающего Linux, кроме обязательного идентификатора, должна включать:

  • имя файла, содержащего образ ядра, с указанием пути относительно корневого каталога, заданного в одной из следующих строк, что обычно выглядит как image=/boot/bzImage или image=/boot/vmlinuz;
  • имя устройства, несущего корневую файловую систему, для случая первого раздела на первом диске это будет root=/dev/sda1;
  • указание монтировать корневую файловую систему при загрузке ядра в режиме «только для чтения» read-only; это не значит, что она станет недоступной для записи после загрузки — в процессе инициализации файловые системы будут перемонтированы в соответствии с их описанием в /etc/fstab; да и вообще эта строка не обязательна, и приведена здесь только для порядку.
Кроме того, в Linux-субсекции /etc/lilo.conf могут вносится и строки, определяющие видеорежим при загрузке (если его не определили в глобальной секции или требуется сделать его иным), и строки, передающие ядру некие параметры, вроде append="noapic"; раньше необходимость в них возникала довольно часто (например, для включения эмуляции протокола SCSI через IDE-шину, что требовалось для записи компакт-дисков), но нынче я уже и забыл, когда последний раз приходилось что-то подобное дописывать.

Опять-таки для наглядности приведу свои субсекции для разных вариантов загрузки (должен сказать, что у меня их обычно не богато):

# Конфигурация загрузочных разделов Linux

# Загрузка тестовой версии ядра
# Файл образа ядра
image = /boot/vmlinuz-2.6.29-rc3

# Устройство с корневой файловой системой
root = /dev/sda1

# Метка варианта для меню
label = Zen-2.6.29-rc3
read-only

# Загрузка штатной версии ядра
# Файл образа ядра
image = /boot/vmlinuz-2.6.27.10

# Устройство с корневой файловой системой
root = /dev/sda1

# Метка варианта для меню
label = Zenwalk

# Имя инициирующего RAM-диска
initrd = /boot/initrd.splash
read-only
В субсекции для загрузки тестовой версии ядра, думаю, всё понятно. А в субсекции для загрузки версии ядра штатной надо обратить внимание на два момента.

Во-первых, на строку с указанием файла образа ядра. Обычно здесь фигурирует файл /boot/vmlinuz — символическая ссылка на обычный файл вида /boot/vmlinuz-2.6.XX.YY для образа ядра конкретной версии. Однако, как будет сказано в главе о компиляции ядра, при «ядерных»" экспериментах возможно переопределение этой ссылки на файл образа новоустанавливаемой версии, и потому лучше всегда задавать его явным образом.

Во-вторых, во второй субсекции можно видеть указание на файл initrd. Это — образ так называемого инициирующего диска в оперативной памяти (RAM-диска), обеспечивающего универсальность загрузки одного и того же ядра на машинах с разными конфигурациями «железа» и разными типами корневой файловой системы. Подробнее этот вопрос также будет рассмотрен в «ядерной» главе.

Субсекции для вариантов загрузки ОС, отличных от Linux, как правило, не содержат ничего, кроме имени устройства несущего раздела и метки варианта:

other=/dev/sda1
label=dos
Lilo может использоваться и исключительно для загрузки единичной Linux-системы в сочетании с любым мультисистемным загрузчиком, отвечающим за загрузку систем прочих (BSD Loader, GRUB, вплоть до NT Loader). В этом случае в общей секции /etc/lilo.conf в качестве загрузочного устройства следует указать имя корневого раздела Linux-системы — ведь тогда Lilo будет стартовать уже с его загрузочного сектора (а не с MBR диска):
boot=/dev/hda1
В общей секции же секции можно раз и навсегда определить имя устройства корневой файловой системы. А далее возможны и отдельные секции для вариантов загрузки, но они будут описывать уже не самостоятельные ОС или дистрибутивы, а разные версии или сборки ядра, возможно — видеорежимы или параметры ядра.

Как уже было сказано, Lilo напрямую с файловыми системами не работает — даже с файловыми системами Linux. Конфиг же этого загрузчика лежит в каталоге /etc, представляющем собой часть файлового древа инсталлированной Linux-системы, которая при старте машины еще не загружена. Как же загрузчик узнает о собственной конфигурации?

Очень просто, о существовании собственного конфига в момент запуска Lilo и не подозревает. Необходимые данные для опознания загрузочных разделов и ядер на них прошиты в виде бинарного кода в загрузочном секторе — диска или раздела. И делается это одноименной командой — /sbin/lilo. При запуске она обращается к файлу /etc/lilo.conf, исходя из значения строки

boot=/dev/имя_устройства

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

Added Zen-2.6.29-3 *
Added Zenwalk
где имя_рек — метка (label) добавленного или модифицированного пункта меню. Из чего становится очевидным, что каждое изменение конфигурации загрузчика должно сопровождаться его переустановкой — перезапуском программы /sbin/lilo.

Теперь пора поговорить о том, откуда берётся файл /etc/lilo.conf, и каким образом его можно модифицировать.

Установка Lilo и создание его конфигурационного файла обычно происходит на стадии установки дистрибутива, если его инсталлятор предусматривает использование этого загрузчика, безальтернативно или по выбору (в этом случае обычно в качестве альтернативы выступает GRUB).

назад | к началу | вперед