4.2 KiB
BIOS o UEFI
Il kernel viene caricato da un programma chiamato bootloader, a sua volta caricato da un firmware preinstallato come il BIOS o UEFI. Una volta caricato, il kernel continua il processo di avvio identificando e caricando l'hardware.
BIOS
Il BIOS (Basic Input/Output System) e' un programma memorizzato in un chip di memoria non volatile collegato alla scheda madre.
I primi 440 byte nel primo dispositivo di archiviazione - seguendo l'ordine definito nel BIOS - sono il primo stadio del bootloader (bootstrap). I primi 512 byte di ogni dispositivo di archiviazione sono denominati MBR e contengono la tabella delle partizioni.
I passaggi per l'avvio di un sistema dotato di BIOS sono:
- Il processo POST (power-on self-test) identifica semplici guasti hardware
- Il BIOS attiva i componenti di base per caricare il sitema
- Il BIOS carica il primo stadio del bootloader dall'MBR (i primi 440 byte nel primo dispositivo di archiviazione)
- Il primo stadio del bootloader richiama il secondo, responsabile del caricamento del kernel.
UEFI
UEFI (Unified Extensible Firmware Interface), e' sempre un firmware, come il BIOS, ma e' in grado di identificare le partizioni e leggere diversi filesystem. Inoltre non si basa sull'MBR, prendendo in considerazioni solo le impostazioni memorizzate nella sua memoria non volatile (NVRAM). Nella partizione ESP (EFI System Partition), di un qualsiasi filesystem compatibile (es. FAT32), sono contenuti dei programmi, chiamati EFI applications, che vengono eseguiti automaticamente o richiamati da un menu d'avvio. Una di queste applicazioni e' il bootloader.
I passaggi per l'avvio di un sistema con UEFI sono:
- Il processo POST (power-on self-test) identifica semplici guasti hardware
- UEFI attiva i componenti di base per caricare il sitema
- UEFI esegue l'applicazione predefinita memorizzata nel filesystem della partizione ESP. Di solito, il bootloader
- Il bootloader carica il kernel.
UEFI supporta una funzione chiamata Secure Boot, che consente l'esecuzione solo di applicazioni EFI firmate, ossia autorizzate dal produttore.
Bootloader
Uno dei piu' utilizzati e' GRUB. Permette di passare dei parametri al kernel, seguendo il modello option=value
.
Alcuni dei parametri:
init
: imposta un iniziatore di sistema alternativo, per esempioinit=/bin/bash
systemd.unit
: imposta il target da attivare, per esempio:systemd.unit=graphical/target
mem
: imposta la qualità di RAM disponibile per il sistemaquiet
: nasconde i messaggi di avvioroot
: imposta la partizione di rootrootflags
: opzioni di mount per il filesystem di root
I parametri del kernel devono essere aggiunti al file /etc/default/grub
alla riga GRUB_CMDLINE_LINUX
per renderli persistenti.
Una volta che il sistema e' in esecuzione, i parametri usati per la sessione corrente sono visibili nel file:
cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.11.2-amd64 root=/dev/mapper/pc--vg-root ro systemd.show_status=1 quiet splash
Inizializzazione del sistema
L'inizializzazione del SO inizia quando il bootloader carica il kernel nella RAM. Il kernel aprira' l'initramfs (initial RAM filesystem), un filesystem temporaneo usato durante il processo di avvio. Il suo scopo principale e' quello di fornire i moduli richiesti, in modo che il kernel possa accedere al filesystem root reale del SO.
Il kernel, non appena il filesystem root e' disponibile, montera' tutti i filesystem configurati in /etc/fstab
, quindi eseguira' il primo programma, chiamato init
, responsabile dell'esecuzione di tutti gli script e demoni di inizializzazione del sistema. Solo ora initramfs viene rimosso dalla RAM.
Ispezionare l'inizializzazione
Tutti gli errori generano messaggi. Lo spazio di memoria in cui il kernel memorizza i suoi messaggi e' chiamato kernel ring buffer.
Un comando per visualizzare i messaggi del kernel e' dmesg -T
. Nei sistemi che usano systemd e' possibile usare il comando journalctl -k
. L'opzione -D
puo' essere usata per leggere messaggi di registro al di fuori della cartella /var/log/journal
.
I messaggi di log sono memorizzati in vari file all'interno della directory /var/log/
.