Capiamo come funziona il boot loader per eccellenza di GNU/Linux e proviamo a cambiare il suo aspetto con immagini personalizzate.
All’atto dell’accensione di un computer, le prime verifiche sullo stato del sistema vengono assolte da un programma residente in una opportuna memoria della scheda madre, di fatto un circuito integrato dedicato. Questo programma si chiama BIOS acronimo di Basic Input/Output System e tra i suoi compiti vi è anche l’inizializzazione dell’hardware. Tra il possibile hardware, di interesse per questo articolo, “toccato” dal BIOS vi è anche il disco fisso il quale presenta una specifica zona detta MBR (Master Boot Record).
Al termine delle operazioni di verifica e inizializzazione delle diverse periferiche, l’ultimo compito del BIOS è quello di caricare in memoria, e quindi permetterne l’esecuzione ad opera del processore, il codice contenuto nell’MBR lasciandogli il controllo. La necessità di far eseguire questo codice è dovuta al fatto che il BIOS, aprioristicamente, non può sapere quali e quanti sistemi operativi sono installati (o verranno installati). Il codice in questione è il cosiddetto bootloader ovvero una piccola applicazione che viene installata all’atto dell’installazione di un sistema operativo, ed è qui che entra in scena GRUB.
Acronimo di GRand Unified Bootloader, GRUB è di fatto diventato con il tempo il sostituto “naturale” di LiLO (Linux LOader), un altro bootloader tipico delle distribuzioni GNU/Linux, poiché corregge la mancanza di flessibilità e interattività che si è avvertita negli anni per quest’ultimo.
COME FUNZIONA?
GRUB è caratterizzato da due stadi detti stage (in realtà, come vedremo, sono in numero di tre poiché c’è uno stadio “intermedio”). Il primo stadio, noto come stage 1, è un semplice programma che serve a mostrare la scritta Grub e a caricare il secondo stadio (stage 2) utilizzando, necessariamente, lo stadio intermedio (stage 1.5). Lo stage 1.5 è posto, fisicamente, subito dopo il settore dell’MBR; la sua peculiarità è di poter accedere ad uno specifico filesystem grazie ad alcuni file (programmi) posti all’interno di /boot/grub. Ad esempio, possiamo trovare file del tipo e2fs_stage1_5, fat_stage1_5 etc la cui funzione è di rendere possibile l’accesso alle informazioni a partire già dalla fase di avvio (boot). A questo punto viene caricato lo stage 2 il quale passa in rassegna il file di configurazione menu.lst presente nella stessa cartella mostrandoci, a video, la classica schermata di scelta relativa a quale sistema avviare e, eventualmente, con quale versione del kernel.
IL FILE DI CONFIGURAZIONE
Questo file, a tutti gli effetti un file di testo consultabile con qualsiasi editor di testi, contiene le informazioni per poter avviare una distribuzione GNU/Linux così come possibili altri sistemi operativi (ad esempio Microsoft Windows). La sua struttura più semplice potrebbe essere simile alla seguente;
timeout 10
default 0
title linux
kernel (hd0,1)/boot/vmlinuz root=UUID=868fef46-9a8f-439d-8b88-dcbe6ed3b904 splash=silent vga=788
initrd (hd0,1)/boot/initrd.img
La prima cosa da ricordare quando si vuole metter mano al file di configurazione di GRUB (oltre a farne una copia di backup da ripristinare in caso di problemi) è che esso inizia a contare da zero e non fa distinzioni tra dispositivi IDE, SCSI e/o SATA. Questo vuol dire che tutti i device saranno identificati con la scritta hd seguita da una coppia di numeri separati da una virgola dove il primo numero indica la catena e il secondo la partizione. Ad esempio la dicitura (hd0,1) nel file riportato poco sopra indica la seconda partizione del primo hard disk. Notare il modo elegante per indicare dov’è situata l’immagine del kernel (di nome vmlinuz) utilizzando il comando kernel seguito dal percorso;
kernel (hd0,1)/boot/vmlinuz
Segue l’identificativo della partizione di root del filesystem (attenzione, la radice del filesystem ovvero la / da non confondere con la cartella dell’amministratore, la /root; sono due cose separate e distinte) e, sulla stessa riga, altri due parametri; splash e vga. L’ultima riga, non sempre presente, riporta la presenza del file initrd (Initial RamDisk).
La direttiva timeout visibile nella prima riga fa si che dopo i secondi indicati venga avviato automaticamente il sistema operativo riportato nella direttiva default; ricordiamoci che il conteggio parte da zero e pertanto in questo caso è indicata la prima voce nell’elenco. Se vi fosse il numero due verrebbe avviato il sistema operativo corrispondente alla terza voce in elenco e così via di seguito. La voce title indica il titolo della sezione ovvero ciò che apparirà a video nella schermata di scelta. Potrebbe spaventare la sequenza di caratteri che identificano la partizione radice del filesystem. Fino a non molto tempo fa veniva indicata in maniera molto più intuitiva, ad esempio;
root=/dev/sda1
Oramai sulla maggioranza delle distribuzioni (anche se non tutte) è stato introdotto l’utilizzo dell’UUID (Universal Unique IDentifier) ovvero un numero di 128bit (16byte) atto a identificare in maniera univoca la partizione in esame. E’ sufficiente cambiare, anche di poco, la dimensione della partizione perché questo numero cambi inesorabilmente. Ma niente paura, per identificare la (eventuale) nuova stringa è sufficiente utilizzare, in una shell, il comando vol_id seguito dalla partizione per la quale vogliamo conoscere l’UUID.
Ad esempio:
vol_id -uuid /dev/sda1
per ricevere in output l’id del volume;
868fef46-9a8f-439d-8b88-dcbe6ed3b904
da inserire nella voce;
root=UUID=
UTILIZZIAMO LA DIRETTIVA SPLASHIMAGE
Ora che conosciamo un po il file di configurazione di GRUB, utilizziamolo per personalizzare il menù di avvio con una immagine di nostro gradimento. Le uniche restrizioni da rispettare sono la dimensione (640×480), i colori (limitati ad un numero pari a 14) e il formato (xpm compresso con gzip).
Assicuriamoci di avere installato il pacchetto imagemagick e procediamo nel modo che segue. Copiamo nella nostra home utente l’immagine da utilizzare al boot, apriamo una shell e convertiamola al livello di colori e dimensioni giuste;
mogrify -geometry 640×480! -colors 14 Immagine.xyz
dove xyz indica il formato dell’immagine; notare il punto esclamativo sul ridimensionamento ad indicare che non verranno rispettate le proporzioni ovvero il ridimensionamento sarà “forzato” al valore indicato. A questo punto convertiamo il formato e comprimiamo l’immagine;
convert Immagine.xyz Immagine.xpm
gzip Immagine.xpm
copiandola, con i diritti di amministratore (comando sudo o su), in /boot/grub
# cp Immagine.xpm /boot/grub
in alcune distribuzioni occorre copiarla in /boot/grub/splashimages. Per terminare aggiungiamo la seguente riga al file menu.lst;
splashimage=(hd0,1)/boot/grub/Immagine.xpm.gz
riavviamo ed il gioco è fatto! Le immagini riportano i risultati sulla schermata di avvio su una Fedora Core 10. Naturalmente la qualità del risultato finale dipende anche dalla “bontà” dell’immagine di partenza.
Attenzione: alcune distribuzioni, come ad esempio Mandriva, gestiscono l’immagine di boot attraverso il programma grub-gfxmenu che, tra le altre cose, limita le restrizioni definite poco sopra sulle immagini da utilizzare. In questi casi la procedura elencata non funzionerà. Per rendersi conto se la propria distribuzione utilizza il programma indicato, è sufficiente aprire il file menu.lst e accertarsi della presenza di una riga del tipo;
gfxmenu (hd0,1)/boot/gfxmenu
Al prossimo tutorial!