back to top

Il boot loader Grub

GRUB, acronimo di GRand Unified Bootloader, è un programma distribuito sotto licenza GNU che si occupa del caricamento e dell’avvio di sistemi operativi.

GRUB è residente su disco, ed è largamente utilizzato ed installato di default nella quasi totalità delle principali versioni di Linux, nonchè in quelle di FreeBSD e di OpenSolaris. Più che il suo funzionamento interno, a dire il vero molto complesso, è interessante conoscerne l’architettura di base, il sistema di configurazione (gestito direttamente tramite il file di configurazione menu.lst) ed i principali comandi testuali.

Grub permette di riscrivere completamente da zero i comandi necessari a far partire un kernel, GRUB è un boot loader universale, supporta tutti i principali sistemi operativi, tra i quali anche quelli con licenza proprietaria come Windows. Si presenta all’avvio del computer con un’interfaccia a menù come quella presentata dal seguente esempio:

GRUB è avviabile in modo standard dal comando grub, ed è distribuito insieme ad alcuni programmi accessori, dei quali sono riportati con una breve descrizione i più usati:

  • grub-install: installa grub su un disco;
  • grub-set-default: assegna la voce di menù avviata di default alla scadenza del timeout;
  • grub-probe: offre informazioni sul device corrispondente ad un determinato percorso (o ad un dispositivo, tramite l’opzione-d);
  • grub-reboot: riavvia il computer col sistema operativo corrispondente alla voce di menù specificata come argomento;
  • grub-md5-crypt: calcola l’hash MD5 di una password richiesta dal programma stesso.

Architettura di GRUB

GRUB è formato da due parti dette stage.

  • stage1 è residente nel Master Boot Record (MBR, settore di avvio usato dal bios per completare il boot del sistema) e si occupa di caricare la seconda parte;
  • stage2 è residente su disco al percorso /boot/grub e contiene il programma vero e proprio; allo stesso percorso sono memorizzati i files di configurazione.

Tale architettura permette allo stage1 di poter restare sempre immutato mentre è la sola modifica dello stage2, nell’atto di modificare un file di configurazione, che determina il comportamento del boot loader e la struttura del menù. Da questo sistema di funzionamento deriva una flessibilità ed una facilità d’uso incredibilmente alta se messa in relazione con la potenza del tool.

Notazioni per l’identificazione di dischi e partizioni

Prima di discutere il funzionamento nel dettaglio e la struttura del file di configurazione può essere utile ricordare come vengono denominati i dischi e le partizioni da grub e dai sistemi operativi.

  • L’ambiente DOS/Windows assegna ad ogni partizione collocata su un qualsiasi disco un valore simbolico composto da una lettera progressiva e dai due punti (di default A: e B: per i dischi rimovibili, C: e seguenti per dischi fissi ed altre unità);
  • la notazione unix assegna un nome al disco nella forma hda, hdb, hdc ecc.. e per ogni disco definisce un valore fisso e progressivo che identifica ciascuna delle partizioni (es: hda1, hda5, hdb3). I numeri da 1 a 4 sono riservati alle quattro possibili partizioni primarie, mentre si usano valori superiori a 5 per denominare le partizioni logiche.
  • GRUB usa una propria notazione, diversa dalle due precedenti, che assegna ad ogni disco fisso il prefisso "hd" seguito dall’identificativo del disco e della partizione:
hd(<numero_disco>,<numero_partizione>)

Ecco uno schema grafico riassuntivo di esempio che può chiarire le idee:

Configurazione di GRUB attraverso il file menu.lst

Configurare GRUB significa in modo pratico definire le opzioni di funzionamento del suo menù e generare il codice corretto per ciascuna voce di menu al fine di avviare ogni sistema operativo installato.

Il comando default definisce quale sia la voce di default preselezionata all’avvio del menù grub. Allo scadere del timeout, se l’utente non ha compiuto alcuna azione, viene lanciato il sistema operativo corrispondente alla voce di default scelta. Il comando timeout permette di assegnare una quantità esplicita a questo lasso di tempo e prende come parametro il tempo di attesa espresso in secondi.

