GRUB
GRUB (GRand Unified Bootloader, versione 2) è il bootloader usato dalla maggior parte delle distribuzioni Linux. Dopo il firmware (BIOS/UEFI) è il primo programma a girare: mostra il menu di avvio, carica kernel e initramfs e li avvia. Permette anche il dual boot con Windows o altre distribuzioni.
Nomi dei comandi nelle varie distribuzioni
| Operazione | Arch / EndeavourOS / Debian / Ubuntu | Fedora / RHEL / openSUSE |
|---|---|---|
| Installare | grub-install | grub2-install |
| Generare la configurazione | grub-mkconfig | grub2-mkconfig |
| Scorciatoia | update-grub (Debian/Ubuntu) | |
| Scelta predefinita | grub-set-default | grub2-set-default |
| Avvio unico | grub-reboot | grub2-reboot |
| Variabili salvate | grub-editenv | grub2-editenv |
| File di configurazione generato | /boot/grub/grub.cfg | /boot/grub2/grub.cfg |
In questa guida si usano i nomi grub-*. Su Fedora e derivate sostituisci con grub2-*.
Come funziona la configurazione
Non si modifica mai direttamente /boot/grub/grub.cfg: viene rigenerato da:
/etc/default/grub: le impostazioni generali/etc/grub.d/: gli script che costruiscono le voci del menu (10_linux,30_os-prober,40_custom)
Il flusso è sempre lo stesso:
- modifichi
/etc/default/grubo gli script in/etc/grub.d/ - rigeneri la configurazione
- riavvii
Rigenerare la configurazione
sudo grub-mkconfig -o /boot/grub/grub.cfg
Su Debian e Ubuntu:
sudo update-grub
Su Fedora:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Il comando stampa le voci trovate (kernel, initramfs, altri sistemi operativi). Verifica che l'elenco sia quello atteso prima di riavviare.
Per vedere l'output senza scriverlo:
sudo grub-mkconfig
Per elencare le voci del menu attualmente generate:
grep -E "^\s*menuentry" /boot/grub/grub.cfg | cut -d "'" -f2
/etc/default/grub
Esempio commentato delle variabili più usate:
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=menu
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=false
GRUB_GFXMODE=1920x1080
GRUB_GFXPAYLOAD_LINUX=keep
| Variabile | Significato |
|---|---|
GRUB_DEFAULT | Voce avviata di default: numero (parte da 0), titolo, percorso "Opzioni avanzate>voce" oppure saved |
GRUB_SAVEDEFAULT | Con GRUB_DEFAULT=saved, se true ricorda l'ultima voce scelta |
GRUB_TIMEOUT | Secondi di attesa prima dell'avvio automatico (-1 attende per sempre, 0 avvia subito) |
GRUB_TIMEOUT_STYLE | menu mostra il menu, hidden lo nasconde (si apre tenendo premuto Shift o Esc), countdown nasconde il menu ma mostra il conto alla rovescia |
GRUB_CMDLINE_LINUX_DEFAULT | Parametri del kernel solo per l'avvio normale |
GRUB_CMDLINE_LINUX | Parametri del kernel per tutte le voci, compresa la modalità di ripristino |
GRUB_DISABLE_OS_PROBER | false abilita il rilevamento di altri sistemi (Windows e altre distribuzioni) |
GRUB_DISABLE_RECOVERY | true elimina le voci di ripristino |
GRUB_GFXMODE | Risoluzione del menu |
GRUB_THEME | Percorso di un tema (/boot/grub/themes/nome/theme.txt) |
GRUB_BACKGROUND | Immagine di sfondo |
GRUB_ENABLE_CRYPTODISK | y se /boot si trova su un disco cifrato |
GRUB_DISABLE_SUBMENU | y mostra tutti i kernel nel menu principale senza sottomenu |
Dopo ogni modifica:
sudo grub-mkconfig -o /boot/grub/grub.cfg
Installare GRUB
UEFI
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
sudo grub-mkconfig -o /boot/grub/grub.cfg
--efi-directory è il punto di mount della partizione EFI (ESP, in FAT32): di solito /boot/efi oppure /efi o /boot. Per controllarlo:
findmnt | grep -i efi
lsblk -f
Per usare il percorso di fallback (utile con firmware problematici o chiavette USB avviabili):
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable
BIOS (Legacy) con MBR o GPT
sudo grub-install --target=i386-pc /dev/sda
sudo grub-mkconfig -o /boot/grub/grub.cfg
Si indica il disco (/dev/sda), non la partizione (/dev/sda1). Con una tabella GPT serve una piccola partizione "BIOS boot" (1 MiB, tipo ef02).
Verificare se il sistema è UEFI o BIOS
ls /sys/firmware/efi
Se la cartella esiste, il sistema è avviato in UEFI.
Pacchetti
Su Arch e EndeavourOS:
sudo pacman -S grub efibootmgr os-prober
Su Debian e Ubuntu:
sudo apt install grub-efi-amd64 os-prober
Dual boot e altri sistemi operativi
GRUB rileva Windows e altre distribuzioni tramite os-prober.
- Installa
os-prober(vedi sopra) - In
/etc/default/grubimposta:
GRUB_DISABLE_OS_PROBER=false
- Monta la partizione EFI o le partizioni degli altri sistemi se non lo sono già
- Rigenera:
sudo os-prober
sudo grub-mkconfig -o /boot/grub/grub.cfg
Nel risultato di grub-mkconfig deve comparire una riga tipo Found Windows Boot Manager on /dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi.
Se Windows non viene trovato:
- controlla che la partizione EFI di Windows sia visibile con
lsblk -f - se Windows è su un disco diverso, assicurati che il disco sia presente e non cifrato con BitLocker
- esegui
sudo os-probere leggi eventuali errori
Se dopo il dual boot l'ora è sbagliata in uno dei due sistemi, Windows usa l'ora locale e Linux l'UTC. Soluzione lato Linux:
timedatectl set-local-rtc 1 --adjust-system-clock
Scegliere la voce di default
Con un numero o un titolo
GRUB_DEFAULT=2
GRUB_DEFAULT="Advanced options for Arch Linux>Arch Linux, with Linux linux-lts"
I numeri partono da 0 e i sottomenu si indicano come 1>2.
Ricordare l'ultima scelta
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
Poi rigenera. È comodo con il dual boot: parte l'ultimo sistema usato.
Cambiare la voce da riga di comando
Con GRUB_DEFAULT=saved:
sudo grub-set-default 2
sudo grub-set-default "Windows Boot Manager"
sudo grub-editenv list
Avviare una voce una sola volta
sudo grub-reboot 2
sudo reboot
Al riavvio successivo ripartirà la voce di default. Anche questo richiede GRUB_DEFAULT=saved.
Un caso pratico: riavviare in Windows una volta sola.
sudo grub-reboot "Windows Boot Manager"
sudo reboot
Per vedere i titoli esatti:
grep -E "^\s*menuentry" /boot/grub/grub.cfg | cut -d "'" -f2
Parametri del kernel
Si aggiungono in GRUB_CMDLINE_LINUX_DEFAULT (avvio normale) o GRUB_CMDLINE_LINUX (tutte le voci).
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"
| Parametro | Effetto |
|---|---|
quiet | Riduce i messaggi all'avvio |
splash | Mostra la schermata grafica di avvio (Plymouth) |
nomodeset | Disabilita il modesetting del kernel: utile con driver video problematici |
loglevel=7 | Aumenta la verbosità per la diagnosi |
systemd.unit=rescue.target | Avvia in modalità di ripristino |
systemd.unit=multi-user.target | Avvia senza interfaccia grafica |
init=/bin/bash | Avvia direttamente una shell di root (per reimpostare la password) |
ro / rw | Monta la root in sola lettura / lettura e scrittura |
mitigations=off | Disattiva le mitigazioni delle vulnerabilità della CPU (riduce la sicurezza) |
resume=UUID=... | Partizione swap per l'ibernazione |
net.ifnames=0 | Usa i nomi di interfaccia classici (eth0) |
Per vedere i parametri con cui il sistema è stato avviato:
cat /proc/cmdline
Modificare i parametri una sola volta (a runtime)
Per un test senza modificare i file:
- Nel menu di GRUB seleziona la voce
- Premi
eper modificarla - Sposta il cursore sulla riga che inizia con
linuxe aggiungi o togli i parametri in fondo - Premi
Ctrl+XoF10per avviare - Premi
Escper annullare
La modifica vale solo per quell'avvio.
Voci personalizzate
In /etc/grub.d/40_custom:
menuentry "Arch Linux (kernel LTS)" {
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root 1234abcd-aaaa-bbbb-cccc-1234567890ab
linux /boot/vmlinuz-linux-lts root=UUID=1234abcd-aaaa-bbbb-cccc-1234567890ab rw quiet
initrd /boot/initramfs-linux-lts.img
}
menuentry "Riavvia" {
reboot
}
menuentry "Spegni" {
halt
}
menuentry "Impostazioni firmware UEFI" {
fwsetup
}
Rendi eseguibile lo script (di solito lo è già) e rigenera:
sudo chmod +x /etc/grub.d/40_custom
sudo grub-mkconfig -o /boot/grub/grub.cfg
L'UUID di una partizione si ottiene con:
lsblk -f
blkid
Il prompt di GRUB (riga di comando)
Dal menu premi c per entrare nella shell di GRUB. Qui i dischi si chiamano (hd0,gpt2) (disco 0, partizione GPT 2) o (hd0,msdos1) per MBR.
Comandi principali:
| Comando | Funzione |
|---|---|
ls | Elenca dischi e partizioni |
ls (hd0,gpt2)/ | Elenca i file di una partizione |
set | Mostra le variabili |
set root=(hd0,gpt2) | Imposta la partizione radice di GRUB |
set prefix=(hd0,gpt2)/boot/grub | Dove GRUB cerca moduli e configurazione |
insmod nome | Carica un modulo (normal, linux, part_gpt, ext2) |
search --set=root --file /boot/vmlinuz-linux | Trova la partizione che contiene un file |
search --set=root --fs-uuid UUID | Trova la partizione per UUID |
linux /boot/vmlinuz-linux root=/dev/sda2 rw | Carica il kernel |
initrd /boot/initramfs-linux.img | Carica l'initramfs |
boot | Avvia il sistema |
configfile /boot/grub/grub.cfg | Carica un file di configurazione |
chainloader /EFI/Microsoft/Boot/bootmgfw.efi | Avvia un altro bootloader EFI |
reboot / halt | Riavvia / spegne |
help | Elenco dei comandi |
Avviare Linux a mano
grub> ls
grub> ls (hd0,gpt2)/boot
grub> set root=(hd0,gpt2)
grub> linux /boot/vmlinuz-linux root=/dev/nvme0n1p2 rw
grub> initrd /boot/initramfs-linux.img
grub> boot
Il tasto Tab completa nomi e percorsi.
Avviare Windows a mano (UEFI)
grub> search --file --set=root /EFI/Microsoft/Boot/bootmgfw.efi
grub> chainloader /EFI/Microsoft/Boot/bootmgfw.efi
grub> boot
Il prompt "grub rescue>"
Compare quando GRUB non trova la propria cartella (prefix), ad esempio dopo aver spostato partizioni, ridimensionato dischi o reinstallato Windows. Qui sono disponibili pochissimi comandi.
Soluzione immediata
grub rescue> ls
(hd0) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1)
grub rescue> ls (hd0,gpt2)/boot/grub
grub rescue> set prefix=(hd0,gpt2)/boot/grub
grub rescue> set root=(hd0,gpt2)
grub rescue> insmod normal
grub rescue> normal
Se ls (hd0,gptN)/boot/grub restituisce un elenco di file, quella è la partizione giusta. Prova ogni partizione finché trovi quella corretta. Se /boot è una partizione separata, il percorso è (hd0,gpt1)/grub.
Se normal non funziona, carica prima il kernel:
grub rescue> insmod linux
grub rescue> linux /boot/vmlinuz-linux root=/dev/nvme0n1p2 rw
grub rescue> initrd /boot/initramfs-linux.img
grub rescue> boot
Soluzione definitiva
Una volta avviato Linux, rinstalla GRUB:
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
sudo grub-mkconfig -o /boot/grub/grub.cfg
Riparare GRUB da una chiavetta live
Se il sistema non parte affatto:
- Avvia da una chiavetta live di Linux (EndeavourOS, Arch o simile)
- Individua le partizioni:
lsblk -f
- Monta la root e la partizione EFI (adatta i nomi):
sudo mount /dev/nvme0n1p2 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
Se hai una partizione /boot separata, montala prima della EFI. Con Btrfs e sottovolumi servono le opzioni -o subvol=@.
- Entra nel sistema installato:
sudo arch-chroot /mnt
Su Debian e Ubuntu, senza arch-chroot:
for d in dev proc sys run; do sudo mount --rbind /$d /mnt/$d; done
sudo mount --rbind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
sudo chroot /mnt
- Reinstalla e rigenera:
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg
- Esci, smonta e riavvia:
exit
sudo umount -R /mnt
reboot
Controllare le voci UEFI
efibootmgr
efibootmgr -v
sudo efibootmgr -o 0001,0000
sudo efibootmgr -b 0003 -B
sudo efibootmgr -n 0000
| Opzione | Significato |
|---|---|
-v | Dettagli, con percorsi dei file |
-o | Imposta l'ordine di avvio |
-b N -B | Elimina la voce N |
-n N | Avvia la voce N solo al prossimo riavvio |
Se dopo grub-install la voce "GRUB" non compare nel firmware, riprova con --removable.
Proteggere GRUB con password
Evita che chiunque possa modificare le voci (tasto e) o usare la riga di comando.
Genera l'hash:
grub-mkpasswd-pbkdf2
Aggiungi a /etc/grub.d/40_custom:
set superusers="michele"
password_pbkdf2 michele grub.pbkdf2.sha512.10000.HASH_GENERATO
Rigenera la configurazione. Con questa impostazione anche l'avvio normale richiede la password, a meno che le voci non siano marcate come --unrestricted. Per consentire l'avvio libero e proteggere solo la modifica, in /etc/grub.d/10_linux aggiungi --unrestricted all'elenco delle classi (CLASS="--class gnu-linux --class gnu --class os --unrestricted"): questo file può essere sovrascritto dagli aggiornamenti, quindi a ogni aggiornamento del pacchetto grub va ricontrollato.
La password di GRUB non cifra il disco: con accesso fisico alla macchina è comunque possibile avviare un sistema esterno. Per una protezione reale serve la cifratura del disco.
Snapshot Btrfs nel menu
Su sistemi con Btrfs e snapshot (Snapper o Timeshift), il pacchetto grub-btrfs aggiunge gli snapshot al menu di GRUB.
sudo pacman -S grub-btrfs
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo systemctl enable --now grub-btrfsd
Così si può avviare un sistema precedente se un aggiornamento lo ha rotto.
Backup e sicurezza delle modifiche
Prima di modificare:
sudo cp /etc/default/grub /etc/default/grub.bak
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
Per verificare la sintassi della configurazione generata:
sudo grub-script-check /boot/grub/grub.cfg
Per vedere la versione installata:
grub-install --version
Messaggi di errore comuni
| Errore | Causa probabile e rimedio |
|---|---|
error: no such partition | GRUB non trova la partizione: usa ls e correggi root/prefix |
error: unknown filesystem | Filesystem non riconosciuto o modulo mancante: insmod ext2 / insmod btrfs o reinstalla GRUB |
error: file '/boot/grub/x86_64-efi/normal.mod' not found | Installazione di GRUB incompleta o spostata: reinstalla con grub-install |
error: symbol 'grub_calloc' not found | GRUB installato e moduli di versioni diverse: reinstalla con grub-install dopo l'aggiornamento |
Failed to get canonical path of /cow | Eseguito grub-install o grub-mkconfig dentro la live senza chroot |
EFI variables are not supported on this system | Avviato in modalità BIOS invece di UEFI: riavvia la chiavetta in UEFI |
Windows non appare nel menu | Abilita GRUB_DISABLE_OS_PROBER=false, installa os-prober, rigenera |
Il menu non appare | GRUB_TIMEOUT_STYLE=hidden: usa menu oppure tieni premuto Shift/Esc all'avvio |
Riepilogo dei comandi
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo update-grub
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
sudo grub-install --target=i386-pc /dev/sda
sudo grub-set-default 2
sudo grub-reboot 2
sudo grub-editenv list
sudo efibootmgr -v
sudo os-prober
cat /proc/cmdline
Vedi anche: systemctl, journalctl -b (per analizzare l'avvio), lsblk, nano (per modificare /etc/default/grub).