15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
08.10.2024

Что такое LILO (Linux Loader)? Архитектура, конфигурация и сравнение с GRUB

LILO (Linux Loader) — это устаревший загрузчик для Linux и Unix-подобных операционных систем, который загружает ядро непосредственно с дискового адреса, сохранённого во время установки, без необходимости поддержки драйвера файловой системы в процессе загрузки. Он работает на этапе до запуска ОС — либо из Master Boot Record (MBR), либо из загрузочного сектора раздела — и передаёт управление CPU ядру Linux после его загрузки в память.

Для большинства производственных систем сегодня LILO был вытеснен GRUB2. Однако понимание его внутреннего устройства остаётся необходимым для инженеров, обслуживающих устаревшую инфраструктуру, встраиваемые системы или изолированные серверы, где минималистичный, детерминированный загрузчик является намеренным архитектурным решением.

Как работает процесс загрузки LILO на низком уровне

При включении машины BIOS выполняет POST (Power-On Self-Test), затем считывает первые 512 байт загрузочного диска — MBR. Если там установлен LILO, эти 512 байт содержат загрузчик первого этапа LILO. Последовательность разворачивается следующим образом:

  1. Этап 1 (код MBR): BIOS загружает 512 байт из MBR в память по адресу `0x7C00` и передаёт туда управление. Эта крошечная заглушка знает только одну задачу: найти и загрузить Этап 2.
  2. Этап 2 (файл карты): LILO считывает свой файл карты (`/boot/map`), который был записан во время установки командой `lilo`. Эта карта содержит абсолютные адреса дисковых блоков каждого образа ядра и записи цепочечного загрузчика. Здесь не происходит разбора файловой системы — LILO использует сырые адреса секторов LBA/CHS.
  3. Отображение меню загрузки: Если в `lilo.conf` задан параметр `prompt`, LILO отображает текстовое меню. Директива `timeout` управляет временем ожидания перед выбором по умолчанию.
  4. Загрузка ядра: LILO считывает образ ядра с предварительно вычисленных дисковых адресов в нижнюю память, затем распаковывает и перемещает его.
  5. Передача управления: LILO передаёт параметры командной строки ядра и расположение начального RAM-диска (`initrd`) ядру, которое берёт на себя инициализацию оборудования.

Критическое архитектурное следствие: Поскольку LILO кодирует абсолютные адреса дисковых блоков во время установки, любое изменение файла ядра, разметки разделов или `lilo.conf` требует повторного запуска `/sbin/lilo` для регенерации карты. Забыть об этом шаге после обновления ядра — наиболее распространённая причина сбоев загрузки LILO.

Конфигурация LILO: подробный разбор `/etc/lilo.conf`

LILO настраивается полностью через `/etc/lilo.conf`. Ниже приведён репрезентативный производственный пример с аннотациями, охватывающими параметры, которые оригинальная документация часто упускает:

“`ini

Global section

boot=/dev/sda # Install LILO to the MBR of /dev/sda

map=/boot/map # Path to the map file (must be on a non-LVM, non-RAID partition)

install=/boot/boot.b # Second-stage boot loader binary

prompt # Always show the boot menu

timeout=100 # Wait 10 seconds (units are 1/10th of a second)

default=linux-stable # Default entry label

lba32 # Enable LBA32 addressing — critical for disks > 8 GB

compact # Merge adjacent read requests; speeds up boot on HDD

Linux kernel entry

image=/boot/vmlinuz-5.4.0

label=linux-stable

initrd=/boot/initrd.img-5.4.0

root=/dev/sda1

read-only # Mount root read-only initially; fsck runs before remount rw

append="quiet splash"

Fallback kernel entry

image=/boot/vmlinuz-4.19.0

label=linux-fallback

initrd=/boot/initrd.img-4.19.0

root=/dev/sda1

read-only

Chain-load Windows from a second partition

other=/dev/sda2

label=windows

table=/dev/sda # Partition table to pass to the Windows bootloader

“`

После каждого редактирования применяйте изменения с помощью:

