[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 17.   GRUB

GRUB (1) è una procedura relativamente nuova per il caricamento di GNU/Linux e molti altri sistemi operativi negli elaboratori con architettura i386. GRUB è un sistema molto sofisticato e in questo capitolo vengono descritti solo gli aspetti più importanti, per un utilizzo secondo le convenzioni comuni. Eventualmente si può contare sulla documentazione originale che è molto accurata e dettagliata.

17.1   Logica generale

In condizioni normali, quando si installa il pacchetto GRUB nel proprio sistema, si dovrebbero trovare i file salienti nella directory /usr/lib/grub/i386-pc/. Esistono qui due file fondamentali, denominati stage1 e stage2, assieme ad altri file che corrispondono al modello *_stage1_5.

Questi nomi hanno un significato molto chiaro, riferendosi agli stadi in cui è suddivisa la fase di avvio. Se si osserva bene, si può notare che il file stage1 è lungo esattamente 512 byte, ovvero un settore: questo è il primo pezzo di codice che viene utilizzato durante l'avvio. Il file stage2 rappresenta invece il codice necessario al completamento dell'avvio, mentre i file della serie *_stage1_5 rappresentano una fase intermedia, eventuale, che potrebbe inserirsi subito prima di stage2, se necessario.

L'installazione del sistema di avvio avviene collocando una copia del file stage1 nel settore di avvio dell'unità usata per questo scopo; potrebbe trattarsi del primo settore di un dischetto, del primo settore del disco fisso (MBR), oppure il primo settore di una partizione primaria (lasciando il compito di avviarlo a un altro sistema del genere). Anche gli altri file vanno copiati in un'altra posizione, soprattutto perché, a seconda della circostanza, vengono modificati.

In condizioni normali, si colloca una copia di tutti i file contenuti nella directory /usr/lib/grub/i386-pc/ in /boot/grub/; inoltre, sempre nella directory /boot/grub/ si crea un file di configurazione denominato convenzionalmente menu.lst.

Perché GRUB funzioni è sufficiente che sia stato fissato il collegamento tra il codice contenuto nel settore di avvio (il file stage1) e il codice contenuto nel file stage2, con la mediazione eventuale di un file *_stage1_5. Ciò permette a GRUB di avere il controllo della situazione, così l'utente può anche osservare il contenuto delle partizioni e indicare un kernel da avviare, anche senza alcuna configurazione. Infatti, GRUB è realizzato in modo da poter leggere autonomamente i file system più comuni; in particolare i formati Second-extended (di GNU/Linux e GNU/Hurd), ovvero Ext2 e Ext3, come i formati FAT (di Dos e MS-Windows).

GRUB, quando è installato correttamente, è una sorta di shell, con una serie di comandi interni che facilitano la gestione dell'avvio, senza bisogno di creare un legame diretto con il file o i file del kernel e la configurazione eventuale. In questo modo si possono modificare (sostituire, aggiungere o eliminare) i file del kernel; inoltre, anche il file di configurazione, se utilizzato, può essere modificato a piacimento, senza bisogno di reinstallare il sistema di avvio. Eventualmente, in un sistema già avviato, è disponibile anche l'eseguibile grub, che emula il comportamento del sistema di avvio e può essere usato proprio per installarlo. La riga di comando di GRUB offre anche un sistema di completamento automatico che facilita notevolmente l'utilizzo, specialmente quando non è stato preparato un file di configurazione. In tal caso, il funzionamento è molto simile a quello della shell Bash (parte xv).

17.2   Dischi, partizioni, percorsi e blocchi di settori

GRUB è un sistema di avvio pensato per diversi sistemi operativi, in grado di accedere da solo ai file system. In questo senso, utilizza una sua notazione per fare riferimento ai dischi, alle partizioni e ai percorsi contenuti nelle partizioni. Un disco, nella sua interezza, si indica secondo la sintassi seguente:

(hdn| (fdn)

La sigla hd fa riferimento a un disco fisso, di qualsiasi genere, mentre la sigla fd fa riferimento a un dischetto. Il numero specifica quale disco o dischetto, secondo l'ordine attribuito dal BIOS (il firmware nell'architettura i386). In questo senso, il primo disco fisso, di qualunque tipo sia (ATA, SCSI, ecc.) è sempre (hd0); nello stesso modo, il primo dischetto è sempre (fd0).

Per fare riferimento a una partizione, si usa la notazione seguente:

(hdm,n)

In questo modo, si fa riferimento al disco m-esimo (come è già stato mostrato) e alla partizione n-esima, anche in questo caso si parte da zero. Per esempio, (hd0,1) fa riferimento alla seconda partizione del primo disco fisso; se si trattasse di un disco ATA, per GNU/Linux corrisponderebbe al file di dispositivo /dev/hda2.

Nel caso particolare delle partizioni *BSD, queste si articolano in sottopartizioni conosciute come disklabel, identificate da una lettera alfabetica:

(hdm[,n],x)

In pratica, il numero della partizione può essere omesso se si tratta della prima, mentre x rappresenta la lettera minuscola che identifica l'etichetta BSD a cui si vuole fare riferimento. Per esempio, (hd0,a) fa riferimento alla sottopartizione «a» (secondo BSD), della prima partizione del primo disco fisso; la stessa cosa si poteva annotare in modo più dettagliato come (hd0,0,a).

C'è un'ultima cosa da tenere in considerazione a proposito della notazione riferita ai dischi e delle partizioni. Al posto della forma (hd...), oppure (fd...), si può indicare direttamente il numero attribuito dal BIOS, espresso in esadecimale, secondo la notazione 0xhh, oppure in decimale. Per esempio, il primo disco fisso si può indicare anche come (0x80), oppure (128). A ogni modo, in condizioni normali non c'è ragione di usare questa notazione.

Per fare riferimento a un file o a una directory, si indicano percorsi simili a quelli comuni nei sistemi Unix (indipendentemente dal tipo di file system a cui si accede), con l'indicazione eventuale del disco o della partizione a cui si fa riferimento:

[disco_o_partizione]percorso

Per esempio, per fare riferimento alla prima partizione del primo disco fisso, in cui si trova il file /boot/vmlinuz-2.4.2, si può indicare (hd0,0)/boot/vmlinuz-2.4.2.

Bisogna evitare di fare confusione: il percorso che segue l'indicazione del disco o della partizione è riferito al disco o alla partizione stessa. GRUB non può essere al corrente della struttura di un file system articolato attraverso diversi innesti, montando più partizioni assieme in uno stesso albero. In pratica, è un po' come succede nei sistemi Dos e MS-Windows, in cui i percorsi sono sempre riferiti a unità distinte in base a una lettera (C:\...\...).

GRUB dispone di un comando, root, con il quale si individua una partizione particolare. Se viene utilizzato, per fare riferimento a percorsi contenuti all'interno di tale partizione è sufficiente indicare la sequenza di directory e file, senza l'indicazione della partizione stessa all'inizio.

GRUB è un sistema di avvio, che deve poter fare anche riferimento a settori dei dischi, indipendentemente dal file system contenuto. Per questo si aggiunge un'altra notazione, che va a sostituire quella del percorso di un file:

[inizio]+lunghezza[,[inizio]+lunghezza]...

Il modello sintattico fa riferimento alla possibilità di individuare uno o più gruppi di settori, ognuno a partire da una posizione, che se non viene specificata è implicitamente il settore zero, per una quantità (lunghezza) di settori stabilita. In pratica, la notazione 0+2 fa riferimento a un gruppo composto da due settori, a partire dal primo (il settore zero). Secondo la sintassi, la stessa cosa si poteva indicare omettendo il settore iniziale: +2. Potrà capitare frequentemente di dover fare riferimento soltanto al primo settore di una partizione, come nel caso di (hd0,0)+1, in cui si indica il primo settore della prima partizione del primo disco fisso.

17.3   Dischetto GRUB di emergenza

Prima di installare GRUB come sistema di avvio per il proprio elaboratore, conviene fare delle prove non distruttive. La cosa migliore è preparare almeno un dischetto contenente GRUB, che potrà servire anche per sistemare dei problemi in altre situazioni in cui il sistema di avvio è compromesso per qualche ragione.

Servono soltanto i file stage1 e stage2 originali (quelli contenuti nella directory /usr/lib/grub/i386-pc/ e non quelli già utilizzati per l'installazione di un sistema di avvio), che vanno copiati sequenzialmente a partire dal primo settore del dischetto. In pratica, con un sistema GNU/Linux si può agire nel modo seguente:

cd /usr/lib/grub/i386-pc

cat stage1 stage2 > /dev/fd0

Diversamente, con un altro sistema operativo Unix in cui questo meccanismo non sia attuabile, si possono usare i comandi seguenti:

cd /usr/lib/grub/i386-pc

dd if=stage1 of=/dev/fd0 bs=512 count=1

dd if=stage2 of=/dev/fd0 bs=512 seek=1

In pratica, con dd bisogna copiare il file stage2 a partire dal secondo settore del dischetto, perché il primo contiene il file stage1.

Eventualmente, si può fare anche attraverso il Dos, con l'aiuto del programma RAWRITE.EXE:

C:\> COPY /B STAGE1 + STAGE2 GRUB.RAW

C:\> RAWRITE GRUB.RAW A:

In questo modo, si crea prima il file GRUB.ROW, unendo i due file di partenza, quindi si passa al trasferimento nel dischetto. Ovviamente, la stessa tecnica si poteva sfruttare anche in un sistema Unix:

cat stage1 stage2 > grub.raw

dd if=grub.raw of=/dev/fd0 bs=512

17.4   Funzionamento interattivo

Una volta preparato il dischetto contenente GRUB, si può provare ad avviare un elaboratore. Quello che si ottiene è lo stesso funzionamento che si avrebbe in un'installazione priva di configurazione:

    GRUB  version 0.90  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]

grub>

Come si vede, appare anche una breve spiegazione sull'uso della riga di comando, che segue l'invito grub>.

Se non si ricordano i comandi disponibili, si può ottenere un elenco di questi con il comando help; inoltre, sempre con help si può ottenere una descrizione più dettagliata sulla sintassi di un comando particolare:

grub> help[Invio]

cat FILE                               chainloader [--force] FILE
cmp FILE1 FILE2                        color NORMAL [HIGHLIGHT]
configfile FILE                        debug
device DRIVE DEVICE                    displayapm
displaymem                             embed STAGE1_5 DEVICE
find FILENAME                          fstest
geometry DRIVE [CYLINDER HEAD SECTOR [ halt [--no-apm]
help [PATTERN ...]                     hide PARTITION
impsprobe                              initrd FILE [ARG ...]
install [--stage2=STAGE2_FILE] [--forc ioprobe DRIVE
kernel [--no-mem-option] [--type=TYPE] lock
makeactive                             map TO_DRIVE FROM_DRIVE
md5crypt                               module FILE [ARG ...]
modulenounzip FILE [ARG ...]           partnew PART TYPE START LEN
parttype PART TYPE                     password [--md5] PASSWD [FILE]
pause [MESSAGE ...]                    quit
read ADDR                              reboot
root [DEVICE [HDBIAS]]                 rootnoverify [DEVICE [HDBIAS]]
savedefault                            serial [--unit=UNIT] [--port=PORT] [--
setkey [TO_KEY FROM_KEY]               setup [--prefix=DIR] [--stage2=STAGE2_
terminal [--dumb] [--timeout=SECS] [co testload FILE
testvbe MODE                           unhide PARTITION
uppermem KBYTES                        vbeprobe [MODE]

Per esempio, si può cercare di vedere meglio la sintassi del comando find:

grub> help find[Invio]

find: find FILENAME
    Search for the filename FILENAME in all of partitions and print
    the list of the devices which contain the file.

GRUB è un sistema di avvio molto potente, ma non rimangono ugualmente delle limitazioni. In questo caso è stato mostrato un comando molto promettente, find, che però non può essere efficace quanto il programma omonimo dei sistemi Unix. Infatti, si deve tenere presente che GRUB è sì in grado di completare i nomi, come fa la shell Bash, ma attualmente non riconosce i caratteri jolly. Pertanto, i file vanno indicati sempre come percorsi assoluti, dove spesso è obbligatoria anche l'indicazione del disco o della partizione in cui si trovano.

Volendo fare un esempio concreto, si può immaginare di voler avviare un sistema GNU/Linux con la partizione principale corrispondente al file di dispositivo /dev/hda6, ma con il kernel collocato all'inizio di una partizione separata, corrispondente al file di dispositivo /dev/hda1:

grub> kernel (hd0,0)/vmlinuz-2.4.2 root=/dev/hda6 ro[Invio]

Evidentemente, per scrivere un comando del genere occorre sapere bene come è strutturato il sistema di partizioni, oltre al nome e alla collocazione del file del kernel. Se le idee sono un po' confuse, si può sfruttare l'abilità di GRUB nel completare i comandi. Si comincia con l'ispezionare i dischi:

grub> kernel (hd[Tab]

 Possible disks are:  hd0 hd1

In questo caso sono stati individuati due dischi fissi, ma si ritiene che il sistema da avviare risieda nel primo di questi due:

grub> kernel (hd0,[Tab]

 Possible partitions are:
   Partition num: 0,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 1,  Filesystem type is fat, partition type 0x6
   Partition num: 4,  Filesystem type unknown, partition type 0x82
   Partition num: 5,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 6,  Filesystem type is ext2fs, partition type 0x83

Si intuisce (oppure si riesce a ricordare) che la prima partizione era stata usata per contenere i file del kernel, oltre ad altri file del sistema di avvio usato precedentemente, mentre si intende che la partizione principale del sistema operativo dovrebbe essere quella che qui viene indicata come la numero cinque. In pratica, non può esserlo la numero uno, perché contiene un file system Dos-FAT e non può esserlo la numero quattro, perché è una partizione di scambio della memoria virtuale.

grub> kernel (hd0,0)/[Tab]

 Possible files are: lost+found System.map-2.2.15 boot.0300 boot.b boot.b.prese
rved chain.b chain.b.preserved config-2.2.15 map mbr.b os2_d.b os2_d.b.preserve
d part.0300 vmlinuz-2.2.15 System.map-2.4.2 config-2.4.2 vmlinuz-2.4.2

Come si vede, si ottiene così l'elenco dei file contenuti all'inizio della prima partizione del primo disco fisso. Si tratta evidentemente dei file usati da un altro sistema di avvio, assieme a due kernel. Si decide di avviare il kernel vmlinuz-2.4.2 e la ricerca è terminata, perché le altre informazioni sono specifiche del kernel (per cui GRUB non può suggerirle):

grub> kernel (hd0,0)/vmlinuz-2.4.2 root=/dev/hda6 ro[Invio]

Naturalmente, così come sono state aggiunte le opzioni root=/dev/hda6 e ro, se ne possono aggiungere altre, in base alle proprie esigenze. Ciò che è stato mostrato rappresenta il minimo: l'indicazione della partizione principale del sistema e il fatto che la si vuole aprire inizialmente in sola lettura.

Al termine, si richiede espressamente di avviare il sistema con il comando boot:

grub> boot[Invio]

Un sistema GNU/Linux può richiedere per l'avvio anche l'utilizzo di un disco RAM iniziale. Supponendo che si tratti del file initrd contenuto all'inizio della prima partizione del primo disco fisso, bisogna aggiungere anche il comando seguente, prima di avviare con boot:

grub> initrd (hd0,0)/initrd[Invio]

17.5   Installazione

In questo contesto, per installazione si intende la sistemazione del sistema di avvio; ciò si ottiene con il comando install, che viene mostrato qui in una forma leggermente semplificata rispetto alla sua sintassi completa:(2)

install file_stage1 [d] disco_di_avvio file_stage2 [p] [file_di_configurazione]

In pratica, è necessario indicare dove si trova il file da collocare nel primo settore del disco di avvio (il file stage1); il disco o la partizione in cui installare questo settore; dove si trova il file corrispondente a stage2; l'utilizzo o meno di un file di configurazione particolare.

L'opzione d, se usata, indica che il file stage2 si trova in un disco diverso da quello contenente il settore di avvio; l'opzione p serve a inserire alcune informazioni nel primo settore del file stage2, sulla partizione di installazione; se si vuole fare riferimento a un file di configurazione differente da /boot/grub/menu.lst, lo si aggiunge alla fine del comando.

Per arrivare a un esempio pratico, si propone il caso di un sistema GNU/Linux installato nella seconda partizione del primo disco fisso, all'interno della quale risiede anche la directory /boot/grub/, in cui si inseriscono tutti i file di GRUB, compreso il file di configurazione menu.lst:

grub> install (hd0,1)/boot/grub/stage1 (hd0) <-'
`->(hd0,1)/boot/grub/stage2 p[Invio]

Volendo essere espliciti, si può aggiungere il nome del file di configurazione, anche se in questo caso si tratta del nome e della collocazione predefiniti:

grub> install (hd0,1)/boot/grub/stage1 (hd0) <-'
`->(hd0,1)/boot/grub/stage2 p (hd0,1)/boot/grub/menu.lst[Invio]

In condizioni normali, il settore di avvio (il file stage1) viene installato in modo tale da fare riferimento al file stage2 collocato nello stesso disco (lo stesso disco in cui si trova il settore di avvio). In questo modo, uno spostamento del disco consentirebbe ancora l'avvio di GRUB, purché ci sia sempre il modo di partire da quel settore di avvio.(3) Con l'opzione d si slega questo collegamento e si fissa la posizione del file stage2 nel disco e nella partizione indicati.

Evidentemente, l'installazione può avvenire attraverso GRUB avviato da un dischetto, oppure, in presenza di un sistema funzionante, con l'ausilio dell'eseguibile grub. Evidentemente, utilizzando questo eseguibile, si avrà l'accortezza di non usare il comando boot e di terminare l'installazione con il comando quit.

17.6   Configurazione

Il file di configurazione usato per l'avvio è, più precisamente, un menù di voci; come tale non si tratta di un file indispensabile e nemmeno è necessario ripetere l'installazione quando lo si modifica.

La struttura di questo file è molto semplice. In generale le righe vuote o bianche vengono ignorate; inoltre, le righe che iniziano con il simbolo # sono ignorate nello stesso modo (non sono ammessi commenti in coda a delle direttive).

Le direttive di questo file sono fondamentalmente gli stessi comandi che si possono impartire attraverso la riga di comando di GRUB, se il contesto lo consente, con l'aggiunta di qualche direttiva specifica:

[direttiva_specifica_del_menù
...
...]

title titolo
comando
...

[title titolo
comando
...]...

In pratica, a parte le righe bianche, vuote e quelle di commento, si possono inserire inizialmente delle direttive specifiche, quindi si individuano dei gruppi di direttive introdotti dalla direttiva title, che le distingue con un titolo.

All'avvio, viene visualizzato un menù composto dalle voci corrispondenti ai titoli indicati dalle direttive title. Selezionando una di quelle voci si ottiene l'esecuzione dei comandi indicati sotto la direttiva title corrispondente, con l'aggiunta finale del comando boot che è implicito e non va indicato nel file del menù.

default 0
timeout 5

title Debian GNU/Linux (2.4.2)
kernel (hd0,5)/boot/vmlinuz-2.4.2 root=/dev/hda6 console=tty12 ro

title Debian GNU/Linux (2.2.15)
kernel (hd0,5)/boot/vmlinuz-2.2.15 root=/dev/hda6 console=tty12 ro

title FreeDOS
chainloader (hd0,1)+1

Si osservi l'esempio del listato che appare sopra. La direttiva default 0 indica di utilizzare in modo predefinito i comandi corrispondenti al primo titolo, se l'utente non tocca la tastiera entro cinque secondi, in base alla direttiva timeout 5, che appare subito dopo.

Sono presenti due voci per l'avvio di due kernel differenti utilizzando la stessa partizione principale, corrispondente al file di dispositivo /dev/hda6, con le stesse opzioni (che comunque riguardano il kernel e non GRUB). Inoltre, si può notare anche un titolo che fa riferimento a un sistema Dos, specificando che si deve usare il primo settore della prima partizione per avviarlo. Si può vedere il menù che si ottiene nella figura 17.1.

Figura 17.1. Esempio di un menù di GRUB.

    GRUB  version 0.90  (640K lower / 3072K upper memory)

.-------------------------------------------------------------------------.
| Debian GNU/Linux (2.4.2)                                                |
| Debian GNU/Linux (2.2.15)                                               |
| FreeDOS                                                                 |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
`-------------------------------------------------------------------------'
     Use the ^ and v keys to select which entry is highlighted.
     Press enter to boot the selected OS, 'e' to edit the
     commands before booting, or 'c' for a command-line.


  The highlighted entry will be booted automatically in 5 seconds.

Come si può vedere dagli stessi suggerimenti che appaiono sullo schermo, quando ci si trova di fronte a un menù del genere, è possibile rinunciare e passare alla riga di comando premendo il tasto [c], oppure è possibile modificare i comandi di una voce utilizzando il tasto [e]. La figura 17.2 mostra come funziona la modifica di una voce del menù, mostrando il caso della prima.

Figura 17.2. Modifica della prima voce del menù di GRUB.

    GRUB  version 0.90  (640K lower / 3072K upper memory)

.-------------------------------------------------------------------------.
| kernel (hd0,5)/boot/vmlinuz-2.4.2 root=/dev/hda6 console=tty12 ro      _|
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
|                                                                         |
`-------------------------------------------------------------------------'
     Use the ^ and v keys to select which entry is highlighted.
     Press 'b' to boot, 'e' to edit the selected command in the
     boot sequence, 'c' for a command-line, 'o' to open a new line
     after ('O' for before) the selected line, 'd' to remove the
     selected line, or escape to go back to the main menu.

Nelle sezioni seguenti vengono descritte le direttive e i comandi più importanti di GRUB.

17.6.1   Direttive specifiche per il file da usare come menù

Come accennato, alcune direttive hanno significato solo nel file di configurazione usato come menù. Queste direttive vanno collocate prima delle altre; precisamente vanno messe prima dell'elenco dei titoli che compongono in pratica le voci del menù stesso.

17.6.2   Comandi

I comandi sono quelle istruzioni che possono essere impartite a GRUB attraverso la riga di comando, oppure sotto una voce di menù, nel file di configurazione.

Tabella 17.1. Uso della tastiera nella riga di comando di GRUB.

Combinazione Alternativa Descrizione
Ctrl+f freccia destra Sposta il cursore in avanti.
Ctrl+b freccia sinistra Sposta il cursore all'indietro.
Ctrl+a Inizio Sposta il cursore all'inizio della riga.
Ctrl+e Fine Sposta il cursore alla fine della riga.
Ctrl+d Canc Cancella il carattere nella posizione del cursore.
Ctrl+k Taglia il testo dal cursore alla fine della riga.
Ctrl+u Taglia il testo dall'inizio della riga al cursore.
Ctrl+y Incolla quanto tagliato in precedenza nella posizione del cursore.
Ctrl+p freccia su Scorre all'indietro lo storico dei comandi.
Ctrl+n freccia giù Scorre in avanti lo storico dei comandi.
Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org

1) GRUB   GNU GPL

2) In particolare non viene mostrato come utilizzare i file della serie *_stage1_5.

3) Evidentemente, questo non significa poi che il sistema operativo possa avviarsi come prima.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome grub.html

[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]