2.1.6 GRUB
Nato nel 1995 da un’idea di E. Boleyn, GNU
GRUB
(GRand Unified Bootloader) è il boot loader utilizzato nelle recenti distribuzioni di
GNU/Linux. Le sue caratteristiche principali sono le seguenti
-
• supporto nativo per il boot di sitemi operativi aderenti alle specifiche Multiboot
(GNU/Linux, FreeBSD, NetBSD, OpenBSD, ...);
-
• supporto per il boot in chain-loading di sistemi operativi non-Multiboot (DOS,
Windows, OS/2, ...);
-
• supporto di vari tipi di filesystem;
-
• gestione dell’avvio del sistema operativo desiderato attraverso un’interfaccia utente
a menù;
-
• supporto per la modalità LBA: accesso a dischi con capacità superiore a 8 GiB;
-
• elevata configurabilità;
-
• possibilità di avvio via rete;
-
• protezione dei file di configurazione con password;
All’avvio, GRUB visualizza un elenco dei possibili sistemi operativi avviabili
(v. fig. 2.4).
Le possibilità di avvio di un sistema operativo da parte di GRUB sono due: in maniera
diretta o per mezzo del chain-load. I sistemi operativi che aderiscono alle specifiche Multiboot
(come Linux, FreeBSD, NetBSD e OpenBSD) possono essere caricati direttamente da GRUB,
mentre gli altri sistemi operativi possono essere caricati soltanto tramite il meccanismo di
chain-loading, ovvero GRUB demanda al boot loader del sistema specifico il suo
avvio.
2.1.6.1 Stadi di avvio
GRUB è costituito da vari stadi (stage) di avvio, ognuno dei quali è rappresentato
da un file: due stage essenziali (file stage1 e stage2) e degli stage opzionali (file
*stage1_5).
-
stage1 Questo è un file essenziale per poter effettuare il boot con GRUB.
Tipicamente si trova nel MBR o nel boot sector di una partizione. Poiché un
boot sector è grande 512 byte, la dimensione di tale file è esattamente 512
byte. Tutto ciò che fa stage1 è di caricare il file stage2 o lo specifico file
*stage1_5 dal disco (stage1 non gestisce nessun tipo di filesystem).
-
stage2 Questo è il nucleo di GRUB. Generalmente risiede su un filesystem, ma ciò
non è necessario.
-
*stage1_5
Questa famiglia di file ha lo scopo di collegare il file stage1 al file stage2.
Cioè *stage1_5 è caricato da stage1 e, a sua volta, carica stage2. Lo
specifico *stage1_5 rende GRUB capace di gestire un determinato filesystem.
In questo modo, si può spostare il file stage2 in una posizione diversa sul
filesystem senza dover necessariamente reinstallare GRUB.
2.1.6.2 Identificatori dei dispositivi
Il modo in cui un dispositivo di memoria di massa viene identificato da GRUB (nel suo
linguaggio di scripting, ovvero nelle direttive contenute nell’apposito file di configurazione -
v. più avanti) è illustrato di seguito. Per prima cosa ogni identificatore di dispositivo deve
essere racchiuso tra parentesi tonde ed ha il seguente formato:
(device[,partition])
dove
-
device è il dispositivo e può assumere i seguenti valori:
-
hd0 il primo hard disk;
-
hd1 il secondo hard disk;
-
fd0 il primo floppy disk;
-
. . .
-
cd il CD-ROM;
-
nd il dispositivo di avvio dalla rete;
GRUB non fa differenza tra dispositivi ATA (IDE) e SCSI.
Generalmente i valori di device che identificano i dischi ATA sono inferiori
rispetto a quelli dei dischi SCSI presenti sulla stessa macchina (a meno che
la sequenza di boot non sia stata modificata da BIOS). I dispositivi possono
essere indicati anche tramite il numero utilizzato dal BIOS (ad esempio
(hd0) può essere indicato anche come (0x80) o (128)).
|
-
partition
è un numero che identifica la partizione di un determinato disco. Tale valore inizia da
0 ed assume i seguenti significati:
-
0 la prima partizione primaria del disco;
-
1 la seconda partizione primaria del disco;
-
. . .
-
4 la prima partizione estesa del disco;
-
5 la seconda partizione estesa del disco;
-
. . .
Si noti che la prima partizione estesa del disco è sempre indicata dal
valore partition uguale a 4, indipendentemente da quante partizioni primarie
siano effettivamente presenti sul disco.
|
Quindi, ad esempio, il file vmlinuz che si trova nella directory /boot presente nella
seconda partizione del primo hard disk potrà essere specificato come (hd0,1)/boot/vmlinuz.
2.1.6.3 Installazione
Se si desidera utilizzare GRUB come boot loader del sistema, è necessario innanzi tutto
installare sul sistema il relativo pacchetto contenente appunto i file necessari alla
configurazione ed installazione di GRUB come boot loader, che generalmente copia i file nella
directory /usr/share/grub/i386-pc (detta anche image directory).
Quindi è opportuno creare la directory /boot/grub (detta boot directory) e copiare al suo
interno i file opportuni (*stage1_5, stage2, device.map, e menu.lst). Dopodiché non
rimane altro che copiare il file stage1 nel MBR o nel settore di boot di una partizione
dell’hard disk. Tutto ciò può essere fatto per mezzo del comando grub-install (man page
grub-install(8)) o tramite l’interfaccia a riga di comando di GRUB, lanciabile con il
comando grub (man page grub(8)).
____________________________________________________________________
Comando: grub-install
Path: /sbin/grub-install
SINTASSI
# grub-install [option] device
DESCRIZIONE
-
option indica la modalità di funzionamento di grub-install. Può assumere i
seguenti valori:
-
-h | --help
visualizza un aiuto sommario di grub-install;
-
-v | --version
visulizza la verione di grub-install;
-
--root-directory=dir
indica di installare i file di GRUB nella directory dir (per default
vengono installati in ‘/’). Tale opzione è utilizzata quando si vuol
installare i file in una specifica partizione (diversa da ‘/’) o in un
disco rimovibile;
-
--grub-shell=file
indica quale è il file eseguibile che deve fungere da shell per GRUB;
- --force-lba
indica di utilizzare la modalità LBA anche se il BIOS sembra non
supportarla;
- --recheck
indica di eseguire un controllo dei dischi per ricreare il file
device.map;
-
device specifica il dispositivo nel quale installare il boot loader GRUB (può essere
specificato un file di dispositivo oppure un disco, o partizione, nella sintassi di
GRUB);
_________________________________________________________________________________________________________
Sebbene nella maggior parte dei casi funzioni, l’utilizzo del comando grub-install è
sconsigliato, poiché esso si basa sulla mappatura tra i dispositivi del BIOS ed i dischi visti dal
sistema operativo e non sempre le cose coincidono. Per far ciò grub-install si basa sul
contenuto del file /boot/grub/device.map, che è un file di testo con la seguente
sintassi
device file
dove
-
device è il dispositivo specificato secondo la sintassi di GRUB;
-
file è il nome del file di dispositivo ad esso associato dal sistema operativo;
Tale file viene creato automaticamente da GRUB (qualora non esista) e potrebbe
contenere delle corrispodenze errate, poiché dal BIOS potrebbe essere stato scambiato
l’ordine di avvio dei disci tra gli SCSI e gli ATA (IDE). In tal caso il file può essere
modificato manualmente per far funzionare correttamente l’intsallazione del MBP di
GRUB.
____________________________________________________________________
Comando: grub
Path: /sbin/grub
SINTASSI
# grub [option]
DESCRIZIONE
-
option indica la modalità di funzionamento di grub. Può assumere i seguenti valori:
- --batch
attiva la modalità non interattiva (batch). Analogo a
--no-config-file --no-curses;
-
--boot-drive=drive
specifica il disco di boot per stage2 come indicato da drive (per
default è 0);
-
--config-file=file
specifica il file di configurazione per stage2 come indicato da file (per
default è /boot/grub/menu.lst);
-
--device-map=file
indica di utilizzare il file che contiene l’elenco dei dispositivi indicato
da file (per default /boot/grub/device.map, se non esiste viene
creato);
-
--help visualizza un aiuto sommario di grub;
-
--hold attende finché un debugger non si è agganciato;
- --install-partition=par
specifica la partizione di installazione di stage2 come indicato da par
(per default è 0x20000);
- --no-config-file
indica di non utilizzare nessun file di configurazione;
- --no-curses
indica di non utilizzare interfacce di tipo curse;
- --no-floppy
indica di non eseguire il test per i lettori di dischetti;
- --no-pager
indica di non utiizzare un pager (visualizzatore di testo) predefinito;
- --preset-menu
indica di utilizzare il menù preimpostato;
- --probe-second-floppy
indica di eseguire il test per il secondo lettore di dischetti;
-
--read-only
indica di non scrivere niente sui dispositivi;
-
--verbose
visualizza messaggi informativi;
-
--version
visualizza la versione di grub;
____________________________________________________________________
Questa è una sorta di shell, con un insieme di comandi e direttive che rendono più agevole
la gestione dell’avvio. L’elenco dei comandi/direttive è ottenibile attraverso il comando
help.
Per installare il MBP di GRUB nel MBR è opportuno impostare come dispositivo di root,
la partizione contenente la boot directory, cioè la directory /boot/grub (quella che contiene il
file stage1 con il comando
grub> root (hd0,1)
In questo caso la directory /boot/grub è contenuta nella seconda partizione (1) del primo
disco (hd0).
per trovare la partizione relativa si può anche utilizzare il comando find interno
a grub
grub> find /boot/grub/stage1
che ricercherà appunto il file /boot/grub/stage1 e visualizzerà le indicazioni relative
alla partizione che lo contiene.
|
A questo punto si può installare il MBP di GRUB nel MBR del primo hard disk con il
comando
grub> setup (hd0)
che inserice il MBP contenuto nel file stage1 all’interno della partizione impostata con il
comando root.
Se, invece, lo si volesse installare nel settore di boot della prima partizione del primo hard
disk, si potrebbe utilizzare il comando
grub> setup (hd0,0)
Se si installa il MBP di GRUB in una partizione (anziché nel MBR) o in un disco diverso
dal primo, esso dovrà essere avviato da un altro boot loader tramite il meccanismo di
chain-loading.
È inoltre possibile installare GRUB come boot loader su un floppy disk. Per far ciò si
devono copiare i file stage1 e stage2 rispettivamente sul primo e secondo settore del
floppy.
Attenzione: questa procedura cancellerà qualsiasi dato memorizzato
precedentemente sul dischetto.
|
I comandi da lanciare sono i seguenti:
# cd /usr/share/grub/i386-pc
# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
# dd if=stage2 of=/dev/fd0 bs=512 seek=1
153+1 records in
153+1 records out
2.1.6.4 Configurazione
Il file di configurazione di GRUB è /boot/grub/menu.lst (talvolta esso può essere soltanto un symbolic
link).
Tale file contiene le direttive per la presentazione a video dell’elenco dei possibili
sistemi operativi da avviare in fase di boot e quelle per il loro effettivo avvio e viene
intepretato da GRUB al suo avvio. Un tipico file di configurazione è quello riportato di
seguito:
#
# Sample boot menu configuration file
#
# By default, boot the first entry.
default 0
# Boot automatically after 10 secs.
timeout 10
# For booting GNU/Linux
title GNU/Linux
kernel (hd0,1)/vmlinuz root=/dev/hda1
# For booting Windows
title Windows boot menu
root (hd0,0)
makeactive
chainloader +1
Segue una breve spiegazione delle direttive contenute nell’esempio.
-
default 0
indica a GRUB la scelta di default, in questo caso la prima voce del menù (le
voci del menù di avvio sono quelle contraddistinte dalla parola chiave title),
poiché il conteggio inizia da zero;
-
timeout 10
indica a GRUB di avviare automaticamente la macchina con la scelta di default
se non è stato premuto nessun tasto entro 10 secondi;
-
title GNU/Linux
definisce una voce di menù contenente il testo “GNU/Linux”;
-
kernel (hd0,1)/vmlinuz root=/dev/hda1
indica a GRUB di lanciare il file /vmlinuz, il kernel di GNU/Linux, che (in
questo caso) si trova nella directory principale della seconda partizione del
primo hard disk ATA, passandogli il parametro root=/dev/hda1 che indica di
“montare” come root directory del sistema, quella relativa alla prima partizione
del primo disco ATA;
-
title Windows boot menu
definisce una voce di menù contenente il testo “Windows boot menu”;
-
root (hd0,0)
indica a GRUB di impostare come partizione di avvio la prima partizione del
primo hard disk;
-
makeactive
indica a GRUB di rendere attiva l’impostazione della partizione di avvio;
-
chainloader +1
indica a GRUB di caricare il boot loader presente sul primo settore della prima
partizione del primo hard disk (+1).
Per poter avviare il DOS o Windows, che sia installato su un hard disk
diverso dal primo, è necessario utilizzare la tecnica del disk swapping, poiché
tali sistemi operativi possono essere caricati soltanto dal primo hard disk. GRUB
mette a disposizione il comando interno map che può essere usato per scambiare
virtualmente gli hard disk con le istruzioni seguenti
map (hd0) (hd1)
map (hd1) (hd0)
potendo così ovviare al problema.
|
Al momento della visualizzazione del menù di avvio (fig. 2.4) è comunque possibile
-
• passare alla modalità a riga di comando premendo il tasto
;
-
• variare i parametri da passare al kernel premendo il tasto
;
-
• modificare le opzioni relativamente ad una voce del menù di avvio premendo il
tasto
;
Tali operazioni sono comunque subordinate alla conoscenza dell’eventuale password con il
quale è stato protetto il file di configurazione.