“`bash

sudo /sbin/lilo -v

“`

Флаг `-v` включает подробный вывод, показывая каждое ядро и запись цепочечного загрузчика в процессе сопоставления. Всегда проверяйте код завершения — ненулевое значение означает, что карта не была успешно записана.

Часто упускаемые параметры конфигурации

  • `lba32`: Без этой директивы на дисках размером более 8 ГБ LILO переходит к адресации CHS и не сможет найти ядра за пределами границы 8 ГБ. Это скрытый режим сбоя, который стал причиной бесчисленных производственных инцидентов на устаревшем оборудовании.
  • `compact`: Сокращает время загрузки на вращающихся дисках за счёт объединения смежных операций чтения секторов. Несовместимо с некоторыми сценариями загрузки с дискеты.
  • `vga=`: Передаёт параметр видеорежима ядру. Полезно для серверов без монитора, где требуется определённое разрешение фреймбуфера в консоли.
  • `append=`: Передаёт произвольные параметры командной строки ядра. Эквивалент аргументов строки `linux` в GRUB.
  • `password=`: Ограничивает загрузку определённой записи паролем. Обратите внимание, что этот пароль хранится в открытом виде в `lilo.conf`, поэтому права доступа к файлу (`chmod 600`) обязательны.

Сценарии установки LILO

Установка в MBR

“`bash

Verify the target device

lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

Install LILO to MBR of /dev/sda

sudo /sbin/lilo -b /dev/sda

“`

Установка в загрузочный сектор раздела

При использовании менеджера загрузки, такого как System Commander, может потребоваться установить LILO в загрузочный сектор раздела, а не в MBR:

“`ini

boot=/dev/sda1 # Install to partition boot sector, not MBR

“`

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

Удаление LILO

Для восстановления исходного MBR (например, перед заменой на GRUB):

“`bash

Overwrite MBR with a generic boot sector, preserving the partition table

sudo dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda bs=440 count=1

“`

Никогда не используйте `dd if=/dev/zero` на полном MBR — это уничтожит таблицу разделов.

LILO против GRUB: техническое сравнение

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

ФункцияLILOGRUB2
**Поддержка файловых систем**Отсутствует — использует сырые адреса дисковых блоковПолная поддержка ext2/3/4, XFS, Btrfs, ZFS, FAT, NTFS
**Метод применения конфигурации**Необходимо запускать `/sbin/lilo` после каждого измененияДинамически считывает `grub.cfg` во время загрузки
**Обработка обновлений ядра**Требуется ручной повторный запуск; легко забыть`update-grub` / `grub-mkconfig` автоматизирует это
**Редактирование параметров загрузки**Невозможно во время загрузкиИнтерактивный редактор в меню загрузки (нажмите `e`)
**Поддержка UEFI**НетДа (GRUB2 поддерживает UEFI Secure Boot)
**Таблица разделов GPT**Ограниченная / ненадёжнаяПолная поддержка
**Ограничение размера диска**8 ГБ без `lba32`; практически неограниченно с нимНет практических ограничений
**Сетевая загрузка (PXE)**НетДа (через `grub-efi` и модули tftp)
**Режим восстановления**ОтсутствуетВстроенная оболочка восстановления
**Скриптинг в конфигурации**НетДа (bash-подобный скриптинг в `grub.cfg`)
**Поддержка Initrd/initramfs**ДаДа
**Обнаружение нескольких ОС**Только ручные записи`os-prober` автоматически обнаруживает установленные ОС
**Размер бинарного файла / занимаемое место**Очень маленький (~20 КБ)Больше (~1–4 МБ с модулями)
**Активная разработка**Заброшен (последний выпуск в 2015 году)Активно поддерживается
**Secure Boot**НетДа (через shim + подписанный GRUB)

Вывод для производственных систем: GRUB2 является правильным выбором для любой системы, работающей на ядре новее примерно 3.x, использующей GPT, UEFI, LVM или программный RAID. Ценность LILO сегодня ограничена встраиваемыми или устаревшими средами, где его детерминированная, независимая от файловой системы модель загрузки является преимуществом, а не недостатком.

