Un aggiornamento di Windows danneggia GRUB


Nel mio ultimo computer ho voluto tenere un dual boot con GRUB essendo obbligato in alcune situazioni ad utilizzare una macchina Windows genuina per connettermi ad alcune VPN. Stamattina, eseguendo gli aggiornamenti del sistema operativo Windows 11, qualcosa è andato storto ed è stato danneggiato il GRUB che mi permette all’avvio della macchina di avviare Ubuntu 22.04 oppure Windows11

Unified Extensible Firmware Interface
Unified Extensible Firmware Interface

Cos’è GRUB

GRUB (Grand Unified Bootloader) è un bootloader, ovvero un programma che viene eseguito all’avvio di un computer per caricare il sistema operativo. È particolarmente comune nei sistemi basati su Linux, ma può essere utilizzato anche per avviare altri sistemi operativi come Windows.

Funzioni principali di GRUB:

  1. Selezione del sistema operativo:
    • GRUB permette di scegliere quale sistema operativo avviare se ne hai installato più di uno sullo stesso computer (dual-boot). Ad esempio, se hai sia Ubuntu che Windows installati, GRUB ti presenterà un menu all’avvio dove puoi scegliere quale sistema operativo avviare.
  2. Caricamento del kernel:
    • GRUB carica il kernel del sistema operativo scelto in memoria e lo avvia. Il kernel è il cuore del sistema operativo e gestisce tutte le interazioni tra l’hardware e il software.
  3. Configurabilità:
    • GRUB è altamente configurabile. Puoi modificarne le impostazioni per cambiare l’aspetto del menu, aggiungere o rimuovere opzioni di avvio, impostare quale sistema operativo deve essere avviato di default, e molto altro.
  4. Compatibilità con diversi file system:
    • GRUB supporta una vasta gamma di file system, il che significa che può leggere i file necessari per avviare un sistema operativo indipendentemente dal file system utilizzato.
  5. Modalità di recupero:
    • Se un sistema operativo non riesce ad avviarsi correttamente, GRUB può fornire opzioni per avviare il sistema in modalità di recupero (recovery mode) o per passare parametri speciali al kernel per aiutare a risolvere problemi.

GRUB e UEFI

  • UEFI e BIOS: GRUB funziona sia con sistemi UEFI (che è il firmware moderno presente nei computer più recenti) sia con sistemi BIOS (che è il firmware più vecchio).
  • Secure Boot: In sistemi UEFI con Secure Boot abilitato, GRUB deve essere firmato digitalmente per poter essere avviato. Questo garantisce che solo software approvato possa essere eseguito all’avvio, migliorando la sicurezza.

Versioni di GRUB

  • GRUB Legacy: La versione più vecchia di GRUB, che è meno usata oggi.
  • GRUB 2: La versione più recente e quella più comunemente utilizzata oggi. GRUB 2 offre molte più funzionalità rispetto a GRUB Legacy, incluso un sistema di configurazione più potente e un supporto esteso per diversi tipi di file system e dispositivi di avvio.

Tentativo di soluzione manuale

La prima operazione da fare è creare una chiavetta USB di avvio contenente la stessa versione di Ubuntu che ho a bordo del PC, la 22.04 Jammy Jellyfish.

Creazione di un USB disk di avvio

Per fare questo occorre scaricare dal sito di Ubuntu l’immagine ISO di questa versione; una volta scaricata l’ISO utilizzare l’utility di creazione dischi:

Crea disco di avvio
Crea disco di avvio

Selezionare quindi l’immagine scaricata e avviare la creazione del disco

Installazione dell'USB di avvio
Installazione dell’USB di avvio

Alla fine verrà mostrato l’avviso di creazione eseguita

Creazione USB disk completata
Creazione USB disk completata

Come è stato partizionato il disco?

Occorre innanzitutto chiarire come è stato partizionato il disco quando è stato installato Ubuntu.

Per fare questo esistono due comandi di ispezione che sono lsblk e fdisk.

Questo è l’output di lsblk per il mio disco

$ sudo lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0     4K  1 loop /snap/bare/5
loop1         7:1    0  10,1M  1 loop /snap/canonical-livepatch/278
...
loop54        7:54   0 447,3M  1 loop /snap/telegram-desktop/6117
nvme0n1     259:0    0 953,9G  0 disk 
├─nvme0n1p1 259:1    0   260M  0 part /boot/efi
├─nvme0n1p2 259:2    0    16M  0 part 
├─nvme0n1p3 259:3    0 464,3G  0 part 
├─nvme0n1p4 259:4    0     1G  0 part 
└─nvme0n1p5 259:5    0 488,3G  0 part /var/snap/firefox/common/host-hunspell

E questo è l’output per fdisk

$ sudo fdisk -l
[sudo] password di marco: 
Disk /dev/loop0: 4 KiB, 4096 bytes, 8 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...
Disk /dev/nvme0n1: 953,87 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: WD PC SN740 SDDQNQD-1T00-1014           
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8C2BBF42-DC93-4D6C-A305-9C00B93C5816
Dispositivo         Start       Fine    Settori   Size Tipo
/dev/nvme0n1p1       2048     534527     532480   260M EFI System
/dev/nvme0n1p2     534528     567295      32768    16M Microsoft reserved
/dev/nvme0n1p3     567296  974311423  973744128 464,3G Microsoft basic data
/dev/nvme0n1p4 1998311424 2000408575    2097152     1G Windows recovery environment
/dev/nvme0n1p5  974311424 1998311423 1024000000 488,3G Linux filesystem
Partition table entries are not in disk order.

