Repair your Fedora's (EFI) GRUB Bootloader


It happened again - this time on my Fedora machine! I ended up with a laptop that won’t boot after some package changes. Last time that happened was ~ 4 years ago when Arch Linux could not decrypt my main partitions due to some changes on a crypto library. This time the accident was caused by a simple dnf command:

dnf autoremove

I intended to remove dangling packages from my system - expecting my package manager to know which packages are needed and which not. Unfortunately some really important packages (amongst some legacy packages) were removed. My laptop was not even able to start any boot loader - it booted straight to the device diagnosis application that the hardware manufacturer ships.

Investigating the issue

… What went wrong? As always with a non-booting system, a live system on a USB dongle helps…

Chroot Fedora in Live environment

The following steps are similar to the ones described on this Fedora Manual page: https://docs.fedoraproject.org/en-US/Fedora/22/html/Multiboot_Guide/common_operations_appendix.html#common-chroot_from_live

I booted up the live medium and set up a wired network connection. Wired, because it’s easier and I don’t need to mess around with Wifi. Then I changed to terminal, changed to the root user via su and then mounted Fedora system that was installed on my disk:

lsblk will help to find the correct devices (looking at the partition sizes)

nvme0n1              259:0    0   477G  0 disk  
├─nvme0n1p1          259:1    0   200M  0 part
├─nvme0n1p2          259:2    0     1G  0 part
└─nvme0n1p3          259:3    0 475,8G  0 part

In my case:

  • nvme0n1p1: EFI partition
  • nvme0n1p2: Boot partition (Linux Kernel, Bootloader)
  • nvme0n1p3: System Partition: LUKS encrypted, with LVM. Includes rootfs, home, swap.

Depending on your system (and if you’re using LUKS and LVM) the tree might look different.

mkdir /mnt/sysimage
cryptsetup luksOpen /dev/nvme0n1p3 cryptdata
mount /dev/mapper/fedora_thomas--nb2-root /mnt/sysimage
mount /dev/nvme0n1p2 /mnt/sysimage/boot
mount /dev/nvme0n1p3 /mnt/sysimage/boot/efi

The final step to change to the existing Fedora system:

chroot /mnt/sysimage

You are now effectively in your old Fedora system - not in the live system, anymore! You can exit the chroot environment via exit.

Restore DNS

Your network connection inside the chroot will probably not work as it should. While pings should work, sometimes DNS resolving does not work due to a broken / invalid /etc/resolv.conf. In my case, resolv.conf was an invalid symlink. I replaced it like this:

mv /etc/resolv.conf /etc/resolv.conf.bak
touch /etc/resolv.conf

Now put the following into /etc/resolv.conf

nameserver 9.9.9.9

(… or select another DNS resolver IP address. I chose “Quad Nine”).

… check if resolving public names does work, now:

ping thomas-leister.de

Analyze the dnf log file

In /var/log/dnf.log I found the list of packages that was removed during the dnf autoremove and copied the section to a new text file.

The list includes the following packages:

grub2-efi-x64-1:2.04-15.fc32.x86_64
grub2-pc-1:2.04-15.fc32.x86_64                                                               
grub2-pc-modules-1:2.04-15.fc32.noarch
grub2-tools-efi-1:2.04-15.fc32.x86_64                                                        
grub2-tools-extra-1:2.04-15.fc32.x86_64
shim-x64-15-8.x86_64

You might get an idea why my system stopped booting successfully … ;-)

Reinstall GRUB and Shim

Run this command to reinstall all the important boot related packages that were removed by accident:

dnf reinstall grub2-efi grub2-pc grub2-pc-modules grub2-tools-efi grub2-tools-extra shim

And that’s basically it! Your system should be fine, again.

Exit the chroot, unmount all the drives and reboot:

exit
cd ~
umount /mnt/sysimage/boot/efi
umount /mnt/sysimage/boot
umount /mnt/sysimage
sync
reboot

Though, when I was busy with my repair, I obviously missed to install grub2-efi-x64 so I ended up with this message after a reboot:

Failed to open \EFI\fedora\grubx64.efi - Not Found Failed to load image \EFI\fedora\grubx64.efi: Not Found start_image() returned Not Found

It seemed clear to me that I needed to run

grub2-install --efi-directory=/boot/efi --target=x86_64-efi /dev/nvme0n1

To install GRUB on my SSD and restore that .efi file. Unfortunately I haven’t read https://fedoraproject.org/wiki/GRUB_2#Create_a_GRUB_2_configuration … and made things … worse and better and the same time? …

After “restoring” grubx64.efi the boot process took me to GRUB (at least), but stopped at the GRUB command prompt:

grub>

… not what I expected. It seemed like GRUB did not find its configuration file. I decided to load my existing config file EFI/fedora/grub.cfg (on the EFI partition) manually:

grub> configfile (hd0,gpt)/EFI/fedora/grub.cfg

At this stage I was able to boot my Fedora instance, again. But the GRUB problem was not yet resolved: I only booted when issuing the “configfile” command manually.

Cause of this problem was the: grub2-install command (as one could have read at the link mentioned earlier!): EFI + grub2-install don’t go well, I one can trust the red box in the Fedora wiki article. So I installed grub2-efi, created a new config file (just to be sure) and the boot was fixed!

dnf install grub2-efi
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

(grub2-efi will install a proper version of grubx64.efi which loads the GRUB config from the correct location. The grubx64.efi generated by the grub2-install command tried to load the config from a file that did not exist and therefore caused the issue with the grub> command line.)