Какво е LILO (Linux Loader)? Архитектура, конфигурация и сравнение с GRUB
LILO (Linux Loader) е остарял буутлоудър за Linux и Unix-подобни операционни системи, който зарежда ядрото директно от адрес на диска, записан по време на инсталацията, без да изисква поддръжка на драйвер за файлова система по време на последователността на зареждане. Той работи на етапа преди OS — или от Master Boot Record (MBR), или от секторa за зареждане на дял — и предава управлението на CPU на ядрото на Linux след зареждането му в паметта.
За повечето производствени системи днес LILO е заменен от GRUB2. Въпреки това разбирането на вътрешната му структура остава от съществено значение за инженери, поддържащи наследена инфраструктура, вградени системи или изолирани сървъри, където минималистичен, детерминиран буутлоудър е съзнателен архитектурен избор.
Как работи процесът на зареждане на LILO на ниско ниво
Когато машината се включи, BIOS изпълнява POST (Power-On Self-Test), след което чете първите 512 байта от буутируемия диск — MBR. Ако LILO е инсталиран там, тези 512 байта съдържат буутлоудъра от първи етап на LILO. Последователността се развива по следния начин:
- Етап 1 (MBR код): BIOS зарежда 512 байта от MBR в паметта на адрес `0x7C00` и прехвърля изпълнението към него. Този малък фрагмент знае само една задача: да намери и зареди Етап 2.
- Етап 2 (map файл): LILO чете своя map файл (`/boot/map`), който е бил записан по време на инсталацията от командата `lilo`. Този map съдържа абсолютните адреси на дисковите блокове на всяко ядро и запис на верижен буутлоудър. Тук не се извършва разбор на файловата система — LILO използва сурови LBA/CHS адреси на сектори.
- Представяне на менюто за зареждане: Ако `prompt` е зададен в `lilo.conf`, LILO показва текстово меню. Директивата `timeout` контролира колко дълго изчаква преди да избере стойността по подразбиране.
- Зареждане на ядрото: LILO чете образа на ядрото от предварително изчислените адреси на дисковите блокове в ниската памет, след което го декомпресира и премества.
- Предаване на управлението: LILO предава параметрите на командния ред на ядрото и местоположението на началния RAM диск (`initrd`) на ядрото, което поема инициализацията на хардуера.
Критично архитектурно следствие: Тъй като LILO кодира абсолютните адреси на дисковите блокове по време на инсталацията, всяка промяна в файла на ядрото, оформлението на дяловете или `lilo.conf` изисква повторно изпълнение на `/sbin/lilo` за регенериране на map файла. Забравянето на тази стъпка след актуализация на ядрото е най-честата причина за неуспешно зареждане на 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` активира подробен изход, показващ всяко ядро и запис на верижен буутлоудър, който се картографира. Винаги проверявайте кода за изход — ненулева стойност означава, че map файлът не е записан успешно.
Често пропускани конфигурационни параметри
- `lba32`: Без тази директива на дискове с обем над 8 GB, LILO се връща към CHS адресиране и няма да успее да намери ядра след границата от 8 GB. Това е режим на тихо отказване, причинил безброй производствени прекъсвания на наследен хардуер.
- `compact`: Намалява времето за зареждане на въртящи се дискове чрез обединяване на четения на съседни сектори. Несъвместим с някои сценарии за зареждане от флопи.
- `vga=`: Предава параметър за видео режим на ядрото. Полезен за сървъри без монитор, където искате конкретна резолюция на framebuffer в конзолата.
- `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** | Само ръчни записи | `os-prober` автоматично разпознава инсталираните OS |
|---|
| **Размер на бинарния файл / отпечатък** | Много малък (~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, което го прави отличен предмет за курсове по вътрешна структура на OS.
За всяко съвременно внедряване — независимо дали осигурявате среда за VPS Хостинг, конфигурирате Dedicated сървър или настройвате стек за разработка на Споделен уеб хостинг — GRUB2 е стандартният и правилен избор на буутлоудър.
Чести режими на отказване на LILO и диагностика
Разбирането на кодовете за грешки на LILO е от решаващо значение за възстановяването. LILO отпечатва частичен низ от `LILO` по време на зареждане, за да покаже напредъка:
| Отпечатани символи | Достигнат етап | Вероятна причина за отказ |
|---|
| — | — | — |
|---|
| _(нищо)_ | MBR не е зареден | BIOS не открива буутируемо устройство |
|---|
| `L` | Етап 1 зареден | Грешка при зареждане на Етап 2; грешен път до map файла |
|---|
| `LI` | Етап 2 зареден | Бинарният файл на Етап 2 е несъвместим или повреден |
|---|
| `LIL` | Map файлът е намерен | Map файлът е повреден или на грешен адрес |
|---|
| `LIL?` | Map файлът е зареден | Map файлът е зареден от грешен адрес |
|---|
| `LILO` | Пълно зареждане | Менюто за зареждане е показано успешно |
|---|
Процедура за възстановяване
Ако LILO не успее да зареди след актуализация на ядрото:
- Заредете от live CD или среда за спасяване.
- Монтирайте основния дял: `mount /dev/sda1 /mnt`
- Chroot: `chroot /mnt`
- Проверете дали `/etc/lilo.conf` сочи към правилния път на ядрото.
- Изпълнете отново: `/sbin/lilo -v`
- Рестартирайте.
Ако самият map файл е повреден, може да се наложи да преинсталирате пакета `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 или защитен Dedicated сървър — тези ограничения правят 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` не е по избор — то е толкова задължително, колкото самото редактиране. Автоматизирайте това с hook за инсталиране на ядро след инсталация, ако вашият мениджър на пакети го поддържа.
Често задавани въпроси
Какво се случва, ако актуализирам ядрото на Linux на система с LILO, без да изпълня `/sbin/lilo`?
Map файлът на LILO все още сочи към адресите на дисковите блокове на старото ядро. Системата ще зареди предишното ядро, сякаш актуализацията никога не е извършена — или, ако старият образ на ядрото е бил презаписан на място, ще зареди повредени данни и ще изпадне в паника. Винаги изпълнявайте `/sbin/lilo -v` веднага след всяка актуализация на ядрото.
Може ли LILO да зарежда от диск с GPT разделяне?
Не надеждно. LILO е проектиран за MBR таблици на дяловете. GPT дисковете използват защитен MBR, който технически позволява инсталирането на LILO, но LILO няма осведоменост за GPT записите на дялове и не може надеждно да намери дялове след първите четири. Използвайте GRUB2 за всеки GPT диск.
Съвместим ли е LILO с UEFI системи?
Не. LILO е буутлоудър от епохата на BIOS без поддръжка на EFI приложения. На UEFI системи фърмуерът очаква бинарен файл `.efi` в PE формат в EFI System Partition. 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 дистрибуции.
