Repararea și reinstalarea GRUB

Repararea și reinstalarea GRUB

GRUB este bootloader-ul folosit de majoritatea distribuțiilor Linux și este primul program care pornește după firmware-ul plăcii de bază (BIOS sau UEFI). Dacă GRUB a fost șters, dezinstalat din greșeală, suprascris de Windows după o actualizare sau dacă fișierele lui s-au corupt după o oprire bruscă, sistemul nu mai pornește, chiar dacă toate datele tale sunt încă pe disc. Vestea bună este că reparația durează de obicei câteva minute și nu implică reinstalarea sistemului.

Simptome tipice:

  • apare promptul grub rescue> sau grub> în loc de meniu;
  • mesaje de tipul error: unknown filesystem, error: no such partition sau file '/boot/grub/i386-pc/normal.mod' not found;
  • calculatorul pornește direct în Windows sau afișează No bootable device;
  • intrarea Linux a dispărut din meniul de boot al firmware-ului UEFI.

Ce ai nevoie

  • un stick USB live cu o distribuție Linux (ideal aceeași distribuție și aceeași versiune ca sistemul instalat, dar orice live modern funcționează pentru montare și chroot);
  • conexiune la internet în sesiunea live, dacă trebuie reinstalate pachetele GRUB;
  • să știi dacă sistemul a fost instalat în mod BIOS (Legacy/CSM) sau UEFI.
Stick-ul live trebuie pornit în același mod în care a fost instalat sistemul. Dacă sistemul este UEFI și pornești live-ul în mod Legacy, grub-install va eșua cu mesajul EFI variables are not supported on this system. Din meniul de boot al plăcii de bază alege intrarea cu prefixul UEFI: pentru stick.

Pasul 1: verifică modul de boot

În sesiunea live, deschide un terminal și rulează:

