Wiki di Michele

GRUB

GuidaUltima modifica: 24/10/2026 Verificata il 24/10/2026

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

OperazioneArch / EndeavourOS / Debian / UbuntuFedora / RHEL / openSUSE
Installaregrub-installgrub2-install
Generare la configurazionegrub-mkconfiggrub2-mkconfig
Scorciatoiaupdate-grub (Debian/Ubuntu)
Scelta predefinitagrub-set-defaultgrub2-set-default
Avvio unicogrub-rebootgrub2-reboot
Variabili salvategrub-editenvgrub2-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:

Il flusso è sempre lo stesso:

  1. modifichi /etc/default/grub o gli script in /etc/grub.d/
  2. rigeneri la configurazione
  3. 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
VariabileSignificato
GRUB_DEFAULTVoce avviata di default: numero (parte da 0), titolo, percorso "Opzioni avanzate>voce" oppure saved
GRUB_SAVEDEFAULTCon GRUB_DEFAULT=saved, se true ricorda l'ultima voce scelta
GRUB_TIMEOUTSecondi di attesa prima dell'avvio automatico (-1 attende per sempre, 0 avvia subito)
GRUB_TIMEOUT_STYLEmenu 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_DEFAULTParametri del kernel solo per l'avvio normale
GRUB_CMDLINE_LINUXParametri del kernel per tutte le voci, compresa la modalità di ripristino
GRUB_DISABLE_OS_PROBERfalse abilita il rilevamento di altri sistemi (Windows e altre distribuzioni)
GRUB_DISABLE_RECOVERYtrue elimina le voci di ripristino
GRUB_GFXMODERisoluzione del menu
GRUB_THEMEPercorso di un tema (/boot/grub/themes/nome/theme.txt)
GRUB_BACKGROUNDImmagine di sfondo
GRUB_ENABLE_CRYPTODISKy se /boot si trova su un disco cifrato
GRUB_DISABLE_SUBMENUy 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.

  1. Installa os-prober (vedi sopra)
  2. In /etc/default/grub imposta:
GRUB_DISABLE_OS_PROBER=false
  1. Monta la partizione EFI o le partizioni degli altri sistemi se non lo sono già
  2. 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:

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"
ParametroEffetto
quietRiduce i messaggi all'avvio
splashMostra la schermata grafica di avvio (Plymouth)
nomodesetDisabilita il modesetting del kernel: utile con driver video problematici
loglevel=7Aumenta la verbosità per la diagnosi
systemd.unit=rescue.targetAvvia in modalità di ripristino
systemd.unit=multi-user.targetAvvia senza interfaccia grafica
init=/bin/bashAvvia direttamente una shell di root (per reimpostare la password)
ro / rwMonta la root in sola lettura / lettura e scrittura
mitigations=offDisattiva le mitigazioni delle vulnerabilità della CPU (riduce la sicurezza)
resume=UUID=...Partizione swap per l'ibernazione
net.ifnames=0Usa 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:

  1. Nel menu di GRUB seleziona la voce
  2. Premi e per modificarla
  3. Sposta il cursore sulla riga che inizia con linux e aggiungi o togli i parametri in fondo
  4. Premi Ctrl+X o F10 per avviare
  5. Premi Esc per 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:

ComandoFunzione
lsElenca dischi e partizioni
ls (hd0,gpt2)/Elenca i file di una partizione
setMostra le variabili
set root=(hd0,gpt2)Imposta la partizione radice di GRUB
set prefix=(hd0,gpt2)/boot/grubDove GRUB cerca moduli e configurazione
insmod nomeCarica un modulo (normal, linux, part_gpt, ext2)
search --set=root --file /boot/vmlinuz-linuxTrova la partizione che contiene un file
search --set=root --fs-uuid UUIDTrova la partizione per UUID
linux /boot/vmlinuz-linux root=/dev/sda2 rwCarica il kernel
initrd /boot/initramfs-linux.imgCarica l'initramfs
bootAvvia il sistema
configfile /boot/grub/grub.cfgCarica un file di configurazione
chainloader /EFI/Microsoft/Boot/bootmgfw.efiAvvia un altro bootloader EFI
reboot / haltRiavvia / spegne
helpElenco 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:

  1. Avvia da una chiavetta live di Linux (EndeavourOS, Arch o simile)
  2. Individua le partizioni:
lsblk -f
  1. 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=@.

  1. 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
  1. Reinstalla e rigenera:
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg
  1. 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
OpzioneSignificato
-vDettagli, con percorsi dei file
-oImposta l'ordine di avvio
-b N -BElimina la voce N
-n NAvvia 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

ErroreCausa probabile e rimedio
error: no such partitionGRUB non trova la partizione: usa ls e correggi root/prefix
error: unknown filesystemFilesystem non riconosciuto o modulo mancante: insmod ext2 / insmod btrfs o reinstalla GRUB
error: file '/boot/grub/x86_64-efi/normal.mod' not foundInstallazione di GRUB incompleta o spostata: reinstalla con grub-install
error: symbol 'grub_calloc' not foundGRUB installato e moduli di versioni diverse: reinstalla con grub-install dopo l'aggiornamento
Failed to get canonical path of /cowEseguito grub-install o grub-mkconfig dentro la live senza chroot
EFI variables are not supported on this systemAvviato in modalità BIOS invece di UEFI: riavvia la chiavetta in UEFI
Windows non appare nel menuAbilita GRUB_DISABLE_OS_PROBER=false, installa os-prober, rigenera
Il menu non appareGRUB_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).

Tag

avvio-di-sistemacomandilinux

Suggerisci una correzione