Interpretazione di lsblk e fdisk -l

  1. Dispositivi loop:
    • I dispositivi loop che vengono mostrati (loop0loop1, ecc.) sono immagini montate temporaneamente dal sistema live che si sta utilizzando. Non hanno a che fare con il mio disco fisso, quindi li possiamo ignorare.
  2. Disco sda:
    • Questo sembra essere il supporto USB o il CD/DVD da cui ho avviato il sistema live. Anche questo possiamo ignorarlo per ora.
  3. Disco nvme0n1:
    • Questo è il mio SSD principale da 953,87 GiB (1 Terabayte), suddiviso in diverse partizioni:
PartizioneTipoDimensione
/dev/nvme0n1p1EFI System (Partizione EFI)260M
/dev/nvme0n1p2Microsoft Reserved16M
/dev/nvme0n1p3Microsoft basic data (Windows)464,3G
/dev/nvme0n1p4Windows recovery environment1G
/dev/nvme0n1p5Linux filesystem (Ubuntu)488,3G

Quindi le partizioni più importanti sono

  • /dev/nvme0n1p1 che è quello dall’UEFI (l’ex BIOS)
  • /dev/nvme0n1p3 la partizione Windows
  • /dev/nvme0n1p5 la partizione Linux

Procedura per ripristinare GRUB

Ora che abbiamo identificato le partizioni, si può procedere con il ripristino di GRUB montando manualmente dal sistema di avvio USB la partizione di Ubuntu e reinstallando GRUB.

1. Montare la partizione di Ubuntu

  • Monto la partizione di Ubuntu, che nel mio caso è /dev/nvme0n1p5, con il seguente comando:

sudo mount /dev/nvme0n1p5 /mnt

2. Montare le directory necessarie

  • Dopo aver montato la partizione di Ubuntu, devo montare anche le altre directory necessarie:

sudo mount –bind /dev /mnt/dev

sudo mount –bind /proc /mnt/proc

sudo mount –bind /sys /mnt/sys

sudo mount /dev/nvme0n1p1 /mnt/boot/efi

Il comando per montare /dev/nvme0n1p1 nella directory /mnt/boot/efi è necessario perché questa partizione contiene i file di avvio EFI.

3. Accedere alla mia installazione con chroot

  • Ora, entro nel sistema Ubuntu installato utilizzando chroot (in questo momento sono nella chiavetta USB!):
sudo chroot /mnt

4. Reinstallare GRUB

  • Reinstallo GRUB sul SSD principale (che è /dev/nvme0n1):
grub-install /dev/nvme0n1
  • Aggiorno la configurazione di GRUB:
update-grub

5. Uscire e riavviare

  • Uscire dall’ambiente chroot:
exit
  • Smonto tutte le partizioni montate:
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt/boot/efi
sudo umount /mnt
  • Riavvio il sistema:
sudo reboot

Dopo il riavvio, dovrei vedere il menu di GRUB e poter scegliere tra Ubuntu e Windows.

Ma non funziona

Però quanto fatto non funziona: si avvia sempre automaticamente la partizione Windows e non vedo più Linux.

In realtà la partizione c’è: avviando UEFI (premendo F2 all’avvio) vedo correttamente le due partizioni e modificando l’ordine a mano parte sia Windows che Linux ma non parte più il GRUB.

Tra le varie opzioni trovate da ChatGPT 4, preferisco andare direttamente all’opzione che mi consiglia di installare boot-repair.

Ripristino del bootloader con Boot-Repair

Avvio nuovamente il sistema con un live CD/USB di Ubuntu.

Quindi installo Boot-Repair:

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt update
sudo apt install -y boot-repair

Avvio Boot-Repair:

boot-repair

Un estratto della procedura di riparazione dell’UEFI è questa (mi viene generato un pastebin che verrà conservato per un mese. Me lo trascrivo in locale):

============================= Boot Repair Summary ==============================
modprobe: FATAL: Module efivars not found in directory /lib/modules/6.5.0-18-generic
Recommended repair: ____________________________________________________________
The default repair of the Boot-Repair utility will reinstall the grub-efi-amd64-signed of
nvme0n1p5,
using the following options:  nvme0n1p1/boot/efi
Additional repair will be performed:  unhide-bootmenu-10s use-standard-efi-file
Mount /dev/nvme0n1p1 on /mnt/boot-sav/nvme0n1p5/boot/efi
Unhide GRUB boot menu in nvme0n1p5/etc/default/grub
============ Reinstall the grub-efi-amd64-signed of /dev/nvme0n1p5 =============

In sostanza credo che l’aggiornamento di Windows abbia in qualche modo causato una corruzione del file efi nella partizione destinata a EFI.

Tuttavia questa operazione fatta da boot-repair risolve completamente il problema e il dual boot ricomincia a funzionare, lo provo per un po’ di volte per essere sicuro.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.