## 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/`. 