Initramfs/Guida
Più e più sistemi richiedono un initramfs per essere avviati correttamente. In questa guida tratteremo il concetto di initramfs, nonchè come crearlo e gestirlo correttamente.
Concetti su initramfs
Introduzione
Per molti utenti, un sistema initramfs non è importante. Il loro sistema utilizza uno schema di partizionamento semplice senza drivers o impostazioni particolari (tipo file systems criptati), così il kernel Linux è interamente capace di gestire il controllo del binario init nel loro sistema. Ma per molti sistemi, un initramfs è obbligatorio.
Processo di avvio del linux
Da quando il kernel Linux ha il controllo sul sistema (dopo essere stato caricato dal boot loader), esso prepara la sua struttura di memoria e i drivers. Esso poi passa il controllo a un'applicazione (generalmente init) il cui compito è quello di preparare ulteriormente il sistema e assicurarsi che, alla fine del processo di avvio, tutti i servizi necessari siano attivi e l'utente sia in grado di accedere. L'applicazione init lo fa lanciando, tra gli altri servizi, il demone udev che caricherà e preparerà ulteriormente il sistema in base ai dispositivi rilevati. Quando udev viene lanciato, tutti i file systems rimanenti che non sono stati montati vengono montati e i restanti servizi vengono avviati.
Per i sistemi in cui tutti i necessari files e strumenti risiedono nello stesso file system, l'applicazione init può controllare perfettamente il successivo processo di avvio. Ma quando ci sono multipli file systems (o sono presenti più installazioni), questo potrebbe diventare un pò più complicato.
- Quando la partizione /usr è in un file system separato, i tools e i drivers che hanno files memorizzati all'interno di tale partizione /usr non possono essere utilizzati a meno che /usr non viene resa disponibile. Non è possibile, quindi, avviare il sistema senza questi necessari tools.
- Se il file system root è criptato, il kernel Linux non sarà in grado di trovare l'applicazione init, risultando un sistema inavviabile.
La soluzione a questo problema è da tempo quella di utilizzare un "initrd" (initial root device).
L'initial root disk
L'initrd è una struttura disco in-memory (ramdisk) che contiene i tools e gli script necessari per montare i file systems occorrenti "prima" che il controllo passi all'applicazione init nel file system root. Il kernel Linux avvia lo script setup (generalmente chiamato linuxrc, ma questo nome non è obbligatorio) in tale root disk, il quale prepara il sistema, passa al file system radice reale e chiama init.
Sebbene il metodo initrd era proprio quello necessario, esso aveva alcuni inconvenienti:
- Si tratta di un dispositivo a blocchi a tutti gli effetti, che richiede il sovraccarico di un intero file system; ha una dimensione fissa. La scelta di un initrd troppo piccolo comporta che tutti gli script necessari non possono essere eseguiti correttamente. Renderlo troppo grande, invece, sprecherà solo memoria.
- Poiché si tratta di un vero e proprio dispositivo statico, esso consuma memoria cache nel kernel Linux ed è attivo nei metodi di gestione dei file in uso (come il paging) e questo rende initrd un consumatore di memoria.
Per risolvere questo problema (che per alcuni forse è fortemente chiamato problema), è stato creato l'initramfs.
L'initial ram file system
Un initramfs ' un initial ram file system situato su "tmpfs" (un file system in memoria leggero e di dimensione flessibile), il quale non utilizza un dispositivo di blocco separato (cosicchè non viene fatta nessuna attività di caching e tutte le attività mensionate prima scompaiono). Proprio come initrd, esso contiene i tools e gli script necessari per montare i file systems prima del binario init nel file system radice reale. Questi tools possono essere strati di astrazione di decrittazione (per i file systems crittografati), gestori di volume logico, software RAID, driver bluetooth situati su file system loader, etc.
Il contenuto dell'initramfs è realizzato con la creazione di un archivio cpio. cpio è una vecchia (ma testata) soluzione di archivio dei file (e i suoi files di archivio risultanti sono chiamati files cpio). cpio è comparabile all'archiviatore tar. La scelta di cpio, però, è stata fatta perchè è più semplice da implementare (code-wise) e supporta i files di dispositivo che invece non supporta tar.
Tutti i files, tools, le librerie, le impostazioni di sistema (se applicabili), etc. sono messi all'interno dell'archivio cpio. Questo archivio viene quindi compresso utilizzando l'utilità gzip e memorizzato accanto al kernel Linux. Il boot loader, quindi, lo passerà al kernel Linux all'atto dell'avvio così che il kernel saprà che è necessario un initramfs.
Una volta individuato, il kernel Linux creerà un file system tmpfs, estrarrà il contenuto dell'archivio su di esso, e lancerà lo script init collocato nella radice del file system tmpfs. Questo script monterà il file system radice reale (dopo essersi accertato di poterlo montare, per esempio caricando moduli aggiuntivi, preparando la crittografia, etc.) come pure altri file system vitali (ad esempio /usr e /var).
Una volta montati il file system root e gli altri file systems vitali, lo script init dalla initramfs passerà la radice verso il file system root reale e finalmente chiamerà il binario /sbin/init in questo sistema per continuare il processo di avvio.
Creare un initramfs
Introduzione e configurazione del bootloader
Per creare un initramfs è importante conoscere quali drivers addizionali, scripts e tools saranno necessari per avviare il sistema. Per esempio, se viene utilizzato LVM, LVM tools è necessario che sia presente su initramfs. Allo stesso modo, se il software RAID viene utilizzato, l'utilità mdadm sarà richiesta, etc.
The root disk and root filesystem needs to be accessible
In practice, this usually means CONFIG_SATA_AHCI or CONFIG_BLK_DEV_NVME (for the disk), and CONFIG_EXT4_FS (the filesystem) should ideally be built-in [=y] to the kernel; otherwise having these as modules [=m] will require these modules to be loaded by the initramfs first so booting can continue.
If LVM is used, then LVM tools will be needed in the initramfs.
If software RAID is used, mdadm utilities will be needed, or DMRAID, etc... ZFS and BTRFS would also require consideration here.
Alcuni strumenti esistono per aiutare gli utenti a creare un initramfs (compreso l'archiviatore cpio) per i loro sistemi. Ma per coloro che cercano totale controllo può pure essere facile creare initramfs personalizzati.
Una volta creato, la configurazione del bootloader dovrà essere aggiustata per informarlo che dovrà essere utilizzato un initramfs. Per esempio, se l'initramfs è memorizzato come /boot/initramfs-3.2.2-gentoo-r5, la configurazione in /boot/grub/grub.conf può essere come la seguente:
Usually this is done by re-generating the config file grub-mkconfig -o /boot/grub/grub.cfg
For instance, if the initramfs file is stored as /boot/initramfs-5.15.32-gentoo-r1.img, then afterwards, the GRUB configuration in /boot/grub/grub.cfg would look somewhat like the following:
title Gentoo Linux 3.2.2-r5
root (hd0,0)
kernel /boot/kernel-3.2.2-gentoo-r5
initrd /boot/initramfs-3.2.2-gentoo-r5
Utilizzare genkernel
L'utilità di costruzione del kernel di Gentoo, genkernel, può essere usata per generare un initramfs, anche se genkernel non è stato utilizzato per configurare e costruire il kernel.
Per utilizzare genkernel per generare l'initramfs, è consigliato che tutti i drivers e codici necessari per montare i file systems / e /usr siano inclusi nel kernel (non come moduli). Quindi, invocare genkernel come segue:
If modules are required in the initramfs, call genkernel as follows:
root #
genkernel --install --no-ramdisk-modules initramfs
A seconda del sistema, possono essere necessarie una o più delle seguenti opzioni:
Opzione | Descrizione |
---|---|
--disklabel
|
Aggiunge il supporto per LABEL= impostandolo in /etc/fstab
|
--dmraid
|
Aggiunge il supporto per l'hardware RAID contraffatto. |
--firmware
|
Aggiunge il codice firmware rilevato nel sistema. |
--gpg
|
Aggiunge il supporto GnuPG. |
--iscsi
|
Aggiunge il supporto per iSCSI. |
--luks
|
Aggiunge il supporto per i contenitori di crittografia LUKS. |
--lvm
|
Aggiunge il supporto per LVM. |
--mdadm
|
Aggiunge il supporto per il software RAID. |
--multipath
|
Aggiunge il supporto per gli accessi multipli I/O verso un SAN. |
--zfs
|
Aggiunge un supporto ZFS. |
Uns volta terminato, il risultante file initramfs sarà memorizzato in /boot.
Utilizzando dracut
L'utilità dracut è creata al solo scopo di gestire i files initramfs. Essa utilizza un approccio altamente modulare su quale supporto deve essere incluso e su quale non deve essere incluso.
E' consigliabile impostare (o disimpostare) i moduli necessari. Dopo aver configurato la variabile DRACUT_MODULES in /etc/portage/make.conf, eseguire emerge dracut per installare l'utilità Dracut.
root #
emerge --ask sys-kernel/dracut
Il passo successivo è di configurare dracut editando il file /etc/dracut.conf. Nella configurazione del file, il quale è ben commentato, al fine di aggiungere il supporto per i moduli necessari.
Una volta configurato, creare un initramfs eseguendo dracut come segue:
root #
dracut
L'immagine risultante supporta sistemi di avvio generici basati sulla configurazione che si trova in /etc/dracut.conf. E' anche possibile generare un initramfs specificatamente su misura per il "proprio" sistema (lo stesso dracut prova ad individuare i tools necessari, drivers, ecc... dal sistema esistente). Se i moduli e i drivers sono costruiti dentro al kernel (non come moduli separati e riferimenti al firmware), può essere aggiunta l'opzione --no-kernel
:
root #
dracut --host-only --no-kernel
Per maggiori informazioni consultare il manuale dracut e il manuale dracut.cmdline:
user $
man dracut
user $
man dracut.cmdline
Vedi anche
Risorse esterne
File ramfs-rootfs-initramfs.txt all'interno della documentazione del kernel del Linux.