Initramfs/Guida

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Initramfs/Guide and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어


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.

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 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.

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:

FILE grub.confExample entry in grub.conf for booting with an initramfs
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:

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.

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

  • Initramfs nel Wiki officiale di Gentoo.
  • Dracut nel Wiki officiale di Gentoo.

Risorse esterne

File ramfs-rootfs-initramfs.txt all'interno della documentazione del kernel del Linux.