Initramfs/Guide/it

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.

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 nel loro sistema. Ma per molti sistemi, un initramfs è obbligatorio.

Il concetto chiave per comprendere cos'è un initramfs (o per cosa è necessario) è di capire come lavora il processo di avvio del Linux, anche in un approccio di alto livello.

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 ) 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 lo fa lanciando, tra gli altri servizi, il demone  che caricherà e preparerà ulteriormente il sistema in base ai dispositivi rilevati. Quando 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  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.


 * When the partition is on a separate file system, tools and drivers that have files stored within  cannot be used unless  is available. If those tools are needed to make  available, then we cannot boot up the system.


 * If the root file system is encrypted, then the Linux kernel will not be able to find the application, resulting in an unbootable system.

The solution for this problem has since long been to use an initrd (initial root device).

The initial root disk
The initrd is an in-memory disk structure (ramdisk) that contains the necessary tools and scripts to mount the needed file systems before control is handed over to the application on the root file system. The Linux kernel triggers the setup script (usually called but that name is not mandatory) on this root disk, which prepares the system, switches to the real root file system and then calls.

Although the initrd method is all that is needed, it had a few drawbacks:


 * It is a full-fledged block device, requiring the overhead of an entire file system; it has a fixed size. Choosing an initrd that is too small and all needed scripts cannot fit. Make it too big and memory will be wasted.


 * Because it is a real, static device it consumes cache memory in the Linux kernel and is prone to the memory and file management methods in use (such as paging), this makes initrd greater in memory consumption.

To resolve these (for some perhaps hardly called) problems, the initramfs was created.

The initial ram file system
An initramfs is an initial ram file system based on tmpfs (a size-flexible, in-memory lightweight file system), which also did not use a separate block device (so no caching was done and all overhead mentioned earlier disappears). Just like the initrd, it contains the tools and scripts needed to mount the file systems before the binary on the real root file system is called. These tools can be decryption abstraction layers (for encrypted file systems), logical volume managers, software raid, bluetooth driver based file system loaders, etc.

The content of the initramfs is made by creating a cpio archive. is an old (but proven) file archiver solution (and its resulting archive files are called cpio files). cpio is definitely comparable to the archiver. The choice of here was because it was easier to implement (code-wise) and supported (back then) device files which  could not.

All files, tools, libraries, configuration settings (if applicable), etc. are put into the cpio archive. This archive is then compressed using the utility and stored alongside the Linux kernel. The boot loader will then offer it to the Linux kernel at boot time so the kernel knows an initramfs is needed.

Once detected, the Linux kernel will create a tmpfs file system, extract the contents of the archive on it, and then launches the script located in the root of the tmpfs file system. This script will then mount the real root file system (after making sure it can mount it, for instance by loading additional modules, preparing an encryption abstraction layer, etc.) as well as vital other file systems (such as and  ).

Once the root file system and the other vital file systems are mounted, the script from the initramfs will switch the root towards the real root file system and finally call the  binary on that system to continue the boot process.

Introduction and bootloader configuration
To create an initramfs, it is important to know what additional drivers, scripts and tools will be needed to boot the system. For instance, if LVM is used, then LVM tools will be needed in the initramfs. Likewise, if software RAID is used, utilities will be needed, etc.

Some tools exist that help users create initramfs (compressed archives) for their system. But for those who want total control can easily create personal, custom initramfs images as well.

Once created, the bootloader configuration will need adjusted to inform it an initramfs is to be used. For instance, if the initramfs file is stored as, then the configuration in could look like the following:

Using genkernel
Gentoo's kernel building utility,, can be used to generate an initramfs, even if was not used to configure and build the kernel.

To use for generating an initramfs, it is recommended all necessary drivers and code that is needed to mount the  and  file systems be included in the kernel (not as modules). Then, call as follows:

Depending on the system, one or more of the following options may be needed:

When finished, the resulting initramfs file will be stored in.

Using dracut
The utility is created for the sole purpose of managing initramfs files. It uses a highly modular approach on what support is to be included and what is not to be included.

To install, make special care to include support for the correct value(s) in the DRACUT_MODULES variable. This variable can be set in to include support for system specific setups:

It is advisable to set (or unset) the modules needed. After configuring the DRACUT_MODULES variable in, to install the Dracut utility.

The next step is to configure by editing. In the configuration file, which is well commented, in order to add support for needed modules.

Once configured, create an initramfs by calling as follows:

The resulting image supports generic system boots based on the configuration in. It is also possible to generate an initramfs specifically tailored to your system (which tries to detect the needed tools, drivers, etc. from the existing system). If the modules and drivers are built into the kernel (not as separate modules and references to the firmware), then the  option can be added:

For more information, check out the dracut and dracut.cmdline manual pages:

External resources

 * The ramfs-rootfs-initramfs.txt file within the Linux kernel documentation.