Configurare GRUB per installare due (o più) distribuzioni Linux

GRUB (GRand Unified Bootloader) è il bootloader che attualmente va per la maggiore. Le funzionalità di un bootloader sono semplici: presentare all’avvio della macchina una lista di sistemi operativi e permettere all’utente di avviarne uno, selezionandolo.

Una cosa particolarmente interessante che ho notato quando ho iniziato ad avere a che fare con sistemi Linux, è il fatto che essi “preferiscano” la presenza contemporanea ad ambienti Windows, piuttosto che ad altre distribuzioni Linux. Nel caso infatti sulla mia macchina io abbia installato una qualsiasi versione di Windows, l’installer della mia distribuzione in questione si accorge solitamente di questo fatto e configura automaticamente GRUB apportunamente per il mio sistema. Questo non avviene se nel mio sistema sono presenti una (o più) altre distribuzioni Linux che io voglio affiancare a quella che sto installando.

In questo caso può succedere molto spesso che l’ultima distribuzione installata prenda il controllo dell’intera macchina, sovrascrivendo il bootloader installato in precedenza.

Ecco allora in alcuni passi un metodo per configurare semplicemente il vostro bootloader GRUB e configurarlo su una macchina che presenta diversi sistemi operativi linux differenti.

Naturalmente ci sono diverse soluzioni di configurazione possibili per ottenere il funzionamento di GRUB per gli scopi necessari e allo stesso modo ci sono diversi modi di gestire il/i vostri dischi nel momento in cui si trattano diversi sistemi operativi. È per esempio possibile, qualora si disponga di una macchina con più di un disco, dedicare a ciascun MBR di ciascun disco un bootloader differente e gestirlo in maniera autonoma. In questo caso Non è neanche necessario che tutti i bootloader siano dello stesso tipo. Si può benissimo utilizzare GRUB per un MBR e LILO per un altro. In questo caso è necessario “istruire” il bootloader principale, quello appartenente al MBR del primo disco che si avvia, su come raggiungere gli altri dischi attraverso l’istruzione chanloader (un po’ come avviene per Windows).

Tuttavia quella appena citata non mi sembra una soluzione per nulla “elegante”: non mi sembra giusto installare due bootloader quando in realtà ne serve soltanto uno, sia perché non intendo sporcare il MBR di un disco se non è strettamente necessario, sia perché penso che se ho bisogno di avviare diversi sistemi operativi non capisco il motivo per cui mi trovo costretto a dover installare ed occupare memoria per più bootloader. So che è questione di pochi MegaBytes, e a giorno d’oggi di memoria ce n’è tanta, ma è più una questione di principio. Non capisco perché sprecare memoria quando ci sono soluzioni alternative.

Per l’esempio che farò supponiamo di avere due dischi (sda ed sdb). Questo è il numero minimo di partizioni che serviranno:

  • sda1: Sistema A;
  • sda2: Swap
  • sdb1: Sistema B

In questo caso supponiamo di installare per prima cosa il sistema A. In questo caso possiamo utilizzare un’utilty di partizionamento automatico, utilizzando tutto il disco sda per l’installazione del sistema A. In questo modo verranno create automaticamente una partizione per il filesystem ed una per lo spazio di swap. Durante l’installazione potrebbe venirci chiesto anche dove posizionare il bootloader, in questo caso rispondiamo pure che lo vogliamo posizionare nel MBR del primo disco, (/dev/sda). Al termine dell’installazione proviamo il nostro sistema, e verifichiamo che tutto funzioni correttamente. Non c’è ragione per cui a questo punto ci siano dei problemi.

Ora procediamo con l’installazione del sistema B. Al momento di partizionare i dischi, scegliamo di utilizzare un partizionamento manuale piuttosto che una procedura automatica. Formattiamo tutto il secondo disco (sdb) per il filesystem del nuovo sistema e indichiamo di voler utilizzare come swap la partizione già creata in /dev/sda2; perché sprecare tanto spazio per diverse partizioni swap, quando solo una di esse alla volta è richiesta? Terminiamo l’installazione, ponendo particolare attenzione a non installare alcun bootloader. In questo momento non dobbiamo sovrascrivere il bootloader installato in precedenza, altrimenti rischieremmo di perdere la possibilità di avviare il sistema A.

Ubuntu_installation
Questo è quello che si deve fare nell’installazione di Ubuntu Gutsy

Una volta terminata l’installazione del sistema B riavviamo la macchina e ci accorgeremo che il bootloader ci permette di avviare il solo sistema A. Entriamo quindi nel sistema A e preoccupiamoci di modificare opportunamente il file che “controlla” GRUB: apriamo /boot/grub/menu.lst (servono i permessi di amministratore) e noteremo che nella parte finale ci sono alcuni gruppi di righe come queste:


title Nome sistema, versione kernel
root (hd0,0)
kernel /vmlinuz-v.v.vv-v-vvv root=path
initrd /initrd.img-v.v.vv-v-vvv
savedefault

