1.8. /initrd


initrd [initial ram disk] rende possibile il caricamento di un 
disco RAM (RAM disk) da parte del bootloader. Questo disco RAM può
essere poi montato come se fosse il file system root e da questo filesystem
possono essere eseguiti i programmi. In seguito può essere montato un
nuovo file system root da un dispositivo diverso. Il filesystem root precedente
(derivante da initrd) viene quindi spostato su una directory e può
essere successivamente smontato.

initrd è progettato principalmente per consentire che l'avvio del sistema 
avvenga in due fasi, durante le quali prima viene avviato il kernel con una
dotazione minima di driver precompilati, poi vengono caricati ulteriori moduli
da initrd.

Funzionamento
-------------

Usando initrd, il sistema si avvia tipicamente in questo modo:

 1) il bootloader carica il kernel e il disco RAM iniziale
 2) il kernel converte initrd in un disco RAM "normale"
    e libera la memoria usata da initrd
 3) initrd viene montato in modalità di lettura\scrittura come root
 4) viene eseguito /linuxrc (che può essere qualsiasi eseguibile
    valido inclusi gli script di shell, viene eseguito con uid 0 e può
    fare sostanzialmente tutto ciò che può fare init)
 5) linuxrc monta il file system root "reale"
 6) linuxrc assegna il file system root alla directory root
    usando la chiamata di sistema pivot_root
 7) viene eseguita la sequenza di avvio ordinaria (p.es. chiamata di
    /sbin/init) sul file system root
 8) viene rimosso il file system initrd

Si noti che per cambiare la directory root non è necessario smontarla.
È quindi possibile lasciare i processi in esecuzione su initrd durante
questa procedura. Si noti inoltre che i file system montati sotto initrd
continuano ad essere accessibili.

Possibili scenari d'uso
-----------------------

La motivazione principale per implementare initrd è stata quella di
considerare la configurazione modulare del kernel durante l'installazione del
sistema.  La procedura dovrebbe funzionare così:

 1) il sistema viene avviato da un disco floppy o da altri supporti con un
    kernel minimale (p.es. supporto per dischi RAM, initrd, a.out e il
    FS Ext2) e viene caricato initrd
 2) /linuxrc determina cosa è necessario per (1) montare il FS root
    "reale" (cioè tipo di dispositivo, driver, file system) e (2) i
    supporti della distribuzione (p.es. CD-ROM, rete, nastri, ...). 
    Questo può essere fatto chiedendo all'utente, mediante il 
    riconoscimento automatico, o con un approccio ibrido.
 3) /linuxrc carica i moduli del kernel necessari
 4) /linuxrc crea e "popola" il file system root (questo
    non sarà ancora un sistema completamente utilizzabile)
 5) /linuxrc chiama pivot_root per cambiare il file system root e
    execs, attraverso chroot, un programma che prosegue l'installazione
 6) il boot loader è installato
 7) il boot loader è configurato per caricare un initrd con la 
    serie di moduli usati per l'avvio del sistema (p.es. /initrd può
    essere modificato, quindi smontato, infine l'immagine viene scritta
    da /dev/ram0 o /dev/rd/0 in un file)
 8) ora il sistema è avviabile e possono essere eseguiti 
    ulteriori processi d'installazione

Il ruolo chiave di initrd è quello di riusare i dati della
configurazione durante il normale funzionamento del sistema senza richiedere
l'uso di un kernel "generico" dilatato, o dover ricompilare o ricreare un
collegamento al kernel.

Un secondo scenario riguarda le installazioni dove Linux viene eseguito su
sistemi con diverse configurazioni hardware in un singolo dominio di
amministrazione. In questi casi sarebbe meglio generare solo un piccolo gruppo
di kernel (idealmente solo uno) e prendere la parte più piccola
possibile delle informazioni di configurazione specifiche per il sistema. In
questo caso potrebbe essere generato un normale initrd con tutti i moduli
necessari. Quindi dovrebbe essere diverso solo /linuxrc, o un file letto da
questo.

Un terzo scenario è più indicato per il recupero di dischi,
perché informazioni come la posizione della partizione del FS root non
devono essere fornite al momento dell'avvio, ma il sistema caricato da initrd
può chiamare una finestra di dialogo intuitiva, che può anche
effettuare alcuni controlli di integrità (o anche alcune forme di
autorilevmento).

Da ultimo, ma non meno importante, i distributori di CD-ROM possono usarlo per
una migliore installazione da CD, p.es. usando un floppy di avvio e caricando
nel SO un disco RAM più grande attraverso initrd da CD, o avviando
mediante un "caricatore" come LOADLIN o direttamente dal CD-ROM, e caricando il
disco RAM da CD senza bisogno di floppy.