Appendice 5: Grub il boot loader



Durante l'installazione viene installato un bootloader. Viene proposto Grub, ma si può sceglierne un'altro: lilo.
Fra i due consiglio Grub.
Ma cos'è e come si può configurare?

Un bootloader è quel programmino che, installandosi nell'mbr del disco di boot, all'avvio del PC ci mostra un menu da cui scegliere il sistema operativo con cui avviare il computer.

Volendo installare sullo stesso computer Windows e Linux è necessario installare per primo il sistema operativo della microsoft.
Il perchè è presto detto: Windows non è tollerante come Linux e se trova nel MBR un programma, lo cancella sostituendolo col suo. E il suo non riconosce (o non accetta) la presenza di altri sistemi operativi sullo stesso computer.
Il discorso è diverso con Linux.
Installandolo come secondo sistema operativo (anche su una partizione secondaria visto che non è così schizzinoso come Windows) prima di installare il boot loader fa una ricerca sui dischi fissi e se trova un qualche altro sistema operativo lo accoda al menu.
In questo modo al riavvio nel menu comparirà anche Windows.

Grub ha una sua cartella ed un suo file si configurazione.
La cartella è:
/boot/grub
Il file di configurazione:
menu.list
Per configurarlo (ciò può essere necessario se si aggiunge un disco fisso o se si cambia e/o aggiunge un kernel) apri con kwrite il file /boot/grub/menu.list. Il suo contenuto sarà simile a questo (le linee che cominciano con # sono commenti):

# Modified by YaST2. Last modification on gio set 29 20:12:28 UTC 2005
# Quale opzione viene avviata di default. 0 è la prima, 1 la seconda etc.
default 0
# Quanti secondi attendere prima di avviare l'opzione di default.
timeout 30
# Un'immagine gradevole
# Da commentare se non si dispone di scheda grafica
splashimage=(hd0,0)/grub/splash.xpm.gz
###Don't change this comment - YaST2 identifier: Original name: linux
### title=SUSE LINUX 10.0
# La partizione dove si trova l'immagine del kernel (o il sistema operativo)
root (hd1,0)
kernel /vmlinuz root=/dev/sdb5 vga=0x31a selinux=0 resume=/dev/sda2 splash=silent showopts
initrd /initrd

###Don't change this comment - YaST2 identifier: Original name: Gentoo (/dev/sda1)##
# ### 1
title Gentoo
root (hd0,0)
kernel /vmlinuz root=/dev/sda3 ro console=tty0
savedefault
boot

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Dischetto
chainloader (fd0)+1

# Le prossime quattro righe vanno messe solo se si ha un dualboot con Windows.
# In questo caso, Windows è in /dev/hda
6. title=Windows XP
rootnoverify (hd0,5)
makeactive
chainloader +1

Esaminiamo più da vicino la riga 'kernel /vmlinuz root=/dev/sda3 ro console=tty0'.
E' l'indicazione per Grub di dove si trova il kernel. In questo caso è nel primo disco, partizione 1 (hd0,0) della riga precedente.
'vmlinuz' è il nome del kernel. Nel nostro caso vmlinuz è un link 'simbolico' (un puntatore) (*) al kernel effettivo. Al suo posto potremmo scrivere il nome completo del kernel (ad esempio: vmlinuz-2.6.13.2-2-default.Tale sostituzione diventa necessaria se si installano diversi kernel per la stessa distribuzione: il link simbolico va bene per il primo kernel, ma per gli altri bisogna evidentemente indicare il nome completo.
Il termine 'root=/dev/sda3' indica a Grub dove si trova il file radice (terza partizione del primo disco).
Se il kernel ha bisogno dell'immagine initrd, a questa riga seguirà (come nel caso di Suse) la riga:
initrd /initrd
dove anche qui /intrd è un link simbolico e, volendo, può essere sostituito con il suo effettivo nome (ad esempio: /initrd-2.6.13.2-2-default.img). Tale sostituzione diventa necessaria se si installano diversi kernel per la stessa distribuzione: il link simbolico va bene per il primo initrd, ma per gli altri bisogna evidentemente indicare il nome completo.

(*) Link simbolico
Come utenti di Windows, avete probabilmente dimestichezza con i collegamenti (link), che sono quelle icone con freaccina, il cui nome inizia con 'Collegamento a'.
E' un sistema molto comodo per radunare in un unico posto le applicazioni e i documenti usati più frequentemente, che, materialmente, restano dov'erano. Il collegamento è un semplice rimando.

Linux ha due tipi di collegamenti:
il link fisico (hard link) che esegue una copia integrale del file cui è linkato (avrete così due files identici in diverse posizioni) e quello 'simbolico' o 'soft' che è uguale al link di Windows.
Se in /dev date un'occhiata ai vari devices, troverete probabilmente anche il device /dev/cdrom che non è affatto un device, ma un collegamento simbolico al vero device /dev/hdc
I collegamenti simbolici in Konqueror sono mostrati in 'italico' e mettendoci sopra il mouse appare nella parte inferiore di Konqueror la destinazione cui puntano..

Un link simbolico si fa col comando ln -s file_cui_si_punta nome_link
Ad esempio in /usr/src dovrebbe esserci la cartella simbolica 'linux' che punta alla cartella del sorgente del kernel in uso.
Se manca, la si crea spostandosi nella directory /usr/src e dando il comando:
ln - s /usr/src/nome_cartella_kernel_usato /usr/src/linux

APPROFONDIMENTO

Grub è un piccolo sistema operativo che consente di intervenire sui parametri di boot.
In altre parole se il menu.list è sbagliato, lo si può correggere al boot.

Ma perchè il menu.list dovrebbe essere sbagliato?

Ciò accade abbastanza spesso.
Il disco riconosciuto all'atto dell'installazione di un nuovo kernel può essere diverso dall'ordine con cui al boot vengono riconosciuti i dischi (il primo disco per il sistema operativo potrebbe invece essere il secondo al boot).
Anche la semplice installazione di un nuovo harddisk potrebbe influenzare l'ordine con cui sono visti i dischi al boot (non dimentichiamo che oggi vi sono ancora tre tipi di dischi: ata, papa e sata.

Cosa fare se allora se il sistema non parte?

Caso 1: partizine apposita per /boot
Blocchiamo innanzitutto Grub alla schermata di scelta premendo il tast e (che significa edita).
Apparirà un riquadro con tre righe. Ad esempio:

 
title     Gentoo
root     (hd0,0)
kernel     /vmlinuz root=/dev/sda3 ro console=tty0
savedefault
boot

dove potrebbero mancare le righe con savedefault e invece esserci la rifa initrd        /initrd.img
Per Ubuntu ad esempio avremo:

### 1

title        Ubuntu, kernel 2.6.20-15-generic 
root        (hd3,7)
kernel        /vmlinuz-2.6.20-15-generic root=UUID=0d0eb574-5776-427a-86ea-9f289a3a3419  ro quiet vga=791
initrd        /initrd.img-2.6.20-15-generic
boot

Per prima cosa una notazione. Nell'esempio di Ubuntu vediamo subito che alla dizione /dev/sd.. è stata sostituita una strana sigla. E' il cosiddetto UUID (indicatore unico del disco. Lo si ottiene lanciando a sistema avviato e come root il comando /bin/ls -lF /dev/disk/by-uuid/  che elenca tutti i dischi col loro UUID).
Se c'è nel vostro menu.list normalmente è corretto.

Resta allora da sistemare solo l'indicazione del disco di Grub (hdx,y).

  1. Posizionatevi sulla riga kernel        /vmlinuz.. root=..... ... usando le freccette su e giù, e premete il tasto e (edita).
  2. Vi apparirà l'intiera riga che potete navigare con i tasti destra e sinistra.
  3. Ponete il cursore sopra il carattere / e scrivete (hdx,y) ove x e y sono i valori della riga root        (hdx,y)
  4. Ponete il cursore sopra il carattere v di vmlinz e premete spazio. L'inter ariga si allontanerà di uno spazio da /
  5. Tornate col cursore sopra / e premete il tasto tab. Sotto vi apparirà qualcosa, o meglio ciò che Grub vede nella partizione y del disco x.
Quasi certamente non vedrete il kernel di cui vorreste fare il boot. Il motivo è che o il disco indicato non è quello giusto o, se lo è, non è giusta la pertizione. Vedrete probabilmente altri files, o alcune directories o semplicemente nulla.
Sotto tutto questo viene riscritta la line di grub.
Posizionatevi allora col cursore sul numero x di (hdx,y) e cambiatelo. Poi ripetete il punto 5.
Rifate ovviamente il tutto controllando ciascun disco finchè non appaiano i nomi dei kernels, comprso quello che volete.

Se non appare il kernel allora vuol dire che la partizione non è quella giusta e va trovato, per tentativi, anche il giusto valore di y.

Una volta sistemato a dovere (hdx,y), togliete lo spazio che avevate inserito dopo / (importante, altrimenti non trova il kernel) e premete invio. Adesso bisogna correggere la linea sottostante initrd        /initrd.img .... (se c'è).

Posizionatevi sulla riga initrd        /initrd.img... usando le freccette su e giù, e premete il tasto e (edita).
Vi apparirà l'intiera riga che potete navigare con i tasti destra e sinistra.

  1. Ponete il cursore sopra il carattere / e scrivete (hdx,y) ove x e y sono i valori della riga root        (hdx,y) ove x e y sono i valori trovati precedentemente.
  2. Ponete il cursore sopra il carattere i di initrd e premete spazio. L'intera riga si allontanerà di uno spazio da /
  3. Tornate col cursore sopra / e premete il tasto tab. Sotto vi apparirà qualcosa, o meglio ciò che Grub vede nella partizione y del disco x
Dovreste vedere il vostro initrd. Togliete lo spazio che avevate inserito dopo / e premete invio.

Resta a questo punto da correggere la linea root     (hdx,y) iniziale. Premiamo e , ci posizioniamo col cursore prima su x e poi su y e sotituiamo a x e y i valori trovati. Poi premiamo invio.

Adesso prendiamo nota dei cambiamenti (ci serviranno per modificare il file menu.liist), incrociamo le dita e premiamo il tasto b (boot).

Il sistema dovrebbe riavviarsi (se non lo facesse alla fine indico le possibili cause dell'insuccesso).
Una volta avviato il sistema, cambiamo il file /boot/grub/menu.list con i valori che abbiamo trovato.
(ovviamente anche per le voci riguardanti i vecchi kernels).

Caso 2: /boot è nella partizione radice
Blocchiamo innanzitutto Grub alla schermata di scelta premendo il tast e (che significa edita).
Apparirà un riquadro con tre righe. Ad esempio:

 
title     Gentoo
root     (hd0,0)
kernel     /boot/vmlinuz root=/dev/sda3 ro console=tty0
savedefault
boot

dove potrebbero mancare le righe con savedefault e invece esserci la rifa initrd        /initrd.img
Per Ubuntu ad esempio avremo:

### 1

title        Ubuntu, kernel 2.6.20-15-generic 
root        (hd3,7)
kernel        /boot/vmlinuz-2.6.20-15-generic root=UUID=0d0eb574-5776-427a-86ea-9f289a3a3419  ro quiet vga=791
initrd        /boot/initrd.img-2.6.20-15-generic
boot

Come si vede la differenza sta nella directory /boot che nel caso 1 non c'era. Il procedimento è simile.

  1. Posizionatevi sulla riga kernel        /boot/vmlinuz.. root=..... ... usando le freccette su e giù, e premete il tasto e (edita).
  2. Vi apparirà l'intiera riga che potete navigare con i tasti destra e sinistra.
  3. Ponete il cursore sopra il carattere / (il primo, ovviamente) e scrivete (hdx,y) ove x e y sono i valori della riga root        (hdx,y)
  4. Ponete il cursore sopra il carattere v di vmlinz e premete spazio. L'intera riga si allontanerà di uno spazio da /
  5. Tornate col cursore sopra /  (quello che segue boot) e premete il tasto tab. Sotto vi apparirà qualcosa, o meglio ciò che Grub vede nella partizione y del disco x.
Quasi certamente non vedrete il kernel di cui vorreste fare il boot. Il motivo è che o il disco indicato non è quello giusto o, se lo è, non è giusta la pertizione. Vedrete probabilmente altri files, o alcune directories o semplicemente nulla.
Sotto tutto questo viene riscritta la line di grub.
Posizionatevi allora col cursore sul numero x di (hdx,y) e cambiatelo. Poi ripetete il punto 5.
Rifate ovviamente il tutto controllando ciascun disco finchè non appaiano i nomi dei kernels, comprso quello che volete.

Se non appare il kernel allora vuol dire che la partizione non è quella giusta e va trovato, per tentativi, anche il giusto valore di y.

Una volta sistemato a dovere (hdx,y), togliete lo spazio che avevate inserito dopo / (importante, altrimenti non trova il kernel) e premete invio. Adesso bisogna correggere la linea sottostante initrd        /initrd.img .... (se c'è).

Posizionatevi sulla riga initrd        /boot/initrd.img... usando le freccette su e giù, e premete il tasto e (edita).
Vi apparirà l'intiera riga che potete navigare con i tasti destra e sinistra.

  1. Ponete il cursore sopra il carattere / e scrivete (hdx,y) ove x e y sono i valori della riga root        (hdx,y) ove x e y sono i valori trovati precedentemente.
  2. Ponete il cursore sopra il carattere i di initrd e premete spazio. L'inter ariga si allontanerà di uno spazio da /
  3. Tornate col cursore sopra / (quello che segue boot) e premete il tasto tab. Sotto vi apparirà qualcosa, o meglio ciò che Grub vede nella partizione y del disco x
Dovreste vedere il vostro initrd. Togliete lo spazio che avevate inserito dopo / e premete invio.

Resta a questo punto da correggere la linea root     (hdx,y) iniziale. Premiamo e , ci posizioniamo col cursore prima su x e poi su y e sotituiamo a x e y i valori trovati. Poi premiamo invio.

Adesso prendiamo nota dei cambiamenti (ci serviranno per modificare il file menu.liist), incrociamo le dita e premiamo il tasto b (boot).

Il sistema dovrebbe riavviarsi (se non lo facesse alla fine indico le possibili cause dell'insuccesso).
Una volta avviato il sistema, cambiamo il file /boot/grub/menu.list con i valori che abbiamo trovato.
(ovviamente anche per le voci riguardanti i vecchi kernels).

Nonostante tutto il boot non avviene
Se il boot non avviene possono esserci molteplici cause.
  1. Appare l'errore file not found.
    Ciò significa che non viene trovato il kernel o l'initrd.
    Se abbiamo fatt in modo corretto i passi di cui sopra, la causa più probabile è un errore nella scrittura dei nomi del kernel e di initrd. La soluzione è rifare la procedura e porre estrema attenzione a come sono scritti i nomi del kernel e di initrd.
  2. Il boot inizia, ma termina con kernel panic.
    La causa probabile è che manca l'initrd (alcuni sistemi operativi ne hanno bisogno) oppure il contrario: c'è un initrd che non serve.
    Potrebbe anche essere che manchi la linea con savedeafault (qualche S.O. la richiede) oppure che ci sia, ma che il sistema operativo non la voglia. Soluzione: provare a togliere (se c'è) savedefault, o metterlo se non c'è.
    Discorso analogo per initrd.
    Ricordarsi sempre, comunque, quando si compila un kernel di seguire le istruzioni del proprio S.O.. Spesso esistono anche tools appositi.
    Qualora non si riuscisse a fare il boot, provare con il kernel precedente (potrebbe anche essere che il kernel nuovo sia difettoso).
Indice

Valid HTML 4.01 Transitional