Що таке 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.
- Відображення меню завантаження: Якщо `prompt` встановлено в `lilo.conf`, 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 GB LILO повертається до адресації CHS і не зможе знайти ядра за межею 8 GB. Це прихований режим збою, який спричинив незліченну кількість виробничих збоїв на застарілому обладнанні.
- `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 GB без `lba32`; практично необмежено з ним | Без практичних обмежень |
|---|
| **Мережеве завантаження (PXE)** | Ні | Так (через `grub-efi` та модулі tftp) |
|---|
| **Режим відновлення** | Відсутній вбудований | Вбудована оболонка відновлення |
|---|
| **Скриптування в конфігурації** | Ні | Так (bash-подібне скриптування в `grub.cfg`) |
|---|
| **Підтримка Initrd/initramfs** | Так | Так |
|---|
| **Виявлення кількох ОС** | Лише ручні записи | `os-prober` автоматично виявляє встановлені ОС |
|---|
| **Розмір бінарного файлу / слід** | Дуже малий (~20 KB) | Більший (~1–4 MB з модулями) |
|---|
| **Активна розробка** | Покинутий (останній реліз 2015) | Активно підтримується |
|---|
| **Secure Boot** | Ні | Так (через shim + підписаний GRUB) |
|---|
Висновок для виробничих систем: GRUB2 є правильним вибором для будь-якої системи, що працює на ядрі новішому за приблизно 3.x, використовує GPT, UEFI, LVM або програмний RAID. Цінність LILO сьогодні обмежена вбудованими або застарілими середовищами, де його детермінована, незалежна від файлової системи модель завантаження є перевагою, а не недоліком.
Коли LILO все ще є правильним інструментом
Незважаючи на свій вік, LILO залишається доречним у певних сценаріях:
- Вбудовані системи Linux, де розмір завантажувача повинен бути менше 32 KB, а розташування ядра ніколи не змінюється.
- Застаріле обладнання (до 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 rescue 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.
