Sarà capitato sicuramente a molti di dover editare il bootloader di linux per poter avere la possibilità di scegliere, all’avvio del computer, quale sistema operativo avviare tra quelli installati. Quando era ancora presente, chiamiamolo così, il grub1 era cosa abbastanza semplice. Bastava infatti modificare il file menu.lst, presente nella cartella /boot/grub, aggiungendo in coda gli altri sistemi operativi.
Con il nuovo grub le cose sono alquanto diverse. Possiamo subito notare che il file menu.lst è stato sostituito dal grub.cfg. Inoltre se apriamo il file grub.cfg:

# nano /boot/grub/grub.cfg

possiamo leggere all’inizio: “NON EDITARE QUESTO FILE. Esso è generato automaticamente da grub-mkconfig usando i templates presenti in /etc/grub.d e le impostazioni di /etc/default/grub”

Immagine del file grub.cfg

Allora come si fa per aggiungere un altro sistema operativo e renderlo disponibile all’avvio?
Nel messaggio di avvertenza abbiamo visto che ci sono due percorsi da cui grub attinge per le proprie impostazioni. Se andiamo nel primo troviamo una serie di files tra cui uno di nome 40_custom, e già il nome ci fa pensare che possa essere personalizzabile. Aprendolo possiamo leggere: “Questo file fornisce un semplice modo per aggiungere voci personalizzate nel menu (di grub). Scrivi semplicemente la voce che vuoi aggiungere dopo questo commento…”

Immagine del file 40_custom

Allora non ci resta che aggiungere il nostro sistema operativo così come ci viene suggerito.
Ecco un esempio in cui aggiungiamo alla lista dei sistemi una voce che permette di caricare Gentoo Linux:

menuentry "Gentoo Linux 2.6.34" {
set root=(hd0,2)
# oppure
# search --no-floppy --fs-uuid --set 370fa292-2495-4410-8d88-e5464b3b015a
linux /boot/kernel-2.6.34-gentoo-r1
}

Il comando menuentry alla prima riga identifica il nome del sistema operativo da visualizzare nel menù di grub visibile all’avvio.
Nella seconda riga non viene impostata la root del sistema, nonostante il nome della variabile. In realtà ,dopo aver fatto una serie di test, ho notato che “root” fa riferimento alla partizione /boot che contiene il kernel. In genere /boot è una sotto-cartella di / (root) ma non è necessariamente così.
Questo potrebbe essere vero per esempio per chi ha eseguito un’installazione automatica di Ubuntu, in quanto si troverebbe tutto su un’unica partizione, per esempio sda1 e indicherebbe root con hd0,1.
In questo caso specifico invece io ho suddiviso il sistema in più partizioni e ho /boot su sda2 e / (root) su sda3. La variabile root quindi farà riferimento alla partizione sda2, ossia la seconda partizione che contiene /boot.
Questa variabile comunque può essere omessa se si specifica l’UUID (Universally Unique Identifier) della partizione. La riga commentata, infatti, potrebbe prendere il posto della seconda e specificare come UUID, ovviamente, quello di sda2.
Per avere la lista completa degli UUID delle partizioni possiamo lanciare il comando:

# ls -l /dev/disk/by-uuid/

Per vedere invece su quale partizioni sono montate le cartelle del sistema usiamo il comando:

# df -h

mentre se ci interessa sapere solo l’UUID di una partizione specifica possiamo dare il comando:

# sudo blkid /dev/sdxy

dove x identifica la lettera dell’sd (scsi disk) a partire da ‘a’ e y per il numero della partizione, che invece inizierà da 1, diversamente dal vecchio grub. Quindi nel grub 2 “hd0,2” sta per la seconda partizione del primo hard disk.

Per quanto riguarda Windows, se questo è già installato prima che venga aggiunto Ubuntu, non dovrebbe essere necessario aggiungerlo manualmente perchè è lo script 30_os_prober a rintracciarlo e ad aggiungerlo al grub.
Nel caso dovesse essere necessario aggiungerlo manualmente nel file 40_custom, useremo questa forma:

