# Initrd

In informatica initrd (initial ramdisk) è un piccolo file system temporaneo che funge da file system root montato in memoria da Linux e da altri sistemi operativi Unix-like nella fase iniziale della loro procedura di avvio (boot). L'initrd è reso accessibile al kernel da un bootloader. È stato introdotto in Linux a partire dalla versione 2.6 del kernel.

## Funzionamento

Dato che in un sistema Linux, per poter eseguire il boot, il kernel deve montare il file system root, se si usa un initrd, il kernel carica prima un file initrd e lo monta nella RAM come RAM disk, poi lo utilizza come parte del processo di avvio. Infine all'avvio della macchina procederà al montaggio del file system root.
Infatti la funzione di initrd è quella di fornire al kernel i moduli che potrebbero non essere presenti nel kernel stesso, impedendo a quest'ultimo di riconoscere, e quindi di far funzionare, una determinata periferica. Successivamente il kernel provvederà a montare il filesystem root e a eseguire il programma init, che completerà l'avvio del sistema operativo.

## Contenuto

I moduli che devono essere caricati con initrd sono tipicamente:
* se il filesystem radice è montato da un dispositivo di memoria di massa locale:
** i driver necessari al funzionamento del dispositivo in cui è presente il file system radice, ad esempio IDE o SCSI o USB.
** i driver di basso livello per le specifiche periferiche necessarie ad accedere a questi dispositivi
** i driver di eventuali livelli di virtualizzazione del filesystem, come RAID o LVM
* se la partizione radice viene montata via rete:
** il supporto di rete.
** il driver della scheda di rete.
** il supporto per il filesystem di rete utilizzato.

## Formato

Il file initrd può essere l'immagine di un file system, possibilmente compressa con gzip, oppure un file di archivio (tipicamente in formato cpio) che viene espanso dal kernel in un filesystem in ram TMPFS. Quest'ultima soluzione è più flessibile, perché permette di aggiungere file durante la vita del filesystem, ad esempio scaricando dalla rete i componenti necessari di un sistema di installazione.

## Motivazione

È possibile far partire un sistema Linux senza usare un initrd, ma questo normalmente richiede la compilazione di un kernel specifico per l'installazione.
Infatti, se non si usa un initrd non si possono caricare moduli del kernel prima di aver montato la partizione radice, e quindi la partizione radice deve poter essere montata utilizzando solo moduli che sono compilati nel kernel. Quindi un kernel generico dovrebbe contenere il supporto necessario a montare qualsiasi tipo di partizione radice, e finirebbe così per contenere moltissimi moduli non necessari.
L'utilizzo di un initrd permette invece alle distribuzioni Linux di fornire un kernel precompilato con tutte le funzionalità realizzate come moduli, e di costruire per ciascuna installazione un initrd contenente i moduli necessari per montare il filesystem radice su quella particolare installazione.

## Creazione

Il programma di solito utilizzato per creare il file initrd è mkinitrd. Tuttavia, esistono alcune alternative come Yaird o mkinitfs. Il processo di installazione di una distribuzione normalmente produce automaticamente un initrd adatto alla specifica installazione.

## Altri utilizzi

Un initrd di dimensioni adeguate può essere usato anche per svolgere alcune funzioni autonomamente, come:
* installare un nuovo sistema operativo, copiando file da un dispositivo rimovibile, da un altro disco fisso o dalla rete alla memoria di massa
* fornire funzionalità di emergenza per ripristinare un sistema danneggiato al punto da non poter essere avviato ("rescue")
* fornire funzionalità di analisi di un sistema compromesso, quando gli strumenti installati sul sistema sono potenzialmente compromessi, vedi informatica forense