Когда LILO всё ещё является правильным инструментом

Несмотря на свой возраст, LILO остаётся подходящим в определённых сценариях:

  • Встраиваемые системы Linux, где размер загрузчика должен быть менее 32 КБ, а расположение ядра никогда не меняется.
  • Устаревшее оборудование (до 2000 года), где модули GRUB2 превышают доступную память или BIOS имеет проблемы совместимости с поэтапной загрузкой GRUB.
  • Криминалистические среды и среды восстановления, где предпочтительнее известный надёжный минималистичный загрузчик, а не сложный со скриптовыми возможностями.
  • Изолированные системы, где простота и проверяемость плоской модели конфигурации LILO уменьшают поверхность атаки.
  • Образовательные цели — исходный код LILO и последовательность загрузки значительно проще, чем у GRUB2, что делает его отличным предметом для курсов по внутреннему устройству ОС.

Для любого современного развёртывания — будь то подготовка среды VPS Хостинга, настройка Выделенного сервера или создание стека разработки на Общем веб-хостинге — GRUB2 является стандартным и правильным выбором загрузчика.

Распространённые режимы сбоя LILO и диагностика

Понимание кодов ошибок LILO критически важно для восстановления. LILO выводит частичную строку `LILO` во время загрузки для индикации прогресса:

Выведенные символыДостигнутый этапВероятная причина сбоя
_(ничего)_MBR не загруженBIOS не находит загрузочное устройство
`L`Этап 1 загруженОшибка загрузки Этапа 2; неверный путь к файлу карты
`LI`Этап 2 загруженБинарный файл Этапа 2 несовместим или повреждён
`LIL`Файл карты найденФайл карты повреждён или находится по неверному адресу
`LIL?`Файл карты загруженФайл карты загружен с неверного адреса
`LILO`Полная загрузкаМеню загрузки отображено успешно

Процедура восстановления

Если LILO не загружается после обновления ядра:

  1. Загрузитесь с Live CD или среды восстановления.
  2. Смонтируйте корневой раздел: `mount /dev/sda1 /mnt`
  3. Выполните chroot: `chroot /mnt`
  4. Убедитесь, что `/etc/lilo.conf` указывает на правильный путь к ядру.
  5. Повторно запустите: `/sbin/lilo -v`
  6. Перезагрузитесь.

Если сам файл карты повреждён, может потребоваться переустановить пакет `lilo` для восстановления `/boot/boot.b` перед повторным запуском команды.

Соображения безопасности

LILO появился до современных моделей безопасности прошивок и имеет ряд важных ограничений:

  • Отсутствие поддержки Secure Boot: LILO не может участвовать в цепочке доверия UEFI Secure Boot. На системах, где требуется проверка целостности прошивки, обязателен GRUB2 с подписанным shim.
  • Уязвимости защиты паролем: Директива `password=` в `lilo.conf` хранит учётные данные в открытом виде. Строго ограничьте права доступа к файлу (`chmod 600 /etc/lilo.conf`, владелец root).
  • Уязвимость при физическом доступе: Без пароля BIOS/UEFI злоумышленник с физическим доступом может загрузиться с внешнего носителя и полностью обойти LILO.
  • Отсутствие интеграции с TPM: LILO не может выполнять измеренную загрузку или взаимодействовать с TPM для аттестации, в отличие от GRUB2 с соответствующими модулями.

Для серверов, где шифрование диска, измеренная загрузка или удалённая аттестация являются частью архитектуры безопасности — например, VPS с cPanel или защищённый Выделенный сервер — эти ограничения делают LILO непригодным.

Миграция с LILO на GRUB2

Если вы обслуживаете устаревшую систему, всё ещё работающую на LILO, и вам необходимо выполнить миграцию:

