Ce Este LILO (Linux Loader)? Arhitectură, Configurare și Comparație cu GRUB
LILO (Linux Loader) este un bootloader vechi pentru Linux și sisteme de operare de tip Unix, care încarcă nucleul direct dintr-o adresă de disc stocată la momentul instalării, fără a necesita suport pentru drivere de sistem de fișiere în timpul secvenței de pornire. Funcționează în etapa pre-OS — fie din Master Boot Record (MBR), fie dintr-un sector de boot al partiției — și transferă controlul CPU către nucleul Linux după ce îl încarcă în memorie.
Pentru majoritatea sistemelor de producție de astăzi, LILO a fost înlocuit de GRUB2. Cu toate acestea, înțelegerea funcționării sale interne rămâne esențială pentru inginerii care întrețin infrastructuri vechi, sisteme embedded sau servere izolate de rețea, unde un bootloader minimal și determinist reprezintă o alegere arhitecturală deliberată.
Cum funcționează procesul de boot LILO la nivel scăzut
Când o mașină pornește, BIOS-ul execută POST (Power-On Self-Test), apoi citește primii 512 octeți ai discului bootabil — MBR-ul. Dacă LILO este instalat acolo, acei 512 octeți conțin loader-ul de primă etapă al LILO. Secvența se desfășoară astfel:
- Etapa 1 (codul MBR): BIOS-ul încarcă 512 octeți din MBR în memorie la adresa `0x7C00` și transferă execuția către acesta. Acest mic stub știe un singur lucru: să localizeze și să încarce Etapa 2.
- Etapa 2 (fișierul map): LILO citește fișierul său map (`/boot/map`), care a fost scris la momentul instalării de comanda `lilo`. Acest map conține adresele absolute ale blocurilor de disc ale fiecărei imagini de nucleu și ale intrărilor chain-loader. Nu are loc nicio analiză a sistemului de fișiere — LILO folosește adrese brute de sectoare LBA/CHS.
- Prezentarea meniului de boot: Dacă `prompt` este setat în `lilo.conf`, LILO afișează un meniu text. Directiva `timeout` controlează cât timp așteaptă înainte de a folosi opțiunea implicită.
- Încărcarea nucleului: LILO citește imaginea nucleului de la adresele de disc precalculate în memoria inferioară, apoi o decomprimă și o relocalizează.
- Transferul controlului: LILO transmite parametrii liniei de comandă ai nucleului și locația discului RAM inițial (`initrd`) către nucleu, care preia inițializarea hardware-ului.
Implicație arhitecturală critică: Deoarece LILO codifică adresele absolute ale blocurilor de disc la momentul instalării, orice modificare a fișierului nucleului, a structurii partiției sau a `lilo.conf` necesită rularea din nou a `/sbin/lilo` pentru a regenera map-ul. Uitarea acestui pas după o actualizare a nucleului este cea mai frecventă cauză a eșecurilor de boot LILO.
Configurarea LILO: O analiză aprofundată a `/etc/lilo.conf`
LILO este configurat în întregime prin `/etc/lilo.conf`. Mai jos este un exemplu reprezentativ pentru producție cu adnotări care acoperă opțiuni pe care documentația originală le omite frecvent:
“`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
“`
După fiecare editare, aplicați modificările cu:
“`bash
sudo /sbin/lilo -v
“`
Indicatorul `-v` activează ieșirea detaliată, afișând fiecare intrare de nucleu și chain-loader care este mapată. Verificați întotdeauna codul de ieșire — o valoare diferită de zero înseamnă că map-ul nu a fost scris cu succes.
Parametri de configurare frecvent omișiți
- `lba32`: Fără această directivă pe discuri mai mari de 8 GB, LILO revine la adresarea CHS și nu va reuși să localizeze nucleele dincolo de limita de 8 GB. Aceasta este o modalitate de eșec silențios care a cauzat nenumărate întreruperi de producție pe hardware vechi.
- `compact`: Reduce timpul de boot pe discurile rotative prin comasarea citirilor de sectoare adiacente. Incompatibil cu unele scenarii de boot de pe dischetă.
- `vga=`: Transmite un parametru de mod video nucleului. Util pentru servere headless unde doriți o rezoluție specifică de framebuffer în consolă.
- `append=`: Transmite parametri arbitrari ai liniei de comandă nucleului. Echivalent cu argumentele liniei `linux` din GRUB.
- `password=`: Restricționează bootarea unei intrări specifice cu o parolă. Rețineți că această parolă este stocată în text simplu în `lilo.conf`, deci permisiunile fișierului (`chmod 600`) sunt obligatorii.
Scenarii de instalare LILO
Instalarea în 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
“`
Instalarea într-un sector de boot al partiției
Când utilizați un manager de boot precum System Commander, este posibil să doriți LILO pe sectorul de boot al unei partiții, nu în MBR:
“`ini
boot=/dev/sda1 # Install to partition boot sector, not MBR
“`
Aceasta este, de asemenea, abordarea corectă atunci când LILO este chain-loaded de un alt bootloader.
Eliminarea LILO
Pentru a restaura MBR-ul original (de exemplu, înainte de a-l înlocui cu 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
“`
Nu utilizați niciodată `dd if=/dev/zero` pe întregul MBR — va distruge tabela de partiții.
LILO vs. GRUB: Comparație tehnică
Tabelul următor acoperă dimensiunile care contează cel mai mult pentru un administrator de sisteme care alege între cele două, inclusiv câteva nuanțe absente din majoritatea comparațiilor:
| Caracteristică | LILO | GRUB2 |
|---|
| — | — | — |
|---|
| **Conștientizarea sistemului de fișiere** | Niciuna — folosește adrese brute ale blocurilor de disc | Suport complet pentru ext2/3/4, XFS, Btrfs, ZFS, FAT, NTFS |
|---|
| **Metoda de aplicare a configurației** | Trebuie rulat `/sbin/lilo` după fiecare modificare | Citește `grub.cfg` dinamic la momentul bootării |
|---|
| **Gestionarea actualizărilor nucleului** | Rerulare manuală necesară; ușor de uitat | `update-grub` / `grub-mkconfig` automatizează acest lucru |
|---|
| **Editarea parametrilor de boot** | Nu este posibilă la momentul bootării | Editor interactiv în meniul de boot (apăsați `e`) |
|---|
| **Suport UEFI** | Nu | Da (GRUB2 suportă UEFI Secure Boot) |
|---|
| **Tabela de partiții GPT** | Limitată / nesigură | Suport complet |
|---|
| **Limita dimensiunii discului** | 8 GB fără `lba32`; practic nelimitat cu aceasta | Nicio limită practică |
|---|
| **Boot din rețea (PXE)** | Nu | Da (prin modulele `grub-efi` și tftp) |
|---|
| **Modul de recuperare/salvare** | Niciunul încorporat | Shell de recuperare încorporat |
|---|
| **Scripting în configurație** | Nu | Da (scripting de tip bash în `grub.cfg`) |
|---|
| **Suport Initrd/initramfs** | Da | Da |
|---|
| **Detectarea multi-OS** | Numai intrări manuale | `os-prober` detectează automat sistemele de operare instalate |
|---|
| **Dimensiunea binară / amprenta** | Foarte mică (~20 KB) | Mai mare (~1–4 MB cu module) |
|---|
| **Dezvoltare activă** | Abandonat (ultima versiune în 2015) | Menținut activ |
|---|
| **Secure Boot** | Nu | Da (prin shim + GRUB semnat) |
|---|
Verdict pentru sistemele de producție: GRUB2 este alegerea corectă pentru orice sistem care rulează un nucleu mai nou decât aproximativ 3.x, folosind GPT, UEFI, LVM sau software RAID. Propunerea de valoare a LILO astăzi este limitată la medii embedded sau vechi, unde modelul său de încărcare determinist, agnostic față de sistemul de fișiere, reprezintă un avantaj mai degrabă decât o limitare.
Când LILO este încă instrumentul potrivit
În ciuda vârstei sale, LILO rămâne adecvat în scenarii specifice:
- Sisteme Linux embedded unde amprenta bootloader-ului trebuie să fie sub 32 KB și locația nucleului nu se schimbă niciodată.
- Hardware vechi (anterior anului 2000) unde modulele GRUB2 depășesc memoria disponibilă sau BIOS-ul are probleme de compatibilitate cu încărcarea în etape a GRUB.
- Medii forensice și de recuperare unde un bootloader minimal și cunoscut ca funcțional este preferabil unuia complex cu capacități de scripting.
- Sisteme izolate de rețea unde simplitatea și auditabilitatea modelului de configurare plat al LILO reduc suprafața de atac.
- Scopuri educaționale — codul sursă și secvența de boot ale LILO sunt semnificativ mai simple decât cele ale GRUB2, făcându-l un subiect excelent pentru cursurile de internale ale sistemelor de operare.
Pentru orice implementare modernă — fie că provizionați un mediu de VPS Hosting, configurați un Server Dedicat sau configurați un stack de dezvoltare pe Găzduire Web Shared — GRUB2 este alegerea implicită și corectă pentru bootloader.
Moduri comune de eșec LILO și diagnosticare
Înțelegerea codurilor de eroare ale LILO este esențială pentru recuperare. LILO afișează un șir parțial din `LILO` în timpul bootării pentru a indica progresul:
| Caractere afișate | Etapă atinsă | Cauza probabilă a eșecului |
|---|
| — | — | — |
|---|
| _(nimic)_ | MBR neîncărcat | BIOS-ul nu găsește dispozitivul bootabil |
|---|
| `L` | Etapa 1 încărcată | Eroare la încărcarea Etapei 2; cale greșită a fișierului map |
|---|
| `LI` | Etapa 2 încărcată | Binarul Etapei 2 incompatibil sau corupt |
|---|
| `LIL` | Fișierul map găsit | Fișierul map corupt sau la adresă greșită |
|---|
| `LIL?` | Fișierul map încărcat | Fișierul map încărcat de la adresă greșită |
|---|
| `LILO` | Încărcare completă | Meniul de boot afișat cu succes |
|---|
Procedura de recuperare
Dacă LILO nu reușește să booteze după o actualizare a nucleului:
- Bootați de pe un CD live sau un mediu de recuperare.
- Montați partiția rădăcină: `mount /dev/sda1 /mnt`
- Chroot: `chroot /mnt`
- Verificați că `/etc/lilo.conf` indică calea corectă a nucleului.
- Rulați din nou: `/sbin/lilo -v`
- Reporniți.
Dacă fișierul map însuși este corupt, este posibil să fie nevoie să reinstalați pachetul `lilo` pentru a restaura `/boot/boot.b` înainte de a rula din nou comanda.
Considerații de securitate
LILO precede modelele moderne de securitate a firmware-ului și are mai multe limitări importante:
- Fără suport Secure Boot: LILO nu poate participa în lanțul de încredere UEFI Secure Boot. Pe sistemele unde verificarea integrității firmware-ului este necesară, GRUB2 cu un shim semnat este obligatoriu.
- Slăbiciuni ale protecției prin parolă: Directiva `password=` din `lilo.conf` stochează credențialele în text simplu. Restricționați strict permisiunile fișierului (`chmod 600 /etc/lilo.conf`, deținut de root).
- Vulnerabilitate la accesul fizic: Fără o parolă BIOS/UEFI, un atacator cu acces fizic poate boota de pe suporturi externe și ocoli complet LILO.
- Fără integrare TPM: LILO nu poate efectua measured boot sau interacționa cu un TPM pentru atestare, spre deosebire de GRUB2 cu module adecvate.
Pentru serverele unde criptarea discului, measured boot sau atestarea de la distanță fac parte din arhitectura de securitate — cum ar fi un VPS cu cPanel sau un Server Dedicat întărit — aceste limitări fac LILO inadecvat.
Migrarea de la LILO la GRUB2
Dacă întrețineți un sistem vechi care rulează încă LILO și trebuie să migrați:
“`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
“`
Nu eliminați pachetul `lilo` până când nu ați confirmat că GRUB2 bootează cu succes. Păstrați un USB de recuperare live disponibil în timpul migrării.
Dacă serverul dvs. folosește Panouri de Control VPS care interacționează cu bootloader-ul (de exemplu, pentru comutarea nucleului sau modul de recuperare), verificați compatibilitatea panoului cu GRUB2 înainte de migrare.
Concluzii tehnice cheie: Matricea de decizie
Folosiți această listă de verificare pentru a determina dacă LILO este adecvat pentru mediul dvs.:
Folosiți LILO dacă:
- Sistemul folosește firmware BIOS (nu UEFI)
- Discul folosește tabela de partiții MBR (nu GPT)
- Nucleul și structura partiției sunt statice și se schimbă rar
- Amprenta bootloader-ului trebuie minimizată (sisteme embedded)
- Studiați internalele secvenței de boot în scopuri educaționale
Nu folosiți LILO dacă:
- Sistemul folosește firmware UEFI (LILO este incompatibil)
- Discul folosește partiționare GPT
- Nucleele sunt actualizate regulat prin managerul de pachete
- Necesitați Secure Boot, atestare TPM sau measured boot
- Sistemul folosește LVM, software RAID sau Btrfs pentru sistemul de fișiere rădăcină
- Aveți nevoie de editarea interactivă a parametrilor de boot pentru depanare
- Sistemul este conectat la internet sau supus cerințelor de conformitate în materie de securitate
Regulă operațională: Ori de câte ori editați `/etc/lilo.conf` sau actualizați un nucleu pe un sistem gestionat de LILO, rularea `/sbin/lilo -v` nu este opțională — este la fel de obligatorie ca editarea în sine. Automatizați acest lucru cu un hook post-instalare al nucleului dacă managerul dvs. de pachete îl suportă.
Întrebări frecvente
Ce se întâmplă dacă actualizez nucleul Linux pe un sistem LILO fără a rula `/sbin/lilo`?
Fișierul map al LILO indică în continuare adresele blocurilor de disc ale nucleului vechi. Sistemul va boota nucleul anterior ca și cum actualizarea nu s-ar fi produs niciodată — sau, dacă imaginea nucleului vechi a fost suprascrisă, va încărca date corupte și va intra în panică. Rulați întotdeauna `/sbin/lilo -v` imediat după orice actualizare a nucleului.
Poate LILO să booteze de pe un disc partiționat GPT?
Nu în mod fiabil. LILO a fost proiectat pentru tabele de partiții MBR. Discurile GPT folosesc un MBR de protecție care permite tehnic instalarea LILO, dar LILO nu are conștientizarea intrărilor de partiții GPT și nu poate localiza în mod fiabil partițiile dincolo de primele patru. Folosiți GRUB2 pentru orice disc GPT.
Este LILO compatibil cu sistemele UEFI?
Nu. LILO este un bootloader din era BIOS, fără suport pentru aplicații EFI. Pe sistemele UEFI, firmware-ul așteaptă un binar `.efi` în format PE în Partiția de Sistem EFI. LILO nu poate furniza acest lucru. GRUB2, systemd-boot sau rEFInd sunt alegerile corecte pentru UEFI.
Care este diferența dintre valoarea `timeout` a LILO și secundele reale?
Directiva `timeout` este măsurată în zecimi de secundă. O valoare de `50` este egală cu 5 secunde, `100` este egală cu 10 secunde. Aceasta este o configurare greșită frecventă — administratorii care se așteaptă la un timeout de 50 de secunde și setează `timeout=50` vor obține o fereastră de 5 secunde în schimb.
Poate LILO să booteze de pe volume LVM sau software RAID?
Nu. Deoarece LILO rezolvă locațiile nucleului la adrese absolute ale blocurilor de disc la momentul instalării, nu poate gestiona straturile de abstractizare introduse de LVM sau MD RAID. Partiția `/boot` trebuie să se afle pe o partiție simplă accesibilă direct de BIOS. Acesta este unul dintre principalele motive arhitecturale pentru care GRUB2 a înlocuit LILO în distribuțiile Linux moderne.
