initrd/initramfs è facoltativo e non obbligatorio. bzImage è la pura immagine del kernel e può essere avviato direttamente dal bootloader. Tuttavia potrebbe essere necessario eseguire alcune attività (caricamento dei moduli del filesystem, driver per l'accesso al disco, montaggio del filesystem di root da alcuni supporti intercambiabili senza nome/percorso fisso, ecc.) che normalmente richiederebbero l'accesso a un filesystem e agli strumenti dello spazio utente.
Questo è ciò che initramfs è per:è un archivio CPIO che viene collegato all'immagine del kernel (l'immagine del kernel è il contenitore per initramfs non viceversa) nell'immagine del kernel stessa o dal bootloader al momento dell'avvio.
Quell'archivio CPIO contiene un rootfs iniziale con i moduli richiesti per configurare tutti i dispositivi per accedere al filesystem root appropriato e alcuni programmi per identificare quei dispositivi, caricare i moduli, eseguire alcune altre attività di avvio rimontare il filesystem root corretto su / e avviare /sbin /init
initrd è simile, con la differenza principale che è un'immagine del filesystem, che può essere e di solito è compressa. Il kernel deve avere il supporto per il filesystem utilizzato integrato e monterà questa immagine come /.
inizialePoiché CPIO è più semplice di diversi ordini di grandezza, initramfs è preferito a initrd, in quanto ciò risparmia sia il requisito per qualsiasi modulo del filesystem da incorporare sia rende anche più facile la creazione di initramfs. Invece di dover creare un'immagine ext2, montare loopdevice e popolarla, si riduce a una semplice creazione di un archivio, non diversamente dall'uso di tar.
Tuttavia, se compili il tuo kernel con tutti i driver e i moduli richiesti incorporati nell'immagine del kernel e il tuo dispositivo del file system root ha un nome fisso nel sistema, non hai bisogno di un initramfs poiché il kernel può fare le cose da solo allora.
Esempio minimo di QEMU + Buildroot
Ecco un minimo esempio concreto che mostra che initrd non è obbligatorio:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd
Con questa configurazione, possiamo facilmente eseguire due comandi QEMU funzionanti di tipo:
qemu-system-x86_64 -drive file=rootfs.ext2
e:
qemu-system-x86_64 -initrd rootfs.cpio
Dove:
rootfs.ext2
erootfs.cpio
sono fondamentalmente lo stesso filesystem root, ma in formati diversi- il primo comando ha un disco rigido e nessun
-initrd
- il secondo comando un
-initrd
ma nessun disco rigido
In entrambi i casi, Linux si avvia correttamente, tranne che nel -initrd
system, le scritture dei file non sono persistenti poiché tutto è in memoria.