Dobbiamo aggiungere un gruppo di linee proprio come queste, ma prima di farlo bisogna capire come GRUB identifica le nostre partizioni. Questo è molto semplice: il primo hard disk (sda, o hda che sia, a seconda del sistema in cui vi trovate) sarà identificato da GRUB come hd0, il secondo hd1 e così via. Per identificare le partizioni la procedura è analoga: la partizione indicata con (hd0,0) sarà la prima partizione del primo disco, (hd0,1) la seconda del primo disco. Quindi le partizioni del sistema che stiamo utilizzando saranno così identificate da GRUB:

  • sda1 -> (hd0,0): Sistema A
  • sda2 -> (hd0,1): Swap
  • sdb1 -> (hd1,0): Sistema B

A questo punto è piuttosto semplice configurare GRUB in modo da poter avviare entrambi i sistemi. Ciò che ci serve sono i file initrd.img-version e vmlinuz-version di ciascuna distribuzione che vogliamo avviare. Più correttamente ciò che ci serve sapere è la loro locazione all’interno della partizione di avvio del sistema. Messa in questo modo può sembrare abbastanza complicato, ma con alcuni esempi il concetto si semplifica notevolmente.

Per inserire una nuova partizione, inseriamo una nuova riga title. Tutti i comandi inseriti tra questa riga e la prossima riga title faranno quindi riferimento al sistema che stiamo definendo. Il testo da scrivere a fianco di title è personalizzabile e serve a identificare il sistema che stiamo definendo nella lista che GRUB presenta all’avvio della macchina.

title Sistema B GNU/Linux, kenrel 2.x.xx-xxx

Successivamente è necessario indicare quale è la partizione contenente i file per l’avvio del sistema per quel sistema. Non sempre questa partizione coincide con quella di root del sistema. Per esempio, in un sistema in cui alla directory /boot è stata dedicata una partizione riservata la partizione di boot e quella del filesystem di sistema non coincidono. Non è questo il nostro caso, ma giusto per sapervi adeguare nel caso aveste un sistema personalizzato. Per questo sistema la partizione di boot per il sistema B è sdb1, quindi, nella dicitura di GRUB, (hd1,0):

root (hd1,0)

Ora indichiamo a GRUB dove si trova il file vmlinuz, che corrisponde ad un’immagine eseguibile del kernel di sistema. Nell’indicare la posizione di questa immagine è anche necessario stabilire la partizione di root, cioè la partizione relativa sulla quale è posizionato il filesystem. Ancora, nel nostro caso questa corrisponde alla partizione di boot, ma nel caso il vostro sistema fosse configurato diversamente potrebbe essere necessario prendere effettuare gli opportuni cambiamenti. La posizione da indicare è relativa alla partizione di boot. Il valore di questi parametri varia notevolmente a seconda della configurazione del vostro sistema.

kernel /boot/vmlinuz-v.v.vv-vvv root=/dev/sdb1 ro splash

L’ultima istruzione da dare a GRUB è relativa al file initrd, che corrisponde al “initial ramdisk” e permette al sistema di utilizzare i driver necessari per l’avvio del file vmlinuz

initrd /boot/initrd.img-v.v.vv-vvv

Concludiamo quindi la sezione con:

savedefault

Ecco la sezione in un unico blocco di testo, senza i miei commenti in mezzo:


title Sistema B GNU/Linux, kenrel 2.x.xx-xxx
root (hd1,0)
kernel /boot/vmlinuz-v.v.vv-vvv root=/dev/sdb1 ro splash
initrd /boot/initrd.img-v.v.vv-vvv
savedefault

Inoltre, per avere un migliore controllo del file menu.lst da entrambi i sistemi operativi, vi consiglio di creare un link simbolico nella directory /boot del sistema B sulla directory boot del sistema A, secondo il percorso sul quale questa è montata nel vostro filesystem. Se per esempio sul sistema B la partizione di root del sistema A (/dev/sda1) è montata sotto /dischi/sistemaA, allora il link sarà creato, sul sistema B, in questo modo:

$: sudo ln --symbolic /dischi/sistemaA/boot/grub /boot/grub

In questo modo è possibile controllare i file relativi al bootloader da entrambi i sistemi con estrema semplicità.

È molto difficile fare una guida generale per questo genere di problemi, perché quando si parla di installazione di un sistema le procedure potrebbero cambiare a seconda della distribuzione. Qui ci sono le linee generali per come comportarsi nel caso di una nuova installazione. Ogni consiglio ed integrazione di questa guida è il benvenuto. Maggiori informazioni possono essere comunque reperite sulla guida ufficiale di GRUB.

5 Risposte

  1. Le tue istruzioni mi sono state molto utili.
    Adesso con grub, posso scegliere se eseguire debian5.0 o ubuntu 8.10
    Adesso posso mandare in pensione, il pessimo O.S. Windows Vista.

    Grande, continua ad aiutare i poco esperti dei vari sistemi linux.

    Grazie.

  2. Ottima guida! Sto pensando di installare sulla stessa macchina 2 distribuzioni, Ubuntu 8.10 per l’utilizzo quotidiano e 64Studio per applicazioni audio. Ora mi è chiaro com configurare GRUB.

    Grazie

  3. Come tutti gli articoli di questo sito: utili e semplici!

  4. come faccio a modificare il file menu.lst come amministratore?

  5. sudo gedit /boot/grub/menu.lst &

Scrivi una risposta a jekbau Cancella risposta