“`bash

1. Install GRUB2

sudo apt-get install grub2 # Debian/Ubuntu

sudo yum install grub2-tools # RHEL/CentOS

2. Install GRUB2 to MBR

sudo grub-install /dev/sda

3. Generate GRUB configuration

sudo update-grub # Debian/Ubuntu

sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS

4. Verify the new configuration

sudo grep -i menuentry /boot/grub/grub.cfg

5. Reboot and confirm GRUB2 loads

sudo reboot

“`

Не удаляйте пакет `lilo` до тех пор, пока не убедитесь, что GRUB2 успешно загружается. Держите под рукой Live USB для восстановления на время миграции.

Если ваш сервер использует Панели управления VPS, взаимодействующие с загрузчиком (например, для переключения ядра или режима восстановления), проверьте совместимость панели с GRUB2 перед миграцией.

Ключевые технические выводы: матрица решений

Используйте этот контрольный список, чтобы определить, подходит ли LILO для вашей среды:

Используйте LILO, если:

  • Система использует прошивку BIOS (не UEFI)
  • Диск использует таблицу разделов MBR (не GPT)
  • Ядро и разметка разделов статичны и редко меняются
  • Размер загрузчика должен быть минимальным (встраиваемые системы)
  • Вы изучаете внутреннее устройство последовательности загрузки в образовательных целях

Не используйте LILO, если:

  • Система использует прошивку UEFI (LILO несовместим)
  • Диск использует разметку GPT
  • Ядра регулярно обновляются через менеджер пакетов
  • Требуется Secure Boot, аттестация TPM или измеренная загрузка
  • Система использует LVM, программный RAID или Btrfs для корневой файловой системы
  • Требуется интерактивное редактирование параметров загрузки для устранения неполадок
  • Система подключена к интернету или подпадает под требования безопасности

Операционное правило: Каждый раз, когда вы редактируете `/etc/lilo.conf` или обновляете ядро в системе под управлением LILO, запуск `/sbin/lilo -v` не является опциональным — он столь же обязателен, как и само редактирование. Автоматизируйте это с помощью хука после установки ядра, если ваш менеджер пакетов это поддерживает.

Часто задаваемые вопросы

Что произойдёт, если я обновлю ядро Linux в системе с LILO, не запустив `/sbin/lilo`?

Файл карты LILO по-прежнему указывает на адреса дисковых блоков старого ядра. Система загрузит предыдущее ядро, как если бы обновление никогда не происходило — или, если старый образ ядра был перезаписан на месте, загрузит повреждённые данные и вызовет панику. Всегда запускайте `/sbin/lilo -v` сразу после любого обновления ядра.

Может ли LILO загружаться с диска с разметкой GPT?

Ненадёжно. LILO был разработан для таблиц разделов MBR. Диски GPT используют защитный MBR, который технически позволяет установить LILO, но LILO не имеет осведомлённости о записях разделов GPT и не может надёжно находить разделы за пределами первых четырёх. Используйте GRUB2 для любого диска GPT.

Совместим ли LILO с системами UEFI?

Нет. LILO — это загрузчик эпохи BIOS без поддержки EFI-приложений. На системах UEFI прошивка ожидает бинарный файл `.efi` в формате PE в системном разделе EFI. LILO не может этого обеспечить. GRUB2, systemd-boot или rEFInd являются правильным выбором для UEFI.

В чём разница между значением `timeout` в LILO и реальными секундами?

Директива `timeout` измеряется в десятых долях секунды. Значение `50` равно 5 секундам, `100` равно 10 секундам. Это распространённая ошибка конфигурации — администраторы, ожидающие тайм-аут в 50 секунд и устанавливающие `timeout=50`, получат окно в 5 секунд.

Может ли LILO загружаться с томов LVM или программного RAID?

Нет. Поскольку LILO разрешает расположение ядра до абсолютных адресов дисковых блоков во время установки, он не может обрабатывать уровни абстракции, вводимые LVM или MD RAID. Раздел `/boot` должен находиться на обычном разделе, непосредственно доступном BIOS. Это одна из основных архитектурных причин, по которым GRUB2 заменил LILO в современных дистрибутивах Linux.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать