Installazione di Grub

Normalmente Grub è già installato in Debian. Se però si è installato, per ultimo, un S.O. (come MS-Windows) che ignora la presenza di altri sistemi sul disco e vuole monopolizzare il nostro pc, ci si trova nella necessità di installare nuovamente Grub per riappropriarci della libertà di scegliere. Può anche succedere di aver provato un altro boot loader e di voler ritornare a Grub: anche in questo caso basta seguire quanto segue.

Per usare Grub è necessario installarlo nel MBR (in realtà è anche possibile installarlo solo in un floppy) con il seguente comando:

# grub-install --no-floppy /dev/hda

in questo modo ogni altro boot loader verrà sovrascritto e all'avvio apparirà grub che permetterà di avviare ogni sistema presente su hard disk. Non è necessario avere tanti boot loader anche se si installano tante distribuzioni, ne basta uno che le fa partire tutte.

Se si è installato windows, gli altri S.O. non saranno più avviabili. Come si fa allora a eseguire il precedente comando per ripristinare grub? Basta usare un livecd per avviare il sistema, non è neanche necessario che ci sia grub in tale cd. Dopo l'avvio, monteremo la partizione di root del sistema linux installato su hard disk:

# mkdir /mnt/root

# mount /dev/hda3 /mnt/root

dove si è fatta l'ipotesi che sia /dev/hda3 la partizione di root. Ora con chroot si può cambiare al volo la partizione di root del nostro livecd:

# chroot /mnt/root

Adesso abbiamo sotto di noi la root del sistema installato su disco. Montiamo anche la partizione di boot, se questa è posta in una partizione separata. A questo punto possiamo eseguire grub-install come visto prima per ripristinare grub. Se si vuole si può anche generare automaticamente un menu di avvio con il comando update-grub.

Vediamo ora di capire un poco meglio quali sono i vari componenti di grub.

Il "primo pezzo di grub" (detto stage1) risiede nel MBR, il "secondo pezzo di grub" (stage2) ed i file di configurazione risiedono nella partizione di root di grub: questa sarà la partizione montata in /boot se si ha una partizione separata per /boot, altrimenti sarà la partizione di root del sistema (montata in /). La cartella in cui risiede lo stage2 e tutti i file di configurazione di grub è in ogni caso /boot/grub/.

Il menu iniziale del Grub è configurato nel file /boot/grub/menu.lst, basta modificarlo ed all'avvio Grub leggerà la nuova configurazione. Il comando update-grub genera automaticamente appunto questo file, anche se con alcune limitazioni (per maggiori informazioni vedere la sezione update-grub).

Dopo l'installazione di grub, lo stage1 resterà sempre immutato e punterà allo stage2. Lo stage2, caricherà i file di configurazione che potranno essere modificati a piacimento senza mai dover modificare il settore di avvio (MBR).

[edit]

Far partire il sistema principale

Chiameremo sistema principale il sistema sotto il quale avete installato Grub. Vediamo i comandi necessari per fare partire un kernel, questi possono essere inseriti interattivamente all'avvio di Grub. Successivamente vedremo come inserirli in /boot/grub/menu.lst per creare una voce nel menu di grub.

Innanzi tutto dobbiamo dire a Grub qual'è la sua partizione di root, che è /boot (ci siamo?). Ma in che partizione è /boot? E' la partizione montata in /boot quando avete dato grub-install. Controllate il file /etc/fstab per vedere qual'è. Se fosse /dev/hda3, dovremmo scrivere al prompt di grub (Linea di comando di grub - Appare al boot premendo il tasto 'e' seguito da 'c')

root (hd0,2)

fate attenzione perchè Grub numera sia i dischi che le partizioni, e lo fa partendo da 0, quindi il disco hda corrisponde ad hd0, e il numero della partizione è di una unità in meno rispetto al numero che ha sotto linux.

Se fosse /dev/hda1 dovremmo dare: root (hd0,0), chiaro?

Nota Ricordate che con la tastiera italiana, all'avvio, le parentesi si fanno con shift+0 e shift+9 mentre lo slash (/) con il tasto - ed il segno di uguale con ì.

Ora carichiamo il kernel. Poniamo che il file sia /boot/vmlinuz-2.6.6s26-mio-kernel. Supponiamo che la partizione di root del kernel (cioè proprio la root del sistema) sia /dev/hda4, scriveremo nel prompt di grub (Linea di comando di grub - Appare al boot premendo il tasto 'e' seguito da 'c') come secondo comando:

kernel /vmlinuz-2.6.6s26-mio-kernel root=/dev/hda4 ro vga=791

vedete? Partendo dalla root di grub, che è /boot sotto linux, il file del kernel è semplicemente in /. In ogni caso è qui che l'autocompletamento (premendo TAB, lo sapete no?) gioca il suo ruolo migliore, e permette di scegliere il file corretto. Gli ultimi due parametri sono:

ro: accede inizialmente alle partizioni in sola lettura. E' buona norma inserirlo sempre.

vga=791: fa partire il sistema in frame buffer (console ad alta risoluzione). Per maggiore informazione leggete più avanti il capitolo dedicato.

A questo punto basta dare il comando boot per fare partire (si spera) il sistema.

Nota Se non si ha una partizione separata per /boot, bisognerà indicare la partizione di root del sistema come root di grub. In questo caso però, il kernel non si troverà in /vmlinuz ma in /boot/vmlinuz.

