2009-02-11
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), описывающую условия загрузки в целом, и отдельные — описание каждого варианта загрузки.
Общая секция обычно содержит такие строки:
Кроме указанных, в общей секции может присутствовать и другие строкм, определяющие видеорежим — плотность знаков чисто текстовой консоли или разрешение консоли графической (через 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, кроме обязательного идентификатора, должна включать:
Опять-таки для наглядности приведу свои субсекции для разных вариантов загрузки (должен сказать, что у меня их обычно не богато):
# Конфигурация загрузочных разделов 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=dosLilo может использоваться и исключительно для загрузки единичной 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).