Home
L'immagine initramfs PDF Stampa E-mail
Scritto da cloc3   
Venerdì 08 Maggio 2009 13:52

Introduzione

L'elemento più affascinante nel funzionamento di Netlive è certamente l'immagine initramfs.

Naturalmente, i prodotti disponibili in rete forniscono immagini initramfs pronte che si adattano a qualunque situazione di partenza.

Non esiste, quindi una necessità precisa di costruire una immagine initramfs ad hoc.

A ben guardare, però, quegli oggetti sono piuttosto pesanti, proprio per la pretesa di adattarsi in modo automatico a qualunque situazione. Quella del nostro sito, ad esempio, proviene dal progetto live-initramfs, che distribuisce un prodotto estremamente interessante, utilizzabile nei cdrom, nelle chiavette usb, nelle immagini live (e in molto altro ancora). Tuttavia, provando ad utilizzarla, abbiamo incontrato alcuni piccoli problemi che ci hanno costretto ad applicare qualche mini-patch personalizzata e a sopportare alcuni difetti piccoli ma evidenti, che erano causa di qualche rallentamento superfluo. Inoltre, il prodotto debian è talmente caratterizzato che finisce per essere dipendente dalla distribuzione. È sorta così l'occasione per la riflessione presente, che descrive la progettazione di una initramfs un po' più semplice ma, al tempo, più facile da capire, da correggere e da adattare a sistemi esterni.

 

Torna all'inizio

Download

Questo articolo illustra i criteri per la costruzione di una initramfs self-made alternativa a quella ufficiale usata da Netlive. Scarica una copia.

Torna all'inizio

Che cosa è?

Una initramfs è un piccolo ambiente di script che viene caricato insieme al kernel durante il boot, cioè nelle primissime fasi di avvio del computer (early userspace), e che il kernel utilizza immediatamente dopo aver acquisito il controllo della macchina all'avvio. La sua funzione principale è di acquisire l'accesso al software del sistema operativo vero e proprio, contenuto (nel nostro caso) in un disco immagine squashfs. Alla macchina client, infatti, poco importa che questo software risieda su un dispositivo locale (disco rigido, chiavetta usb, cdrom ...), piuttotso che sia distribuito in rete su una condivisione remota.

Una initramfs contiene:

  • un filesystem (solitamente compresso);
  • un insieme minimale di programmi, finalizzati strettamente alle operazioni di avvio;
  • un insieme di moduli del kernel. Può essere la parte più ingombrante, per occupazione di spazio, se si desidera coprire una gamma vasta di dispositivi hardware;
  • uno script di shell, chiamato generalmente init o linuxrc, che esegue le operazioni necessarie al caricamento del sistema.

 

Torna all'inizio

Come deve funzionare

Costruire una immagine initramfs significa essenzialmente scrivere un programma init sufficientemente leggero e sufficientemente versatile per i propri scopi. In questo articolo, si illustra la produzione di una immagine initramfs pulita creata con gli strumenti della distribuzione gentoo, ed ottimizzata per boot da network e o da chiavetta usb.

Obiettivi. Creare una immagine intiramfs capace di:

  • Essere indipendente dalla distribuzione dell'immagine squashfs;
  • Leggere dalla command line di boot i parametri fondamentali per l'avvio;
  • Riconoscere l'hardware sottostante e caricare esclusivamente i moduli strettamente necessari;
  • Utilizzare correttamente aufs, trasformando l'immagine read-only originale in un ambiente read-write confortevole;
  • Garantire un accesso read-write permanente ad alcune cartelle particolari, come /etc, con l'uso corretto di aufs. Questa è una scelta precisa che si distingue nettamente dai comportamenti di live-initramfs. Netlive, attualmente, utilizza lo script configura.sh come unico strumento di personalizzazione del sistema.

Torna all'inizio

Guardarci dentro

È più facile capire cosa sia una initramfs, se si riesce a guardarne una all'interno. Attualmente, le initramfs vengono distribuite in formato cpio, che è una tipologia di archivio poco utilizzzata per altri scopi. L'immagine initramfs disponibile in questo esempio può essere aperta tranquillamente con l'uso del comando cpio, consultando il man ufficiale. Ma, a volte, i documenti in formato cpio possono essere composti da una sequenza di archivi concatenati, che risulta difficile aprire in modo corretto. Nel download, assieme al kernel e all'immagine è distribuito uno scriptino di shell (carota.sh) per digerire anche le immagini initramfs piiù indigeste. Copiare in /usr/local/sbin ed utlizzare così:
 # carota.sh initramfs.gz nomenuovacartella

Torna all'inizio

Cosa contiene

L'immagine initramfs.gz di esempio contiene i seguenti pacchetti:

  • busybox
  • udev
  • zlib
  • pciutils
  • portmap
  • strace
  • moduli del kernel
  • un insieme minimale di dispositivi speciali nella cartella /dev

Si tratta di software estratto da pacchetti tar costruti con una distribuzione gentoo, ma il fatto è del tutto incidentale. L'unica cosa importante è verificare con il comando ldd che ciascun eseguibile possieda tutte le librerie indispensabili. La scelta di busybox per la shell e di strace per eventuale debug è particolamente utile per le fasi di debug. I pochi dispositivi necessari sono stati creati manualmente con il comando mkdev.