menuentry "Windows 7 (on /dev/sda1)" {
insmod ntfs
set root='(/dev/sda,1)'
# oppure
# search --no-floppy --fs-uuid --set 7078b941-9429-4906-9a92-61a25c2e55f5
chainloader +1
}

In questo caso abbiamo nella prima riga il nome dell’SO, nella seconda il tipo di file system, nella terza la partizione in cui risiede il bootloader (il bootloader si trova nella prima partizione del primo hard disk, equivale a scrivere:

root=(hd0,1)

La riga commentata con L’UUID, anche qui, potrebbe prendere il posto della terza.
L’ultima riga “chainloader +1” indica al grub di caricare il primo settore di boot della partizione invece del primo settore di boot che ha in memoria.

IMPORTANTE!
Ricordiamoci che dopo ogni modifica che riguarda uno qualsiasi dei files di grub va dato il comando:

# sudo update-grub

che rigenera il file grub.cfg aggiungendo le nuove impostazioni.

L’altro file che utilizza grub.cfg quando viene aggiornato è, come abbiamo visto nelle avvertenze dello stesso grub.cfg, il file /etc/default/grub.
Aprendolo:

# sudo gedit /etc/default/grub

appare evidente che ha dei valori personalizzabili.
La prima variabile, “GRUB_DEFAUL=0”, indica al grub di selezionare il sistema in posizione 0 come valore di default, ossia all’avvio del sistema varrà evidenziato il sistema operativo presente nella prima riga del menù di grub. Possiamo cambiare il sistema di default con quello che ci interessa contando le righe a partire da zero. Quindi se il sistema che vogliamo avviare di default si trova al terzo posto nel menù metteremo come valore “GRUB_DEFAUL=2”.
La seconda variabile, “GRUB_HIDDEN_TIMEOUT=0”, ci permette di scegliere se rendere visibile il menù all’avvio o se nasconderlo. Per visualizzarlo basta semplicemente commentare la riga facendola precedere da un cancelletto “#”.
La terza variabile, “GRUB_HIDDEN_TIMEOUT_QUIET=true”, indica se visualizzare (false) o meno (true) il contdown.
La quarta, “GRUB_TIMEOUT=10”, imposta il timeout, ossia il tempo di scelta del sistema a disposizione prima dell’avvio, in questo caso 10 secondi.

Per una guida dettagliata del grub2 possiamo consultare il sito ufficiale:
http://www.gnu.org/software/grub
oppure il wiki:
https://help.ubuntu.com/community/Grub2



PROBLEMI AL RIAVVIO

Nel caso si verificassero degli errori che impediscano al sistema di avviarsi, magari perchè non è rilevata l’mmagine del kernel nella partizione indicata nel grub, si possono impartire dei comandi al grub facendosi dire da lui stesso dove risiede l’immagine cercata. Dalla schermata principale di grub2 digitiamo “c”. Quindi diamo il comando:

NOTA:
I caratteri speciali, ()-/\ …, prima dell’avvio del sistema operativo, potrebbero non corrispondere a quelli sulla tastiera. Occorre fare un po’ di prove, usando anche “Alt Gr” per trovare i tasti giusti

# ls /boot

che ci mostrerà i files presenti in /boot, poi

# search -f /vmlinuz

che ci mostrerà dove risiedono, ad esempio:

grub> search -f /vmlinuz
hd0,2

Ora che sappiamo su quale partizione risiede l’immagine del kernel diamo:

# set root=(hd0,2)
* # linux /vmlinuz root=/dev/sda2 ro
* # initrd /initrd.img
# boot

Nel caso abbiamo la partizione di /boot separata da / (root) sostituiamo i comandi con l’asterisco con questi:

# linux /boot/vmlinuz root=/dev/sda2 ro
# initrd /boot/initrd.img

Il comando boot farà avviare il sistema.

Annunci