[edit]

Far partire un secondo sistema

Se avete il kernel di una seconda distro sempre nella partizione di boot /dev/hda3, basta cambiare il nome del file del kernel e l'opzione root=/dev/hda4 per indicare la corretta partizione di root della seconda distro. Se invece il file del kernel della seconda distro risiede in un'altra partizione che non sia la boot della prima distro (potrebbe essere una seconda partizione di boot creata dalla seconda distro o direttamente la partizione di root della seconda distro), basta indicare il percorso completo a grub. Supponiamo che la partizione contenete l'altro kernel sia /dev/hda7 e che questa sia la root della seconda distro, per caricare il kernel scriveremo:

kernel (hd0,6)/boot/vmlinuz-2.6.6-altra-distro root=/dev/hda7 ro vga=791

ovviamente avvelendoci il più possibile dell'autocompletamento per facilitare le cose. Notate come in questo caso abbiamo inserito /boot perchè non c'è una partizione di boot ma solo una sotto-directory di root nella medesima partizione ovvero (hd0,6) (/dev/hda7 in gergo linux).

Se avete un kernel che usa l'initrd (di solito tutti i kernel ufficiali delle distro, ma io sconsiglio di usare l'initrd se invece vi ricompilate il kernel) prima di dare il comando boot dovrete caricare anche l'immagine del ramdisk. Ovvero scrivere (dopo aver caricato il kernel) il seguente comando nel prompt di grub (Linea di comando di grub - Appare al boot premendo il tasto 'e' seguito da 'c')

initrd /initrd.img-2.6.6-s26-mio-kernel

oppure

initrd (hd0,6)/initrd.img-2.6.6-altra-distro

a seconda di dove si trova l'immagine (si trova sempre nella stessa partizione/directory del suo kernel).

ATTENZIONE: Un kernel partirà solo con la sua immagine initrd, se provate ad usare immagini initrd di altri kernel il sistema non partirà dando un Kernel Panic. Analogamente se cercate di fare partire un kernel che necessita di initrd, senza initrd il sistema andrà ancora in Kernel Panic.

[edit]

Configurare il Menù di grub

Il menu di grub si imposta tramite il file /boot/grub/menu.lst. L'intestazione di questo file può contenere molti comandi. Noi vedremo solo un esempio semplicissimo ma pienamente sufficiente ai nostri scopi:

default 0

timeout 5

color light-gray/blue yellow/blue

Inserendo queste righe all'inizio del menu.lst diremo a grub che all'avvio dovrà attendere 5 secondi (timeout) e dopo di che scegliere il primo kernel dell'elenco (il numero 0, ricordate che Grub inizia a contare da zero?). Il menù sarà presentato con i colori indicati, secondo il seguente schema: caretteri/sfondo rispettivamente per il testo normale e per il testo evidenziato.

Adesso, inseriamo i blocchi per i vari kernel. Come visto per fare partire un kernel servono tre comandi: root, kernel, boot (oppure nel caso ci sia l'initrd root, kernel, initrd, boot). Nel menu.lst bisogna inserire in più soltanto un primo comando (title) che specifica il nome che apparira all'avvio per quel kernel nel menù del grub. In pratica, usando gli esempi precedenti dei due kernel, dovremmo avere un menu.lst del genere:

default 0

timeout 5

color light-gray/blue yellow/blue

title Prima Distribuzione (puoi scrivere quello che vuoi)

root (hd0,2)

kernel /vmlinuz-2.6.6s26-mio-kernel root=/dev/hda4 ro vga=791

boot

title Seconda Distribuzione (puoi scrivere quello che vuoi)

root (hd0,2)

kernel (hd0,6)/boot/vmlinuz-2.6.6-altra-distro root=/dev/hda7 ro vga=791

boot

Seguendo questo schema portrete aggiungere quanti kernel volete, ma ricordate che potrete provare prima i comandi interattivamente dal prompt di grub (Linea di comando di grub - Appare al boot premendo il tasto 'e' seguito da 'c')

Nel caso i kernel abbiano bisogno dell'initrd il menu.lst dovrebbe semplicemente contere un comando in più per ogni kernel:

default 0

timeout 5

color light-gray/blue yellow/blue

title Prima Distribuzione (puoi scrivere quello che vuoi)

root (hd0,2)

kernel /vmlinuz-2.6.6s26-mio-kernel root=/dev/hda4 ro vga=791

initrd /initrd.img-2.6.6-s26-mio-kernel

boot

title Seconda Distribuzione (puoi scrivere quello che vuoi)

root (hd0,2)

kernel (hd0,6)/boot/vmlinuz-2.6.6-altra-distro root=/dev/hda7 ro vga=791

initrd (hd0,6)/initrd.img-2.6.6-altra-distro

boot

Ovviamente, il blocco di un kernel potrebbe contere il comando initrd ed il blocco di un altro no, a seconda che il kernel in oggetto lo richieda o meno.

A questo punto, se avete appreso i concetti di base dovreste essere in grado di configurare il menu di grub per qualsiasi esigenza. Per i più intraprendenti aggiungo un ultima chicca. Se nel blocco di ogni kernel inserite, prima del comando boot, il comando savedefault e modificate il comando default 0 in default save, all'avvio grub (dopo il timeout) sceglierà il kernel che avete scelto nel precedente avvio (vedi nota).

[edit]

2005-12-09T19:53:50