Teoricamente il comando grub-install dovrebbe provvedere a fare l'autodetect di tutto e installare opportunamente GRUB sul disco fisso. Una installazione manuale dalla shell di GRUB potrebbe invece essere questa:
# grub --no-floppy --device-map=/dev/null grub> device (hd0) /dev/hda grub> root (hd0,0) grub> setup (hd0) grub> quit
La prima riga è interessante: mappa il nome (hd0) utilizzato da GRUB, sul device /dev/hda conosciuto al kernel Linux. Volendo installare GRUB su un disco che non sia il primario master, basta sostituire /dev/hda con il nome del disco desiderato, gli altri comandi restano invariati.
Il menu di boot viene controllato dal file /boot/grub/menu.lst, non è necessario reinstallare GRUB se si modifica questo file (a differenza di /etc/lilo.conf con LILO).
Se la partizione di root è su un device RAID software, conviene installare GRUB sull'MBR di entrambi i dischi, così che se si rompe il disco primario, sul secondario c'è tutto il necessario per fare boot. Supponiamo che /dev/md0 sia composto da /dev/hda1 e /dev/hdc1, bisogna eseguire:
# grub --no-floppy --device-map=/dev/null grub> device (hd0) /dev/hda grub> root (hd0,0) grub> setup (hd0) grub> quit
# grub --no-floppy --device-map=/dev/null grub> device (hd0) /dev/hdc grub> root (hd0,0) grub> setup (hd0) grub> quit
Installando un pacchetto kernel-image generato con make-kpkg di Debian, il file di configurazione di Grub /boot/grub/menu.lst viene riscritto da update-grub. Tutta la sezione AUTOMAGIC KERNELS LIST con l'elenco delle istanze di boot viene riscritta, se non esiste viene aggiunta.
Per governare il modo in cui viene riscritto il file si possono aggiungere al file stesso alcune direttive. Queste direttive assumono la forma di commento (iniziano con #) e sono comprese nella sezione AUTOMAGIC KERNELS LIST. Tra le più interessanti ci sono
# kopt=root=/dev/md0 ro # alternative=false
La prima consente di passare delle opzioni al kernel per tutte le istanze di boot generate da update-grub, la seconda evita che vengano create delle istanze di boot alternative (ad esempio la noiosa recovery mode).
Se durante l'installazione di GRUB capita il messaggio d'errore
The file /boot/grub/stage1 not read correctly
potrebbe trattarsi della dimensione degli inode nel filesystem ext2 o ext3, verificare la dimensione con tune2fs -l /dev/sda1. Vecchie versioni di GRUB, ad esempio la 0.97, richiedono una dimensione di 128 byte. Il problema dovrebbe essere risolto in GRUB2,
vedere il bug 463123.
Per cambiare dimensione si deve ricreare il filesystem con mkfs.ext3 -I 128. Le impostazoini di default vengono prese da /etc/mke2fs.conf.
Installo Grub da /dev/hda1, poi parto da /dev/hda7 e voglio reinstallare Grub, come faccio ad installare quello di /dev/hda1?
Si tratta della nuova versione più pulita, più sicura, più robusta, ecc. Però i cambiamenti sono molti.
Anzitutto la numerazione delle partizioni inizia da uno e non più da zero. Quindi la prima partizione sul primo disco fisso è (hd0,1).
Installare il pacchetto grub-pc (esiste un pacchetto fittizio di nome grub2 che lo installa come dipendenza).
Lo script grub-install dovrebbe provvedere ad installare GRUB nel boot sector del disco richiesto e a preparare tutti i file necessari nella directory /boot/ del root filesystem. ad esempio:
grub-install --recheck /dev/sda
L'opzione --recheck forza l'identificazione dei dischi presenti, anche se un file /boot/grub/device.map esiste già. Conviene ad ogni modo verificarne il contenuto per accertarsi che l'autodetect abbia funzionato a dovere.
Il file di configurazione /boot/grub/menu.lst non viene più usato, si usa /boot/grub/grub.cfg. In Debian esiste sempre lo script update-grub che provvede a riscriverlo.
Attenzione alla clonazione: l'impostazione predefinita prevede di identificare il root filesystem dal suo UUID, che in un sistema clonato è probabilmente diverso. Modificare eventualmente /etc/default/grub per usare il nome del dispositivo (tipo /dev/sda1) invece dell'UUID.
Per vedere gli UUID dei dischi usare blkid oppure:
ls -l /dev/disk/by-uuid
Quindi i file di configurazione sono:
| /boot/grub/grub.cfg | Menu di bootstrap. |
|---|---|
| /etc/default/grub | Usato da update-grub. |
| /etc/grub.d/ | Snippet usati da update-grub per generare il menu. |
Le versioni moderne dei programmi di partizionamento sconsigliano l'utilizzo del metodo DOS-compatible. Ad esempio il tradizionale fdisk avverte subito all'avvio:
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Questo metodo spreca un po' di spazio disco per allineare le partizioni all'esatto limite del cilindro. Tuttavia GRUB ha bisogno di questo spazio sprecato per alloggiare il proprio stage 1.5, vedere in proposito Details of GRUB on the PC.
Se si disabilita il modo DOS-compatible è probabile che al momento dell'installazione di GRUB si riceva l'errore:
grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding won't be possible!
grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists.
However, blocklists are UNRELIABLE and its use is discouraged.
Una moderna alternativa dovrebbe essere quella di utilizzare una piccola partizione di tipo bios_grub, vedere il paragrafo successivo.
Si tratta di una BIOS Boot partition, che deve essere contenuta in una GUID Partition Table. Quindi non si può applicare a dischi che usano la tradizionale tabella MBR con partizioni primare, estese e unità logiche.
Con dischi di capacità 2 Tb o superiore conviene usare la GPT (le partizioni MBR hanno questo limite), in questo caso la partizione bios_grub diventa una scelta obbligata per installare GRUB.
I programmi fdisk e cfdisk non supportano i dischi configurati con la GPT, si può usare parted invece.
In generale conviene usare il più moderno parted come programma di partizione, sicuramente va usato per i dischi oltre i 2 Tb, quando diventa praticamente obbligatorio partizionare con il sistema GPT.
Ecco un esmpio di come creare delle partizioni una delle quali per il GRUB, assegnare dei nomi, assegnare il flag di volume RAID, ecc. Notare che parted aggiusta la posizione di inizio e la dimensione della partizione in modo da non creare conflitti.
mkpart primary 0 10.0MB mkpart primary 10.0MB 20.0GB mkpart primary 20.0GB 21.0GB mkpart primary 20.9GB 60GB mkpart primary 59.9GB 2001GB name 2 rootfs name 3 swap name 4 lvm name 5 storage set 2 raid on set 3 raid on set 4 raid on set 5 raid on set 1 bios_grub on
Il risultato è il seguente:
Number Start End Size File system Name Flags 1 17.4kB 10.0MB 10.0MB bios_grub 2 10.0MB 20.0GB 20.0GB rootfs raid 3 20.0GB 21.0GB 1000MB swap raid 4 21.0GB 60.0GB 39.0GB lvm raid 5 60.0GB 2000GB 1940GB storage raid
Vedere questo articolo sul problema dei settori da 4k: 4K-sector drives and Linux.
Il manuale recita: You should not normally run grub-setup directly. Use grub-install instead. Quindi questa va considerata una operazione manuale a basso livello.
Come installare GRUB2 su un disco collegato come secondario (/dev/sdb), dopo averlo installato ad esempio con debootstrap.
Il rootfs del nuovo disco si trova nella prima partizione ed è stato montato su /mnt:
grub-setup --device-map=/tmp/device.map --directory=/mnt/boot/grub --root-device='(hd0,1)' '(hd0)'
Il file /tmp/device.map è stato creato appositamente e contiene la riga
(hd0) /dev/sdb
Il manuale recita: You should not normally run grub-setup directly. Use grub-install instead. Quindi questa va considerata una operazione manuale a basso livello.
Dopo aver installato GRUB2 sul primo disco (/dev/sda) lo si deve installare anche nel MBR del secondo disco (/dev/sdb), in modo che sia un disco avviabile nel caso di guasto del primo.
Il rootfs si trova nella prima partizione:
grub-setup --device-map=/boot/grub/device.map --directory=/boot/grub --root-device='(hd0,1)' '(hd1)'
Il file /boot/grub/device.map contiene:
(hd0) /dev/sda (hd1) /dev/sdb
Nonostante che si sia installato GRUB su /dev/sda e /dev/sdb come descritto nel paragrafo precedente, il secondo disco (/dev/sdb) risulta non avviabile. Potrebbe essere il bug #611537.
In pratica tentando di avviare da /dev/sdb si ha un loop infinito con reboot dopo il messaggio GRUB loading.. Pare che la soluzione sia abilitare in /etc/default/grub:
GRUB_TERMINAL=console
e quindi eseguire update-grub. La ragione di questo fix è da capire!
Interessante questo Boot Info Script che dovrebbe mostrare come è configurato il bootstrap sul disco.
Come si aggiunge una entry nel menu per fare il boot di un s.o. alternativo?
Come impostare il modo video per GRUB e per il kernel che viene avviato: vedere la pagina Console: video mode e keymap.