Что такое 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 (код MBR): BIOS загружает 512 байт из MBR в память по адресу `0x7C00` и передаёт туда управление. Эта крошечная заглушка знает только одну задачу: найти и загрузить Этап 2.
- Этап 2 (файл карты): LILO считывает свой файл карты (`/boot/map`), который был записан во время установки командой `lilo`. Эта карта содержит абсолютные адреса дисковых блоков каждого образа ядра и записи цепочечного загрузчика. Здесь не происходит разбора файловой системы — LILO использует сырые адреса секторов LBA/CHS.
- Отображение меню загрузки: Если в `lilo.conf` задан параметр `prompt`, LILO отображает текстовое меню. Директива `timeout` управляет временем ожидания перед выбором по умолчанию.
- Загрузка ядра: LILO считывает образ ядра с предварительно вычисленных дисковых адресов в нижнюю память, затем распаковывает и перемещает его.
- Передача управления: 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: техническое сравнение
Следующая таблица охватывает аспекты, наиболее важные для системного администратора при выборе между двумя загрузчиками, включая несколько нюансов, отсутствующих в большинстве сравнений:
| Функция | LILO | GRUB2 |
|---|
| — | — | — |
|---|
| **Поддержка файловых систем** | Отсутствует — использует сырые адреса дисковых блоков | Полная поддержка 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 не загружается после обновления ядра:
- Загрузитесь с Live CD или среды восстановления.
- Смонтируйте корневой раздел: `mount /dev/sda1 /mnt`
- Выполните chroot: `chroot /mnt`
- Убедитесь, что `/etc/lilo.conf` указывает на правильный путь к ядру.
- Повторно запустите: `/sbin/lilo -v`
- Перезагрузитесь.
Если сам файл карты повреждён, может потребоваться переустановить пакет `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.