Bisogna inoltre popolare adeguatamente:

  • La cartella /lib/modules con i moduli del kernel ritenuti necessari. L'immagine di esempio contiene un numero maniacale di moduli, che è possibile ridurre a piacere. Allo scopo, ricompilare il kernel partendo dal file /proc/config.gz .
  • la cartella /dev con un insieme minimale di dispositivi, che vengono utilizzati prima dell'avvio di udev.

Torna all'inizio

Lo script di init

Il testo esplicito dello script si può leggere comodamente dopo il download.

Nel seguito, sono illustrate alcune delle funzioni principali:

  1. riga 2: La chiamata iniziale a busybox rende disponibili i comandi di shell.
  2. riga 4: la funzione getEnv esegue il parsing della command line, trasformando le coppie chjiave=valore in altrettante variabili d'ambiente.
  3. riga 30: il comando pcimodules riconosce l'hardware e determina il caricamento dei moduli corrispondenti.
  4. riga 30: solo per sistemi Netlive. Viene letto il parametro nfs_root=ip:/percorso_nfs da cmdline. Preventivamente, deve essere attivate la scheda di rete. Si assume che si chiami eth0 e viene attribuito ad essa un numero ip fisso da cmdline. Questo evita l'uso di dhcp e risulta conveniente in un aula di dimensioni ridotte analogo ad un laboratorio scolastico (una ventina di macchine).
  5. riga 40: solo per le chiavette. il parametro UUID, prelevato da cmdline, individua la partizione contente l'immagine squashfs. In questo modo si evita ogni problema legato alla denominazione dei dispositivi /dev/sd*.
  6. I punti 4 e 5 sono l'unica differenza tra l'avvio in modalità nfs e quello in modalità usb local.
  7. riga 52-53: la rootDir è caricata sul percorso /live/image, mentre l'immagine squashfs sul percorso /newroot.
  8. riga 60: manovra utile a caricare, all'interno di /newroot gli stessi driver disponibili nella initrd. Questa operazione è utile per chiavette che vengano utilizzate spesso su macchine diverse e sconosciute e con immaigni squashfs variabili. Per sistemi dove l'hardware è già noto, sarebbe preferibile compilare i moduli hardware built-in e collocare i moduli accessori direttamente sull'immagine squashfs. Si fa presente che la cartella /var/lib/modules è l'oggetto più ingombrante dell'intera initramfs e che il suo caricamento richiede tempi sensibili.
  9. riga 67: la cartella /etc deve essere accesibile in scrittura, affinchè le eventuali modifiche alla configurazione di sistema non vadano perdute allo shutdown. La tecnologia aufs è straordinaria per effettuare questa operazione in un modo efficace e funzionale.Questo implica la costruzione di un apposita cartella save-conf che, all'occorenza, viene creata automaticamente.
  10. riga 72: la pulizia preventiva di alcune regole persistenti di udev può essere salutare.il file 70-persistent-net.rules è specifico gentoo. Da riadattare.
  11. Segue una pulizia generale e l'avvio reale.

Torna all'inizio

La linea di boot

Ecco due esempi di configurazione di boot, rispettivamente per l'utilizzo diskless e per l'utilizzo live-usb (grub).

  • nfs:
    gentoo_server ~ # cat /tftpboot/pxelinux.cfg/default default
    kernel/bzImage append initrd=/kernel/initramfs.gz nfs_root=192.168.0.13:/tftpboot/live squash=nfs.squashfs ipAddress=192.168.0.18
  • usb:
    gentoo-live ~ # cat /boot/grub/grub.conf|grep "title gentoo" -A3
    title usbLive
    root (hd0,6) kernel /boot/bzImage UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx squash=scuola.squashfs AutoLoginUser=user vga=0x315
    initrd /boot/initramfs.gz  

Torna all'inizio

Come cambiarla

Una initramfs si crea popolando una cartella riservata nel proprio ambiente, con tutte le caratteristiche descritte sopra. In alternativa, si può partire da una initramfs funzionante, come quella dell'esempio, e modificarla. Al termine, la nuova cartella deve essere trasformata in un archivio cpio nel modo seguente:

cd cartella_riservata 
find .|cpio -o -Hnewc|gzip -9 -c> ../initramfs.gz

Una modifica utile può essere quella per effettuare il debug. Si ottiene semplicemente aggiungendo nel file init, al punto desiderato la seguente linea:

(( $debug )) && sh -i

 

Torna all'inizio

Adattamenti

Per utilizzare l'immagine squashfs con cui è stato testato questo articolo, è servito aggiungere in /etc/fstab la linea seguente:

/dev/shm /var/run tmpfs mode=755 0 0

altrimenti si verifica un malfunzionamento di nscd, con possibili effetti di rallentamento del sistema. Analogamente, è possibile che occorrano interventi analoghi per implementazioni diverse.

Torna all'inizio

Ultimo aggiornamento Giovedì 30 Agosto 2012 09:55
 
Copyright © 2015 . Tutti i diritti riservati.
Joomla! è un software libero rilasciato sotto licenza GNU/GPL.