Co to jest LILO (Linux Loader)? Architektura, konfiguracja i porównanie z GRUB
LILO (Linux Loader) jest starszym programem rozruchowym dla Linux i systemów operacyjnych podobnych do Unix, który ładuje jądro bezpośrednio z adresu dysku zapisanego w czasie instalacji, bez konieczności obsługi sterownika systemu plików podczas sekwencji rozruchowej. Działa na etapie przed uruchomieniem systemu operacyjnego — z Master Boot Record (MBR) lub sektora rozruchowego partycji — i przekazuje kontrolę CPU do jądra Linux po załadowaniu go do pamięci.
W większości dzisiejszych systemów produkcyjnych LILO został zastąpiony przez GRUB2. Jednak zrozumienie jego wewnętrznego działania pozostaje niezbędne dla inżynierów utrzymujących starszą infrastrukturę, systemy wbudowane lub serwery izolowane od sieci, gdzie minimalny, deterministyczny program rozruchowy jest świadomym wyborem architektonicznym.
Jak działa proces rozruchu LILO na niskim poziomie
Gdy maszyna się włącza, BIOS wykonuje POST (Power-On Self-Test), a następnie odczytuje pierwsze 512 bajtów dysku rozruchowego — MBR. Jeśli LILO jest tam zainstalowany, te 512 bajtów zawiera program ładujący pierwszego etapu LILO. Sekwencja przebiega następująco:
- Etap 1 (kod MBR): BIOS ładuje 512 bajtów z MBR do pamięci pod adresem `0x7C00` i przekazuje do niego wykonanie. Ten mały fragment kodu zna tylko jedno zadanie: zlokalizować i załadować Etap 2.
- Etap 2 (plik mapy): LILO odczytuje swój plik mapy (`/boot/map`), który został zapisany w czasie instalacji przez polecenie `lilo`. Ta mapa zawiera bezwzględne adresy bloków dyskowych każdego obrazu jądra i wpisu chain-loadera. Nie dochodzi tu do parsowania systemu plików — LILO używa surowych adresów sektorów LBA/CHS.
- Prezentacja menu rozruchowego: Jeśli `prompt` jest ustawione w `lilo.conf`, LILO wyświetla menu tekstowe. Dyrektywa `timeout` kontroluje czas oczekiwania przed wybraniem domyślnej opcji.
- Ładowanie jądra: LILO odczytuje obraz jądra z wstępnie obliczonych adresów dyskowych do pamięci niskiej, a następnie dekompresuje go i przenosi.
- Przekazanie kontroli: LILO przekazuje parametry wiersza poleceń jądra i lokalizację początkowego dysku RAM (`initrd`) do jądra, które przejmuje inicjalizację sprzętu.
Krytyczna implikacja architektoniczna: Ponieważ LILO koduje bezwzględne adresy bloków dyskowych w czasie instalacji, każda zmiana pliku jądra, układu partycji lub `lilo.conf` wymaga ponownego uruchomienia `/sbin/lilo` w celu regeneracji mapy. Zapomnienie o tym kroku po aktualizacji jądra jest najczęstszą przyczyną awarii rozruchu LILO.
Konfiguracja LILO: Szczegółowe omówienie `/etc/lilo.conf`
LILO jest konfigurowany wyłącznie przez `/etc/lilo.conf`. Poniżej znajduje się reprezentatywny dla środowiska produkcyjnego przykład z adnotacjami obejmującymi opcje, które oryginalna dokumentacja często pomija:
“`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
“`
Po każdej edycji zastosuj zmiany za pomocą:
“`bash
sudo /sbin/lilo -v
“`
Flaga `-v` włącza szczegółowe dane wyjściowe, pokazując każde jądro i wpis chain-loadera podczas mapowania. Zawsze weryfikuj kod wyjścia — wartość niezerowa oznacza, że mapa nie została pomyślnie zapisana.
Często pomijane parametry konfiguracyjne
- `lba32`: Bez tej dyrektywy na dyskach większych niż 8 GB, LILO wraca do adresowania CHS i nie będzie w stanie zlokalizować jąder poza granicą 8 GB. Jest to tryb cichej awarii, który spowodował niezliczone przestoje produkcyjne na starszym sprzęcie.
- `compact`: Skraca czas rozruchu na dyskach talerzowych poprzez łączenie odczytów sąsiednich sektorów. Niekompatybilny z niektórymi scenariuszami rozruchu z dyskietki.
- `vga=`: Przekazuje parametr trybu wideo do jądra. Przydatne dla serwerów bez monitora, gdzie chcesz określonej rozdzielczości framebuffera w konsoli.
- `append=`: Przekazuje dowolne parametry wiersza poleceń jądra. Odpowiednik argumentów linii `linux` w GRUB.
- `password=`: Ogranicza uruchamianie określonego wpisu za pomocą hasła. Należy pamiętać, że to hasło jest przechowywane w postaci zwykłego tekstu w `lilo.conf`, więc uprawnienia do pliku (`chmod 600`) są obowiązkowe.
Scenariusze instalacji LILO
Instalacja do 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
“`
Instalacja do sektora rozruchowego partycji
Podczas korzystania z menedżera rozruchu, takiego jak System Commander, możesz chcieć umieścić LILO w sektorze rozruchowym partycji zamiast w MBR:
“`ini
boot=/dev/sda1 # Install to partition boot sector, not MBR
“`
Jest to również właściwe podejście, gdy LILO jest chain-ładowany przez inny program rozruchowy.
Usuwanie LILO
Aby przywrócić oryginalny MBR (np. przed zastąpieniem przez 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
“`
Nigdy nie używaj `dd if=/dev/zero` na pełnym MBR — zniszczy to tablicę partycji.
LILO vs. GRUB: Porównanie techniczne
Poniższa tabela obejmuje wymiary najważniejsze dla administratora systemów wybierającego między tymi dwoma rozwiązaniami, w tym kilka niuansów nieobecnych w większości porównań:
| Funkcja | LILO | GRUB2 |
|---|
| — | — | — |
|---|
| **Świadomość systemu plików** | Brak — używa surowych adresów bloków dyskowych | Pełna obsługa ext2/3/4, XFS, Btrfs, ZFS, FAT, NTFS |
|---|
| **Metoda stosowania konfiguracji** | Należy uruchomić `/sbin/lilo` po każdej zmianie | Odczytuje `grub.cfg` dynamicznie podczas rozruchu |
|---|
| **Obsługa aktualizacji jądra** | Wymagane ręczne ponowne uruchomienie; łatwo zapomnieć | `update-grub` / `grub-mkconfig` automatyzuje to |
|---|
| **Edycja parametrów rozruchu** | Niemożliwa podczas rozruchu | Interaktywny edytor w menu rozruchowym (naciśnij `e`) |
|---|
| **Obsługa UEFI** | Nie | Tak (GRUB2 obsługuje UEFI Secure Boot) |
|---|
| **Tablica partycji GPT** | Ograniczona / zawodna | Pełna obsługa |
|---|
| **Limit rozmiaru dysku** | 8 GB bez `lba32`; praktycznie nieograniczony z nim | Brak praktycznego limitu |
|---|
| **Rozruch sieciowy (PXE)** | Nie | Tak (przez `grub-efi` i moduły tftp) |
|---|
| **Tryb ratunkowy / odzyskiwania** | Brak wbudowanego | Wbudowana powłoka ratunkowa |
|---|
| **Skryptowanie w konfiguracji** | Nie | Tak (skryptowanie podobne do bash w `grub.cfg`) |
|---|
| **Obsługa Initrd/initramfs** | Tak | Tak |
|---|
| **Wykrywanie wielu systemów operacyjnych** | Tylko ręczne wpisy | `os-prober` automatycznie wykrywa zainstalowane systemy operacyjne |
|---|
| **Rozmiar binarny / ślad** | Bardzo mały (~20 KB) | Większy (~1–4 MB z modułami) |
|---|
| **Aktywny rozwój** | Porzucony (ostatnie wydanie 2015) | Aktywnie utrzymywany |
|---|
| **Secure Boot** | Nie | Tak (przez shim + podpisany GRUB) |
|---|
Werdykt dla systemów produkcyjnych: GRUB2 jest właściwym wyborem dla każdego systemu działającego na jądrze nowszym niż około 3.x, używającego GPT, UEFI, LVM lub programowego RAID. Propozycja wartości LILO jest dziś ograniczona do środowisk wbudowanych lub starszych, gdzie jego deterministyczny, niezależny od systemu plików model ładowania jest atutem, a nie wadą.
Kiedy LILO jest nadal właściwym narzędziem
Pomimo swojego wieku, LILO pozostaje odpowiedni w określonych scenariuszach:
- Wbudowane systemy Linux, gdzie ślad programu rozruchowego musi być mniejszy niż 32 KB, a lokalizacja jądra nigdy się nie zmienia.
- Starszy sprzęt (sprzed 2000 roku), gdzie moduły GRUB2 przekraczają dostępną pamięć lub BIOS ma problemy ze zgodnością z ładowaniem etapowym GRUB.
- Środowiska kryminalistyczne i odzyskiwania danych, gdzie znany, minimalny program rozruchowy jest preferowany nad złożonym z możliwościami skryptowania.
- Systemy izolowane od sieci, gdzie prostota i możliwość audytu płaskiego modelu konfiguracji LILO zmniejsza powierzchnię ataku.
- Cele edukacyjne — kod źródłowy LILO i sekwencja rozruchowa są znacznie prostsze niż GRUB2, co czyni go doskonałym tematem dla kursów dotyczących wewnętrznego działania systemów operacyjnych.
W przypadku każdego nowoczesnego wdrożenia — niezależnie od tego, czy konfigurujesz środowisko VPS Hosting, konfigurujesz Serwer Dedykowany, czy konfigurujesz stos deweloperski na Współdzielonym Hostingu WWW — GRUB2 jest domyślnym i właściwym wyborem programu rozruchowego.
Typowe tryby awarii LILO i diagnostyka
Zrozumienie kodów błędów LILO jest kluczowe dla odzyskiwania systemu. LILO drukuje częściowy ciąg `LILO` podczas rozruchu, aby wskazać postęp:
| Wydrukowane znaki | Osiągnięty etap | Prawdopodobna przyczyna awarii |
|---|
| — | — | — |
|---|
| _(nic)_ | MBR nie załadowany | BIOS nie znajduje urządzenia rozruchowego |
|---|
| `L` | Etap 1 załadowany | Błąd ładowania Etapu 2; zła ścieżka pliku mapy |
|---|
| `LI` | Etap 2 załadowany | Binarka Etapu 2 niekompatybilna lub uszkodzona |
|---|
| `LIL` | Plik mapy znaleziony | Plik mapy uszkodzony lub pod złym adresem |
|---|
| `LIL?` | Plik mapy załadowany | Plik mapy załadowany z błędnego adresu |
|---|
| `LILO` | Pełne załadowanie | Menu rozruchowe wyświetlone pomyślnie |
|---|
Procedura odzyskiwania
Jeśli LILO nie uruchamia się po aktualizacji jądra:
- Uruchom z live CD lub środowiska ratunkowego.
- Zamontuj partycję główną: `mount /dev/sda1 /mnt`
- Chroot: `chroot /mnt`
- Sprawdź, czy `/etc/lilo.conf` wskazuje na właściwą ścieżkę jądra.
- Uruchom ponownie: `/sbin/lilo -v`
- Uruchom ponownie system.
Jeśli sam plik mapy jest uszkodzony, może być konieczna ponowna instalacja pakietu `lilo` w celu przywrócenia `/boot/boot.b` przed ponownym uruchomieniem polecenia.
Kwestie bezpieczeństwa
LILO poprzedza nowoczesne modele bezpieczeństwa oprogramowania układowego i ma kilka istotnych ograniczeń:
- Brak obsługi Secure Boot: LILO nie może uczestniczyć w łańcuchu zaufania UEFI Secure Boot. W systemach, gdzie wymagana jest weryfikacja integralności oprogramowania układowego, obowiązkowy jest GRUB2 z podpisanym shimem.
- Słabości ochrony hasłem: Dyrektywa `password=` w `lilo.conf` przechowuje dane uwierzytelniające w postaci zwykłego tekstu. Ściśle ogranicz uprawnienia do pliku (`chmod 600 /etc/lilo.conf`, właściciel root).
- Podatność na fizyczny dostęp: Bez hasła BIOS/UEFI, atakujący z fizycznym dostępem może uruchomić system z zewnętrznego nośnika i całkowicie ominąć LILO.
- Brak integracji z TPM: LILO nie może wykonywać mierzonego rozruchu ani współpracować z TPM w celu atestacji, w przeciwieństwie do GRUB2 z odpowiednimi modułami.
W przypadku serwerów, gdzie szyfrowanie dysku, mierzony rozruch lub zdalna atestacja są częścią architektury bezpieczeństwa — takich jak VPS z cPanel lub zabezpieczony Serwer Dedykowany — te ograniczenia czynią LILO nieodpowiednim.
Migracja z LILO do GRUB2
Jeśli utrzymujesz starszy system nadal działający na LILO i musisz przeprowadzić migrację:
“`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
“`
Nie usuwaj pakietu `lilo` dopóki nie potwierdzisz, że GRUB2 uruchamia się pomyślnie. Trzymaj pod ręką live USB ratunkowy podczas migracji.
Jeśli Twój serwer używa Paneli Sterowania VPS, które współdziałają z programem rozruchowym (np. do przełączania jądra lub trybu ratunkowego), przed migracją sprawdź zgodność panelu z GRUB2.
Kluczowe wnioski techniczne: Macierz decyzyjna
Użyj tej listy kontrolnej, aby określić, czy LILO jest odpowiedni dla Twojego środowiska:
Użyj LILO, jeśli:
- System używa oprogramowania układowego BIOS (nie UEFI)
- Dysk używa tablicy partycji MBR (nie GPT)
- Jądro i układ partycji są statyczne i rzadko się zmieniają
- Ślad programu rozruchowego musi być zminimalizowany (systemy wbudowane)
- Studiujesz wewnętrzne działanie sekwencji rozruchowej w celach edukacyjnych
Nie używaj LILO, jeśli:
- System używa oprogramowania układowego UEFI (LILO jest niekompatybilny)
- Dysk używa partycjonowania GPT
- Jądra są regularnie aktualizowane przez menedżera pakietów
- Wymagasz Secure Boot, atestacji TPM lub mierzonego rozruchu
- System używa LVM, programowego RAID lub Btrfs dla głównego systemu plików
- Potrzebujesz interaktywnej edycji parametrów rozruchu do rozwiązywania problemów
- System jest dostępny z Internetu lub podlega wymogom zgodności z przepisami bezpieczeństwa
Zasada operacyjna: Za każdym razem, gdy edytujesz `/etc/lilo.conf` lub aktualizujesz jądro w systemie zarządzanym przez LILO, uruchomienie `/sbin/lilo -v` nie jest opcjonalne — jest tak samo obowiązkowe jak sama edycja. Zautomatyzuj to za pomocą haka post-instalacyjnego jądra, jeśli Twój menedżer pakietów to obsługuje.
Często zadawane pytania
Co się stanie, jeśli zaktualizuję jądro Linux w systemie LILO bez uruchamiania `/sbin/lilo`?
Plik mapy LILO nadal wskazuje na stare adresy bloków dyskowych jądra. System uruchomi poprzednie jądro tak, jakby aktualizacja nigdy nie nastąpiła — lub, jeśli stary obraz jądra został nadpisany w miejscu, załaduje uszkodzone dane i wpadnie w panikę. Zawsze uruchamiaj `/sbin/lilo -v` natychmiast po każdej aktualizacji jądra.
Czy LILO może uruchamiać się z dysku partycjonowanego GPT?
Nie w sposób niezawodny. LILO został zaprojektowany dla tablic partycji MBR. Dyski GPT używają ochronnego MBR, który technicznie pozwala na instalację LILO, ale LILO nie ma świadomości wpisów partycji GPT i nie może niezawodnie zlokalizować partycji poza pierwszymi czterema. Używaj GRUB2 dla każdego dysku GPT.
Czy LILO jest kompatybilny z systemami UEFI?
Nie. LILO jest programem rozruchowym ery BIOS bez obsługi aplikacji EFI. W systemach UEFI oprogramowanie układowe oczekuje binarki `.efi` w formacie PE w partycji systemowej EFI. LILO nie może tego zapewnić. GRUB2, systemd-boot lub rEFInd są właściwymi wyborami dla UEFI.
Jaka jest różnica między wartością `timeout` LILO a rzeczywistymi sekundami?
Dyrektywa `timeout` jest mierzona w dziesiątych częściach sekundy. Wartość `50` równa się 5 sekundom, `100` równa się 10 sekundom. Jest to częsta błędna konfiguracja — administratorzy oczekujący 50-sekundowego limitu czasu, którzy ustawią `timeout=50`, otrzymają zamiast tego 5-sekundowe okno.
Czy LILO może uruchamiać się z woluminów LVM lub programowego RAID?
Nie. Ponieważ LILO rozwiązuje lokalizacje jądra do bezwzględnych adresów bloków dyskowych w czasie instalacji, nie może obsługiwać warstw abstrakcji wprowadzonych przez LVM lub MD RAID. Partycja `/boot` musi znajdować się na zwykłej partycji bezpośrednio dostępnej przez BIOS. Jest to jeden z głównych powodów architektonicznych, dla których GRUB2 zastąpił LILO w nowoczesnych dystrybucjach Linux.