default 2
timeout 10

Ogni nuova voce di menù è dichiarata tramite il comando title, il cui argomento è direttamente il titolo che viene visualizzato nel menù. La partizione su cui è installato il sistema operativo che si intende lanciare è annunciata dal comando root seguito da un identificativo di una partizione nella notazione GRUB.

title Mio Sistema Operativo 1.0
root (hd0,1)

Una volta definiti questi due parametri principali si dichiara una sequenza di istruzioni, che dipende dal sistema operativo che si intende avviare. Per i sistemi linux e simili un’esempio di soluzione valida è la seguente:

title Ubuntu, kernel 2.6.17-10-generic
root (hd0,4)
kernel /boot/vmlinuz-2.6.17-10-generic root=/dev/sda5 ro quiet splash
initrd /boot/initrd.img-2.6.17-10-generic
quiet
savedefault

Il comando kernel fornisce il percorso del kernel, della directory root e la modalità di avvio (quiet splash); initrd fornisce il percorso dell’initial ramdisk, l’opzione ro accede alle partizioni in sola lettura (sempre consigliato!). L’initrd contiene i moduli del kernel necessari a montare il filesystem radice e gli script necessari al caricamento dei moduli stessi. Tramite initrd è anche eseguito il programma init, che costituisce il primo passo per l’avvio vero e proprio del sistema operativo.

Il comando savedefault è opzionale e salva in una locazione gestita da grub il sistema operativo appena avviato. L’utilità di questo comando è evidente nel caso si voglia utilizzare come sistema di default quello avviato per ultimo in ordine cronologico. Il seguente esempio, tratto direttamente dal manuale di grub. è esplicativo:

default saved
timeout 10

title GNU/Linux
root (hd0,0)
kernel /boot/vmlinuz root=/dev/sda1 vga=ext
initrd /boot/initrd
savedefault

title FreeBSD
root (hd0,a)
kernel /boot/loader
savedefault

Per i sistemi operativi Windows si richiama tramite l’opzione "chainloader +1" il boot loader proprietario Microsoft (+1 identifica il primo settore della partizione corrente ); makeactive dichiara la partizione attiva. Ecco un esempio piuttosto standard di voce di menù associata a un sistema Windows:

title Microsoft Windows XP
root (hd0,1)
savedefault
makeactive
chainloader +1

Alcune opzioni avanzate di GRUB

GRUB si può proteggere con password nella seguente maniera:

Si dichiara tramite il comando password la parola chiave desiderata.

password lamiapwd

In questo modo si ha un piccolo problema di sicurezza: la password è scritta direttamente in chiaro nel file di configurazione.

  • Un utente che ha sufficienti permessi potrebbe leggere la password tramite ispezione diretta del file di testo menu.lst.

Per ovviare a questo inconveniente è stato ideato uno stratagemma: non si scrive direttamente nel file la password ma un suo digest generato tramite l’algoritmo di hash md5. Definiamo che cos’è un digest ed un algoritmo di hash:

  • L’algoritmo di hash esegue un elaborazione crittografica della stringa base, quando è applicato ne genera una diversa dalla precedente di lunghezza fissa.
  • La stringa generata tramite un algoritmo di hash si dice digest della stringa base.

Un algoritmo di hash gode delle proprietà seguenti:

  • Il calcolo della stringa derivata a partire da quella base è immediato (costo computazionale basso);
  • a partire dalla stessa stringa base si ottiene sempre lo stesso digest;
  • il calcolo della stringa base a partire dalla stringa derivata è difficilissimo o quasi impossibile in tempi ragionevoli (sebbene l’algoritmo di hash usato sia pubblico e noto).

