Grub2 per gestire più sistemi operativi
Grub 2 è ormai diventato il bootloader più comunemente usato nelle distro Linux. Evoluzione del Grub Legacy si può dire che ha rappresentato uno di quei classici casi in cui un miglioramento di prestazioni non è accompagnato dalla semplificazione a favore dell'utente. Teoricamente nelle intenzioni degli autori non dovrebbe essere così. Con un semplice comando da terminale Grub 2 dovrebbe essere in grado di riconoscere i sistemi operativi presenti sul dispositivo e fare tutto da solo. Dovrebbe. In realtà la configurazione automatica non sempre tende a soddisfare l'utente e in effetti molti rimpiangono il buon vecchio file menu.lst che in poche semplici operazioni permetteva di avere una configurazione personalizzata.
A parte l'installazione del Grub 2 qui ci si vuole soffermare sulla procedura per personalizzare la configurazione. Dove per personalizzare si intende soprattutto l'abolizione di tutte quelle voci create in automatico da Grub2 e relative alla presenza delle varie versioni di kerrnel dei sistemi operativi installati. Infatti, seppure lodevole per motivi di gestione e sicurezza, se nel dispositivo sono presenti sistemi operativi multipli, c'è il rischio di un menu strapieno di voci eccessive e soprattutto destinate a moltiplicarsi almeno che non si cancellino per ogni distribuzione i kernel non più in uso.
Come intervenire in questi casi? Per prima cosa bisogna chiarire quali siano e dove si trovano i files di configurazione di Grub 2. Il file principale, quello che si avvia in automatico, è il file grub.cfg che in genere si trova sotto la directory /boot/grub/. In genere, perchè ad esempio nella distribuzione Fedora è sotto /boot/grub2/. Questo file, a meno che non siate veramente esperti, non andrebbe modificato. In realtà questo file genera e si basa per creare il bootloader su altri files contenuti nella directory /etc/grub.d. In questa directory troveremo una serie di files con un numero progressivo nel nome, tipo 10_linux, 30_os_prober ecc. C'è poi un file vuoto che, in caso di personalizzazione, diventa il più importante: 40_custom. E' proprio questo file che va cambiato e riscritto per avere un certo grado di personalizzazione soprattutto se si usano più sistemi operativi, compreso Windows. Anche se va detto che in genere Windows viene riconosciuto facilmente in automatico. Infine c'è un terzo file di configurazione che è quello relativo alle impostazioni generali del bootloader, come ambiente grafico, tempo di attesa ecc. Si tratta del file contenuto in un'altra directory: /etc/default e dal nome grub. Una volta chiarito che un file si genera automaticamente e che gli altri due files sono da supporto per la sua configurazione, vediamo in concreto alcuni semplici passaggi per personalizzare Grub 2. Si dà per scontato che il Grub 2 sia stato installato nel modo adeguato soprattutto in caso d'ambiente UEFI. Intanto conviene lanciare da terminale la configurazione in automatico. Anche qui le cose si sono complicate, perchè alcune distribuzioni come Ubuntu e derivate usano il comando update-grub o update-grub2. In realtà si tratta di un artifizio perchè il comando originale e usato dalle altre distribuzioni è in genere: grub-mkconfig -o /boot/grub/grub.cfg. Però non sempre. Ad esempio per Fedora il comando è: grub2-mkconfig -o /boot/grub2/grub.cfg. Conviene, a scanso d'equivoci, leggere le istruzioni facilmente rintracciabili in rete per la distribuzione usata. Anche perchè in caso di UEFI i comandi sia di installzione che di generazione del bootloader cambiano. Quello che non cambia sono gli altri files di configurazione che si trovano comunque nelle directory citate. Se tutto va nel verso giusto, alla fine della generazione del bootloader avremo bisogno di dare un'occhiata al file grub.cfg creato. Non è di facile comprensione ma quello che ci interessa è vedere le righe con la citazione 'menuentry'. Qui si trovano le specifiche che Grub 2 ha trovato per gestire l'avvio dei vari sistemi operativi installati.
Passando alle cose concrete, per avere una semplificazione e personalizzazione del menu di Grub 2 conviene: A) mantenere inalterata la configurazione della distro Linux da cui parte il vostro Grub 2; B) modificare il file 40_custom in /etc/grub.d e C) forzare Grub 2 ad usare il vostro file 40_custom e non le configurazioni da lui create per gli altri sistemi operativi usati, agendo sul file /etc/default/grub.
Il file 40_custom va modificato scrivendo per ciascun sistema operativo una serie di istruzioni che puntano alla partizione e al kernel d'avvio. Qui si riporta un semplice ma efficace esempio di file 40_custom in cui sono presenti più distribuzioni Linux e altri sistemi operativi come Windows e un FreeBSD.
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
set gfxpayload=1920x1080x24
menuentry 'UBUNTU 16.04' {
insmod part_msdos
insmod ext2
set root=(hd0,13)
linux /vmlinuz root=/dev/sda13 ro quiet splash
initrd /initrd.img
}
menuentry 'ARCHLINUX' {
insmod part_msdos
insmod reiserfs
set root=(hd0,9)
linux /boot/vmlinuz-linux root=UUID=bef8e51d-72f0-4d90-a0bb-af2e0a2f2ea5 rw quiet
initrd /boot/initramfs-linux.img
}
menuentry 'SLACKWARE' {
insmod part_msdos
insmod ext2
set root=(hd1,5)
linux /boot/vmlinuz root=/dev/sdb5
}
menuentry 'WINDOWS 10' {
insmod part_msdos
insmod ntfs
set root=(hd1,1)
chainloader +1
}
menuentry 'FREEBSD' {
insmod ufs2
set root=(hd1,4)
kfreebsd /boot/loader
}
Da notare nel file set gfxpayload=1920x1080x24 che dovrebbe settare la risoluzione con cui il bootloader avvia i vari sistemi operativi. Inoltre se avete come filesystem qualcosa di diverso da ext3 o ext4 come nell'esempio con Archlinux (reiserfs) bisogna specificarlo. La numerazione delle partizioni segue la regola per cui hd0 è un primo disco e hd1 un secondo disco eventualmente presente, mentre il secondo numero è esattamente quello della partizione, cioè la numerazione non parte da 0 ma da 1 per cui la nona partizione del primo disco è hd0,9. Per Windows i comandi sono leggermente diversi con la presenza di chainloader +1 come del resto già nel vecchio Grub. Per sistemi *BSD come FreeBSD bisogna inserire il tipo di filesyem usato e qualla essenziale riga kfreebsd /boot/loader. C'è un piccolo problema che va aggirato. Ammettiamo che la vostra distribuzione Linux non ricrei in automatico un link ad ogni aggiornamento del kernel (in genere vmlinuz e initrd) come in Fedora. C'è il rischio che usando il file 40_custom partirete sempre con il vecchio kernel. La cosa più semplice e ragionevole e creare un link manualmente ogni volta che aggiornate quella distribuzione. E' un pò seccante ma è il sistema più veloce per risolvere il problema.
Fatto questo, apriamo il file /etc/default/grub e modifichiamo alcune righe. Intanto se non vogliamo che il bootloader parta in automatico su un sistema operativo scelto dopo qualche secondo d'attesa, impostiamo il valore GRUB_TIMEOUT=-1, Così facendo saremo noi a scegliere il sistema operativo da far partire. Poi impostiamo GRUB_DISABLE_SUBMENU=true per evitare troppe voci nel bootloader. Ma la cosa più importante da fare è disabilitare il file di configurazione 30_os_prober che Grub2 genera in automatico per costringerlo ad usare il file 40_custom creato da noi. Per fare questo è sufficiente modificare così la riga: GRUB_DISABLE_OS_PROBER=true ma solo se os-prober è installato (ArchLinux non lo installa di default ad esempio). Anzi, qualora lo fosse, conviene disinstallarlo per avere maggiore sicurezza all'atto dell'aggiornamento del Grub.
Infine, se vogliamo aggiungere un tema grafico conviene prima scaricare alcuni temi alternativi della distribuzione Linux con cui abbiamo installato Grub2 e che in genere vanno a finire nella directory /boot/grub/themes/<nome tema>. Poi inseriamo nel file la riga GRUB_THEME="/boot/grub/themes/<nome tema>/theme.txt".
A questo punto rilanceremo Grub2 con il comando da terminale e dovremmo avere a questo punto un bootloader più aderente alle nostre necessità, compreso l'ambiente grafico.