## 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 esempio `init=/bin/bash` - `systemd.unit`: imposta il *target* da attivare, per esempio: `systemd.unit=graphical/target` - `mem`: imposta la qualità di RAM disponibile per il sistema - `quiet`: nasconde i messaggi di avvio - `root`: imposta la partizione di root - `rootflags`: 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: ```bash 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/`.