Dopo tutta questa teoria arriviamo all’applicazione pratica: sfruttando il terzo punto dell’elenco precedente si può costruire un sistema di riconoscimento password per cui si memorizza in un file il solo digest della passowrd, e quando l’utente inserisce la password, per autenticarlo il sistema calcola l’hash della password introdotta e lo confronta col digest memorizzato nel file. E’ chiaro che senza la conoscenza della password non si avrà mai accesso al sistema, anche avendo accesso in lettura al file che contiene il digest memorizzato. Questo meccanismo è applicato alla lettera nel caso di GRUB, nel file menu.lst si può memorizzare solo il digest della password, mentre per accedere al sistema viene richiesta la stringa base.

Per comodità dell’utente, GRUB mette a disposizione nel pacchetto un tool dedicato; il programma grub-md5-crypt gia citato prima. Ecco cosa si ottiene applicando MD5 alla stringa "lamiapwd".

Il passo finale è salvare il digest tramite lo stesso comando password di prima chiamato col parametro -md5

password -md5 $1$8zrmN/$4P6u5Ub5kZ7El03twC7YW0

Le entry che si vogliono proteggere con il comando password (chiamato prima delle entry stesse) vengono contrassegnate con il comando "lock":

password -md5 $1$8zrmN/$4P6u5Ub5kZ7El03twC7YW0
title GNU/Linux
lock
root (hd0,0)
kernel /boot/vmlinuz root=/dev/sda1 vga=ext
initrd /boot/initrd
savedefault

Se si chiama il comando password dopo che è stata annunciata una entry (tramite title, solo la specifica voce è protetta da password.

title FreeBSD
root (hd0,a)
kernel /boot/loader
savedefault
password mia_password
boot

Generazione automatica del file menu.lst

Il programma "update-grub" genera automaticamente (e scrive) in base ai sistemi operativi rilevati nelle partizioni un file menu.lst di base e "standard", in genere il comando funziona bene ed è sia un buon modo per autoconfigurare grub senza grosse perdite di tempo che un ottimo punto di partenza per gli utenti più esigenti che vogliono spingersi oltre modificando manualmente la configurazione.

grub-install si lancia con la sintassi:

grub-install <id_partizione>

ad esempio:

grub install hd0

Comandi per la shell di GRUB

GRUB dispone di una sorta di shell che consente la gestione diretta del boot loader, i comandi gia visti per creare lo script di configurazione sono comandi di shell a tutti gli effetti! Oltre quelli, vi è qualche altra funzionalità molto utile in alcune circostanze. L’elenco completo dei comandi è ottenibile attraverso il comando help.

Commentiamo i due principali:

Il comando setup installa grub nel main boot record del disco selezionato. Prima di eseguirlo è necessario specificare la partizione relativa al grub. Un esempio molto comune in cui il comando può tornare utile è dopo un installazione di Windows. Windows, come ben noto, forza l’ installazione del suo boot loader nell’MBR sovrascrivendo i dati precedenti. Per ovviare al problema si reinstalla grub con la procedura appena esposta.

Supponendo che grub sia installato in hd0,1 e hd0 sia il disco principale:

root (hd0,1) 
setup (hd0)

find cerca all’interno delle partizioni disponibili il percorso selezionato e visualizza le destinazioni che lo contengono. Qualche esempio:

find /boot/grub/stage1
find /boot/grub/menu.lst

Altri contenuti interessanti

Pubblicità

Leggi anche...

Linux: recuperare una partizione con GNU Parted o Gpart

A volte, nell'uso quotidiano del computer, possono capitare dei...

Differenze tra su e sudo in Linux

su e sudo, vengono considerati a torto due comandi...

Creare una lista dei programmi installati su Ubuntu (per effettuarne il ripristino)

In questo breve post vedremo come visualizzare tutto il...

Come svuotare la memoria Cache in Linux?

La memoria cache è stata creata perché, anche quando...

Installare un’interfaccia grafica su Ubuntu Server

Indipendentemente dalla versione di riferimento, il ramo principale della...

Creiamo un file server con Samba

La finalità di una rete locale di computer (LAN)...
Pubblicità