[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"

Dacă sistemul instalat are o partiție mică (100 - 1000 MB) formatată FAT32 cu flag-ul esp sau boot, atunci este instalat în mod UEFI. Dacă discul are tabelă MBR (dos) și nu există o astfel de partiție, este aproape sigur BIOS.

Pasul 2: identifică partițiile

lsblk -f
sudo fdisk -l

Notează:

  • partiția root (/) a sistemului instalat, de exemplu /dev/sda2 sau /dev/nvme0n1p2;
  • partiția EFI (doar UEFI), de obicei FAT32, de exemplu /dev/sda1 sau /dev/nvme0n1p1;
  • partiția /boot separată, dacă există;
  • discul în sine (fără număr de partiție), de exemplu /dev/sda sau /dev/nvme0n1. Pe BIOS, GRUB se instalează pe disc, nu pe partiție.

În exemplele de mai jos vom folosi:

  • /dev/sdX pentru disc;
  • /dev/sdX2 pentru root;
  • /dev/sdX1 pentru partiția EFI.

Înlocuiește-le cu valorile tale. Pe discurile NVMe partițiile se numesc /dev/nvme0n1p1, /dev/nvme0n1p2 etc.

Cazuri speciale: criptare, LVM, Btrfs

Partiție criptată cu LUKS - deblochează-o înainte de montare:

sudo cryptsetup open /dev/sdX2 cryptroot

Partiția root devine /dev/mapper/cryptroot (sau un volum LVM din interiorul ei).

LVM - activează grupurile de volume și listează-le:

sudo vgchange -ay
sudo lvs

Root-ul va fi ceva de genul /dev/mapper/vg-root sau /dev/fedora/root.

Btrfs - multe distribuții țin sistemul într-un subvolum, nu în rădăcina partiției. Verifică subvolumele:

sudo mount /dev/sdX2 /mnt
sudo btrfs subvolume list /mnt
sudo umount /mnt

Denumiri uzuale ale subvolumului root:

Distribuție Subvolum root Opțiune de montare
Fedora root -o subvol=root
Ubuntu, Mint, Debian (instalare Btrfs) @ -o subvol=@
Arch, EndeavourOS, Manjaro @ (de obicei) -o subvol=@
openSUSE subvolumul implicit (snapshot) fără opțiune, montare simplă

Pasul 3: montare și chroot

Montează sistemul instalat în /mnt și intră în el cu chroot, astfel încât comenzile să ruleze ca și cum ar fi pornit sistemul tău, nu live-ul.

# root (adaugă -o subvol=... pentru Btrfs, vezi tabelul de mai sus)
sudo mount /dev/sdX2 /mnt
 
# doar dacă ai /boot pe partiție separată
sudo mount /dev/sdX3 /mnt/boot
 
# doar UEFI: partiția EFI
sudo mount /dev/sdX1 /mnt/boot/efi
 
# sistemele de fișiere virtuale
for d in dev proc sys run; do sudo mount --rbind /$d /mnt/$d; done
 
sudo chroot /mnt /bin/bash
Nu ești sigur unde se montează partiția EFI? Uită-te în /mnt/etc/fstab înainte de chroot. Pe Debian, Ubuntu, Fedora și openSUSE este de obicei /boot/efi, iar pe Arch poate fi /boot, /efi sau /boot/efi, în funcție de cum a fost făcută instalarea.
După intrarea în chroot poți rula mount -a pentru a monta automat tot ce este definit în /etc/fstab (partiția EFI, /boot, subvolumele Btrfs). Pe openSUSE acest pas este practic obligatoriu, pentru că o parte din /boot/grub2 se află în subvolume separate.

Verifică dacă ai internet în chroot:

ping -c 3 kernel.org

Dacă nu merge rezolvarea numelor, ieși din chroot (exit), copiază configurația DNS a live-ului și intră din nou:

sudo cp --remove-destination /etc/resolv.conf /mnt/etc/resolv.conf
sudo chroot /mnt /bin/bash
Pe Arch, Manjaro și derivate poți sări peste montările manuale din acest pas: vezi tab-ul dedicat de mai jos, unde arch-chroot și manjaro-chroot fac totul automat.

Pasul 4: reinstalarea GRUB

Alege distribuția ta. Toate comenzile se rulează în interiorul chroot-ului, ca root.

Pe Debian, Ubuntu, Linux Mint, Zorin OS, elementary OS și alte derivate, comenzile sunt grub-install și update-grub.

UEFI

apt update
apt install --reinstall grub-efi-amd64 grub-efi-amd64-signed shim-signed
 
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
update-grub

Pentru –bootloader-id folosește ubuntu pe Ubuntu și Mint (Mint folosește tot ubuntu implicit) și debian pe Debian. Numele este doar eticheta din meniul firmware-ului și directorul din /boot/efi/EFI/.

BIOS (Legacy)

apt update
apt install --reinstall grub-pc
 
grub-install --target=i386-pc /dev/sdX
update-grub

Ca să reții permanent discul pe care se instalează GRUB la actualizări, rulează și:

dpkg-reconfigure grub-pc

și bifează discul corect (nu partiția).

Pop!_OS în modul UEFI folosește systemd-boot, nu GRUB, așa că acest tutorial nu i se aplică pe instalările UEFI.
Pe Ubuntu și derivate există și utilitarul grafic Boot-Repair (ppa:yannubuntu/boot-repair), care automatizează pașii de mai sus din sesiunea live. Merită încercat dacă preferi varianta grafică, dar e bine să știi și ce face în spate.

Pe Fedora și pe distribuțiile din familia Red Hat comenzile au prefixul grub2-, iar intrările de kernel sunt gestionate prin BLS (fișiere în /boot/loader/entries/).

UEFI

Pe Fedora și RHEL 9+ nu rula grub2-install în modul UEFI. Distribuția folosește imagini EFI semnate, gata construite, iar grub2-install le înlocuiește cu o versiune nesemnată, ceea ce strică Secure Boot și configurația standard. Reinstalarea pachetelor este suficientă.
dnf reinstall 'shim-*' 'grub2-efi-*' grub2-common grub2-tools
 
grub2-mkconfig -o /boot/grub2/grub.cfg

Începând cu Fedora 34 și RHEL 9, fișierul de configurare real este /boot/grub2/grub.cfg, iar /boot/efi/EFI/fedora/grub.cfg este doar un mic fișier care trimite către el. Reinstalarea pachetului grub2-efi-x64 îl recreează dacă lipsește. Pe Rocky, Alma și RHEL directorul se numește EFI/rocky, EFI/almalinux, respectiv EFI/redhat.

Dacă intrarea a dispărut și din meniul firmware-ului UEFI, o poți recrea cu efibootmgr (exemplu pentru partiția EFI /dev/sdX1):

efibootmgr -c -d /dev/sdX -p 1 -L "Fedora" -l '\EFI\fedora\shimx64.efi'

BIOS (Legacy)

dnf reinstall grub2-pc grub2-pc-modules grub2-common grub2-tools
 
grub2-install /dev/sdX
grub2-mkconfig -o /boot/grub2/grub.cfg

Intrările de kernel lipsesc

Dacă meniul apare, dar fără nicio intrare de kernel, înseamnă că lipsesc fișierele BLS din /boot/loader/entries/. Reinstalarea kernel-ului le regenerează:

dnf reinstall kernel-core

Pe openSUSE Leap și Tumbleweed cea mai sigură metodă este utilitarul propriu update-bootloader, care știe exact cum este configurat sistemul (inclusiv Btrfs și snapshot-urile).

Nu uita să rulezi mount -a imediat după chroot, altfel subvolumele în care stau modulele GRUB nu vor fi montate.

Verifică întâi ce bootloader folosește sistemul, pentru că instalările mai noi de Tumbleweed pot folosi grub2-bls sau systemd-boot:

grep LOADER_TYPE /etc/sysconfig/bootloader

UEFI (LOADER_TYPE="grub2-efi")

zypper refresh
zypper install -f grub2 grub2-x86_64-efi shim
 
update-bootloader --reinit

Dacă vrei să faci pașii manual:

shim-install --config-file=/boot/grub2/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg

BIOS (LOADER_TYPE="grub2")

zypper refresh
zypper install -f grub2 grub2-i386-pc
 
grub2-install /dev/sdX
grub2-mkconfig -o /boot/grub2/grub.cfg

Sau, mai simplu, update-bootloader –reinit.

Pe Arch și derivate nu ai nevoie de montările manuale din pasul 3, ci doar de montarea partițiilor, după care arch-chroot se ocupă de restul.

mount /dev/sdX2 /mnt
mount /dev/sdX1 /mnt/boot   # sau /mnt/efi sau /mnt/boot/efi, vezi /mnt/etc/fstab
arch-chroot /mnt

Dacă ai pornit de pe alt live decât ISO-ul Arch, instalează întâi arch-install-scripts pentru a avea arch-chroot.

UEFI

pacman -Syu grub efibootmgr os-prober
 
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg

Valoarea de la –efi-directory trebuie să fie punctul unde ai montat partiția EFI (/boot, /efi sau /boot/efi).

BIOS (Legacy)

pacman -Syu grub os-prober
 
grub-install --target=i386-pc /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg

Kernel lipsă

Dacă din /boot lipsesc și vmlinuz-linux și initramfs-linux.img (de exemplu dacă partiția EFI montată pe /boot a fost formatată), reinstalează kernel-ul înainte de grub-mkconfig:

pacman -S linux linux-firmware

Manjaro are propriul utilitar care detectează automat sistemul instalat și face toate montările:

sudo manjaro-chroot -a

Alege sistemul din listă, apoi:

UEFI

pacman -Syu grub efibootmgr os-prober
 
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=manjaro --recheck
update-grub

BIOS (Legacy)

pacman -Syu grub os-prober
 
grub-install --target=i386-pc --recheck /dev/sdX
update-grub

Pasul 5: ieșire și repornire

exit
sudo umount -R /mnt
sudo reboot

Scoate stick-ul la repornire. Pe sistemele UEFI, dacă tot nu pornește Linux, intră în setările firmware-ului și verifică ordinea de boot. Lista intrărilor o poți vedea și din Linux cu:

efibootmgr -v

Varianta rapidă: pornire din promptul GRUB, fără stick live

Dacă GRUB încă există pe disc dar nu-și mai găsește configurația (apare grub rescue> sau grub>), poți porni sistemul manual și apoi îl repari direct din el, fără live.

Din grub rescue>

Listează partițiile și caută-o pe cea care conține directorul GRUB:

ls
ls (hd0,gpt2)/
ls (hd0,gpt2)/boot/grub

Pe tabelă MBR partițiile apar ca (hd0,msdos1). Când ai găsit-o pe cea corectă:

set root=(hd0,gpt2)
set prefix=(hd0,gpt2)/boot/grub
insmod normal
normal

Pe Fedora și openSUSE directorul este /boot/grub2 în loc de /boot/grub. Dacă /boot este pe partiție separată, prefixul devine (hd0,gpt3)/grub.

Din grub>

Dacă ești în promptul normal dar fără meniu, poți porni kernel-ul direct (completarea cu tasta Tab funcționează):

set root=(hd0,gpt2)
linux /boot/vmlinuz root=/dev/sda2 ro
initrd /boot/initrd.img
boot

Numele fișierelor diferă de la o distribuție la alta (vmlinuz-linux pe Arch, vmlinuz-6.x.y-… pe Fedora), folosește ls /boot/ ca să le vezi. După pornire, rulează comenzile din pasul 4 direct în sistem, fără chroot.

Dual boot cu Windows

Începând cu GRUB 2.06, detectarea altor sisteme de operare este dezactivată implicit. Ca Windows să apară din nou în meniu:

  1. instalează os-prober (pachetul are același nume în toate distribuțiile);
  2. în /etc/default/grub adaugă sau decomentează linia:
    GRUB_DISABLE_OS_PROBER=false
  3. regenerează configurația cu update-grub (Debian/Ubuntu/Manjaro), grub-mkconfig -o /boot/grub/grub.cfg (Arch) sau grub2-mkconfig -o /boot/grub2/grub.cfg (Fedora/openSUSE).

În chroot os-prober poate să nu găsească Windows. În acest caz rulează din nou comanda de regenerare după ce ai pornit normal în Linux.

Dacă după o actualizare de Windows calculatorul pornește direct în Windows, de cele mai multe ori GRUB nu a fost șters, ci doar mutat mai jos în ordinea de boot. Verifică întâi setările firmware-ului sau rulează din Windows, ca administrator:

bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi

(înlocuiește ubuntu cu directorul distribuției tale din partiția EFI).

Probleme frecvente

Mesaj / situație Cauză Soluție
EFI variables are not supported on this system live-ul a pornit în mod BIOS repornește stick-ul în mod UEFI
cannot find EFI directory partiția EFI nu este montată montează-o în locul indicat de –efi-directory
will not proceed with blocklists ai dat ca țintă o partiție, nu discul folosește /dev/sdX, nu /dev/sdX2
this GPT partition label contains no BIOS Boot Partition instalare BIOS pe disc GPT fără partiția bios_grub creează o partiție de 1 MB cu flag bios_grub sau treci pe UEFI
GRUB se instalează corect, dar firmware-ul îl ignoră unele plăci de bază „uită” intrările UEFI rulează grub-install încă o dată cu opțiunea –removable (pe Fedora copiază shimx64.efi ca EFI/BOOT/BOOTX64.EFI)
Verification failed: (0x1A) Security Violation GRUB nesemnat cu Secure Boot activ reinstalează pachetele shim și grub-efi-*-signed sau dezactivează temporar Secure Boot
meniul apare fără intrări Linux lipsesc kernel-ul sau initramfs-ul reinstalează pachetul kernel-ului, apoi regenerează grub.cfg