>_ Sistemi operativi e Linux

Come si avvia Linux: UEFI, GRUB, kernel, initramfs e systemd

Le fasi dell'avvio di Linux in ordine: firmware UEFI, partizione EFI, GRUB, kernel, initramfs e systemd, e i comandi per la diagnosi dei problemi.

Tra la pressione del pulsante di accensione e la comparsa della schermata di accesso passano pochi secondi, ma in quel tempo si susseguono almeno cinque fasi distinte, ognuna affidata a un componente diverso. Quando un computer non si avvia, sapere in quale fase si è bloccato è metà della soluzione: un errore del firmware si affronta in modo completamente diverso da un servizio che non parte.

Fase 1: il firmware UEFI

All'accensione il processore esegue il firmware della scheda madre. Sui computer prodotti negli ultimi anni è quasi sempre UEFI, che ha sostituito il vecchio BIOS. Il firmware controlla l'hardware di base, poi consulta un elenco di voci di avvio salvato nella memoria della scheda madre e cerca il programma da caricare.

Con UEFI questo programma si trova nella partizione di sistema EFI (ESP), una piccola partizione formattata in FAT32, di solito montata su Linux in /boot/efi. Contiene i bootloader di tutti i sistemi installati, ognuno nella sua cartella, per esempio EFI/ubuntu/ o EFI/Microsoft/. Il comando efibootmgr elenca le voci di avvio registrate nel firmware e il loro ordine.

Se è attivo Secure Boot, il firmware avvia solo programmi firmati con chiavi riconosciute. Le distribuzioni principali usano un piccolo programma intermedio firmato, chiamato shim, che a sua volta verifica GRUB e il kernel.

Fase 2: il bootloader

Il bootloader ha il compito di caricare il kernel in memoria. Il più diffuso è GRUB; alcune distribuzioni usano systemd-boot, più semplice. GRUB mostra il menu da cui scegliere il sistema o una versione precedente del kernel, e legge la propria configurazione da /boot/grub/grub.cfg, un file generato automaticamente: le modifiche vanno fatte in /etc/default/grub e poi applicate con update-grub su Debian e Ubuntu o grub2-mkconfig su Fedora.

Dal menu di GRUB, premendo e su una voce, si possono modificare i parametri del kernel solo per quell'avvio. È uno strumento di diagnosi prezioso: per esempio, togliere quiet splash mostra i messaggi di avvio invece del logo.

Fase 3: il kernel

Il kernel si decomprime, inizializza memoria, processori e gestione dei dispositivi e carica i driver essenziali. A questo punto, però, ha un problema: per montare il disco con il sistema potrebbe servirgli un driver che si trova proprio su quel disco, oppure il disco potrebbe essere cifrato o far parte di un RAID.

Fase 4: l'initramfs

La soluzione è l'initramfs, un piccolo filesystem compresso caricato in memoria dal bootloader insieme al kernel. Contiene i moduli e gli strumenti minimi per trovare e montare il filesystem principale: driver del controller, supporto per LVM, RAID e cifratura LUKS. È qui che, con un disco cifrato, compare la richiesta della passphrase.

Montato il filesystem principale, l'initramfs passa il controllo al vero sistema. Se l'initramfs è danneggiato o non contiene il driver giusto, ci si ritrova in una shell di emergenza con messaggi come «unable to mount root fs». Si rigenera con update-initramfs -u su Debian e Ubuntu o con dracut su Fedora.

Fase 5: systemd

Il kernel avvia il primo processo, con PID 1, che sulla maggior parte delle distribuzioni è systemd. Da qui partono in parallelo tutti i servizi: montaggio dei dischi elencati in /etc/fstab, rete, registro di sistema, gestore dell'accesso grafico. systemd organizza i servizi in target, gruppi che rappresentano uno stato del sistema:

Target Stato
multi-user.target sistema completo senza interfaccia grafica
graphical.target sistema completo con desktop
rescue.target modalità di ripristino con servizi minimi
emergency.target shell di emergenza, quasi nulla avviato

Aggiungendo systemd.unit=rescue.target ai parametri del kernel da GRUB si avvia direttamente in modalità di ripristino: utile quando un servizio blocca l'avvio normale.

Diagnosticare un avvio problematico

Alcuni comandi indispensabili, da usare una volta che il sistema è di nuovo accessibile:

  • journalctl -b -1 -p err mostra gli errori dell'avvio precedente;
  • systemctl --failed elenca i servizi che non sono partiti;
  • systemd-analyze indica quanto tempo ha richiesto ciascuna fase;
  • systemd-analyze blame ordina i servizi per tempo di avvio;
  • dmesg mostra i messaggi del kernel, compresi gli errori dei dispositivi.

Una causa molto frequente di avvio bloccato è una riga di /etc/fstab che fa riferimento a un disco non più presente. L'opzione nofail sulle righe dei dischi esterni o secondari evita che la loro assenza fermi l'avvio.

Capire dove si è fermato

Sintomo Fase probabile
nessun logo del produttore, schermo nero firmware o hardware
«no bootable device» firmware non trova la ESP o la voce di avvio
prompt grub> o grub rescue> bootloader senza configurazione o file mancanti
kernel panic kernel o initramfs
shell di emergenza con errore di montaggio initramfs o /etc/fstab
avvio lento o bloccato su un servizio systemd

In sintesi

  • L'avvio passa per firmware UEFI, bootloader, kernel, initramfs e systemd.
  • I bootloader stanno nella partizione EFI; efibootmgr mostra l'ordine di avvio.
  • La configurazione di GRUB si modifica in /etc/default/grub e si rigenera, non si edita a mano.
  • L'initramfs contiene ciò che serve per montare il disco principale, compresa la cifratura.
  • journalctl -b -1, systemctl --failed e systemd-analyze blame sono i primi strumenti di diagnosi.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche