====== GRUB come boot loader ======
===== Installazione di GRUB =====
**ATTENZIONE**: Queste istruzioni valgono per **GRUB versione inferiore a 2**, ad esempio grub 0.97 in Debian 4 Etch, fino a Debian 5 Lenny. A partire da Debian 6 Squeeze il pacchetto fittizio grub 0.97-64 effettua il passaggio a GRUB 2 (pacchetto **grub-pc 1.99**).
Una delle principali **differenze** nel passaggio da GRUB a GRUB 2 è la **numerazione delle partizioni**, che è passata da **base 0** a **base 1**.
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).
==== GRUB con RAID mirror ====
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
===== Installazione di un kernel Debian =====
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//).
===== Problemi =====
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 [[http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=463123|463123]].
Per cambiare dimensione si deve ricreare il filesystem con **mkfs.ext3 -I 128**. Le impostazoini di default vengono prese da **''/etc/mke2fs.conf''**.
===== Domanda =====
Installo Grub da ''/dev/hda1'', poi parto da ''/dev/hda7'' e voglio reinstallare Grub, come faccio ad installare quello di ''/dev/hda1''?
====== GRUB2 ======
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. |
**ATTENZIONE**! Non fare confusione tra l'UUID del block device (utilizzato nei contesti di cui sopra) e l'**UUID dei volumi RAID**. Questi ultimi si visualizzano con il comando:
mdadm --detail /dev/md0
oppure eseguendo **''/usr/share/mdadm/mkconf''**. L'UUID dei volumi RAID sono usati solo nel contesto di assemblaggio dei volumi stessi, quindi nel file **''/etc/mdadm/mdadm.conf''**.
===== fdisk e modo DOS-compatibile =====
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 **[[http://www.pixelbeat.org/docs/disk/|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.
===== Partizione bios_grub e dischi > 2 Tb =====
Si tratta di una **[[wp>BIOS Boot partition]]**, che deve essere contenuta in una **[[wp>GUID Partition Table]]**. Quindi non si può applicare a dischi che usano la tradizionale tabella **[[wp>Master boot record|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.
===== parted =====
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.
Lanciare **''parted /dev/sda''** e dare i comandi:
mklabel gpt
mkpart primary 1.0MB 10.0MB
mkpart primary 10.0MB 60.0GB
mkpart primary 60.0GB 80.0GB
mkpart primary 80.0GB 200.0GB
mkpart primary 200.0GB 100%
name 2 rootfs
name 3 swap
name 4 var
name 5 home
set 2 raid on
set 3 raid on
set 4 raid on
set 5 raid on
set 1 bios_grub on
Se si vuole utilizzare unità di misura più precise, ad esempio il byte, dare il comando **''unit B''**.
Il risultato visibile con **''print''** è il seguente:
Number Start End Size File system Name Flags
1 1049kB 10.5MB 9437kB primary bios_grub
2 10.5MB 60.0GB 60.0GB rootfs raid
3 60.0GB 80.0GB 20.0GB swap raid
4 80.0GB 200GB 120GB var raid
5 200GB 2000GB 1800GB home raid
Uscire con **''quit''**, non importa salvare che le modifiche vengono salvate volta volta.
Attenzione al messaggio di errore **Warning: The resulting partition is not properly aligned for best performance**, per la prima partizione dovrebbe bastare allineare l'inizio non a zero, ma ad esempio ad 1 Mb. Si può usare anche un numero negativo per esprimere l'offset dalla fine del disco:
mkpart primary ext4 1 -1
===== Logical and physical sector size =====
Vedere questo articolo sul problema dei settori da 4k: [[http://lwn.net/Articles/377895/|4K-sector drives and Linux]].
===== Installare GRUB2 =====
**ATTENZIONE!** In generale bisogna usare il comando **''grub-install''** seguito dal nome del disco su cui si vuole installare il GRUB. Il comando dovrebbe utilizzare al meglio il settore MBR, l'eventuale partizione //bios_grub// di un disco partizionato con GPT, ecc.
Importante è provvedere un file **''/boot/grub/device.map''** corretto, dove il disco **''hd0''** è quello da cui si vuole fare bootstrap. Se si è fatta l'installazione con **''debootstrap''** o con un **''dump''**/**''restore''** è opportuno fare un **''chroot''** ed aggiustare il file opportunamente, ad esempio:
(hd0) /dev/disk/by-id/ata-WDC_WD10EALX-759BA1_WD-WCATR8225207
(hd1) /dev/disk/by-id/scsi-20010b9fc110c272e
(hd2) /dev/disk/by-id/scsi-20010b9fc110cb832
Il comando ''grub-install'' genera ex-novo vari file, tra cui **''boot.img''** e **''core.img''**, quest'ultimo soprattutto è importante perché contiene il riferimento al root device. Per ispezionare il contenuto di GRUB installato sui vari dischi è ottimo lo script **[[http://sourceforge.net/projects/bootinfoscript/|bootinfoscript]]**.
Ricordarsi sempre di **''eseguire update-grub''** e **''update-initramfs -u -k all''**.
===== Installare GRUB2 su disco non di boot =====
**ATTENZIONE!** ''grub-setup'' come viene usato in questo paragrafo non aggiorna il file **''core.img''** e quindi non aggiorna il root device usato in fase di boot. Usare lo script **''bootinfoscript''** per verificare che l'installazione sia corretta.
:!: 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
===== Installare GRUB2 sul secondo disco di un RAID1 =====
**Attenzione!** Dovrebbe bastare fornire un file ''device.map'' corretto ed eseguire **''grub-install /dev/sdb''**. Verificare sempre con **''bootinfoscript''** che GRUB sia installato correttamente sui due dischi e che il root device sia lo stesso che si identifica con ''/usr/share/mdadm/mkconf''.
:!: 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
È possibile indicare il root device anche usando l'UUID raid, non si sa bene che vantaggio ci sia, ma viene accettato:
grub-setup --root-device='(mduuid/88664fd86258ca80ceb66df7290a9ad9)' /dev/sda
===== Bug con GRUB2 sul secondo disco di un RAID1 =====
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 **[[http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=611537|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 **[[http://bootinfoscript.sourceforge.net/|Boot Info Script]]** che dovrebbe mostrare come è configurato il bootstrap sul disco.
===== Chainload altro S.O. =====
Come si aggiunge una entry nel menu per fare il boot di un s.o. alternativo?
===== Video mode =====
Come impostare il modo video per GRUB e per il kernel che viene avviato: vedere la pagina **[[..:sa:console]]**.
===== Bootstrap dal prompt grub> =====
Vedere questo tutorial: [[http://tuxers.com/main/instigating-a-manual-boot-from-the-grub-prompt/|Instigating a Manual Boot from the GRUB Prompt]].
La sequenza minimale per avviare dal prompt **''grub>''** è la seguente:
ls
set root=(md/4)
linux /vmlinuz ro root=/dev/md4
initrd /initrd.img
boot
Con il primo comando si elencano i filesystem riconosciuti dai quali è possibile leggere l'immagine del kernel e dell'initrd. La riga di comando per caricare il kernel deve indicare il root filesystem, si può utilizzare il nome del device oppure l'UUID con **''root=UUID=''**. L'UUID di un filesystem si può vedere in **''/dev/disk/by-uuid/''** oppure con il comando **''dumpe2fs''**.
===== Installare GRUB in un'altra partizione =====
Questa la sequenza tipica di boot con GRUB (verificare con lo script **bootinfoscript**):
- **MBR** di /dev/sda -> carica ''core.img'' dal settore 1 di ''/dev/sda''
- **core.img** -> cerca un filesystem, ad esempio tramite //MD UUID//
- Filesystem **''/boot/grub/''** -> esegue il menut ''grub.cfg''
Se si vuole abilitare il GRUB che sta su in filesystem diverso (es. ''/dev/md4'') da quello di boot (es. ''/dev/md0''):
mount /dev/md4 /mnt
grub-install --boot-directory=/mnt/boot /dev/sda
===== GRUB su sistema EFI =====
I PC a partire dall'anno 2010 dovrebbero supportare nel BIOS il bootstrap secondo lo standard **[[wpit>UEFI]]** che si contrappone al vecchio sistema dell'MBR che viene quindi chiamato generalmente **legacy**. Nella configurazione legacy il codice di GRUB si installa, oltre che nel settore MBR, anche in una partizione dedicata identificata dal flag **bios_grub**. In una installazione EFI invece è necessario creare sul disco una partizione FAT32 generalmente identificata dai flag **boot** ed **esp**.
Il boot legacy oppure EFI viene generalmente impostato nel programma di setup del BIOS, una volta effettuato il bootstrap in GNU/Linux è possibile sapere se il sistema è EFI verificando l'esistenza della pseudo directory **/sys/firmware/efi/**. Il programma **grub-install** è in grado di determinare l'impostazione del sistema e installare GRUB nello spazio opportuno.
===== GRUB su sistema EFI dual boot =====
Vedere questa [[https://wiki.debian.org/GrubEFIReinstall|guida]].
Scenario: installazione Debian Wheezy su disco con Windows 7, che si avvia in modalità EFI.
Fortunatamente Windows 7 consente il ridimensionamento della partizione direttamente dal disk manager nativo. Dopo aver effettuato l'installazione Debian da CD o chiavetta USB si scopre che il boot manager (EFI) è rimasto inalterato e si avvia solo Windows 7.
Occorre riavviare da chiavetta USB, modalità rescue, e fare l'installazione di Grub sulla partizione EFI. Bisogna guadagnare una shell chroot nell'ambiente target (montando ''/dev'', ''/dev/pts'', ''/proc'' e ''/sys'', ecc.)
Se la partizione EFI è ''/dev/sda'' si fa qualcosa del genere:
mount /dev/sda1 /boot/efi
apt-get install --reinstall grub-efi
grub-install /dev/sda
Nel caso in cui si esegua nuovamente **''grub-install''**, ricordarsi sempre di montare prima la partizione EFI in ''/boot/efi'', altrimenti la voce Windows 7 nel menu di Grub viene persa.
===== Boot interattivo dal prompt grub> =====
Se se interrompe il bootstrap oppure l'host non riesce a completare il normale boot, è possibile avviare manualmente un boostrap alternativo dal prompt **%%grub>%%** (ammesso che esista un kernel e una initrd valida). Ecco un esempio che utilizza il kernel dalla partizione RAID **/dev/md4**.
grub> ls (md/4)/boot
initrd.img-6.1.0-25-amd64 vmlinuz-6.1.0-25-amd64 ...
grub> set prefix=(md/4)/boot/grub
grub> set root=(md/4)
grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/md4
grub> initrd /boot/initrd.img-3.13.0-29-generic
grub> boot
La sintassi **%%(md/4)%%** viene utilizzata per indicare le partizioni RAID. La sintassi per indicare la partizioni normali di un disco SATA è invece del tipo **%%(hd0,1)%%**, dove i dischi fissi sono numerati a partire da **zero** e le partizioni a partire da **1**.
===== GRUB_DEFAULT Selezione kernel predefinito =====
Le nuove installazioni di GRUB2 hanno il menu di avvio organizzato in **menuentry** e **submenu**. Per selezionare come predefinita una delle opzioni, si edita **''/etc/default/grub''**.
L'indice di ogni voce inizia da zero, quindi se il sumbenu appare in posizione 2 e si vuole selezionare la quarta menuentry di tale submemu, si deve mettere:
GRUB_DEFAULT="1>3"
quindi eseguire **update-grub**.