How to recreate EFI boot partition?

23,087

Solution 1

I did it !

First of all, I removed all the unnecessary boot entries by:

efibootmgr -b <entry_hex_number> -B

Then, Reformatting the ESP partition with FAT32 filesystem.

mkfs.vfat -F32 /dev/sda1

Then installed grub to /dev/sda NOT /dev/sda1

grub-install /dev/sda

Solution 2

I don't know why you're using grub in the first place. UEFI acts as a boot loader and it allows to select different operating systems or individual kernels from a boot menu. Although there are some exceptions, it usually is not required to chain a second boot loader, grub in this case.

You mention, you installed elementary OS instead of Fedora, which means you only need to load one operating system. Here I present a way to do it without using grub. The kernel needs to be compiled with EFI_STUB, if that's the case you can check with

grep EFI_STUB /boot/config-<version>

Copy the kernel and initramfs to the ESP (EFI system partition)

cp /boot/vmlinuz-<version> /boot/efi/EFI/elementary/vmlinuz-<version>.efi
cp /boot/initrd.img-<version> /boot/efi/EFI/elementary/initrd.img-<version>

Register kernel as boot option in UEFI

echo "root=UUID=<disk_uuid> ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\elementary\\initrd.img-<version>" |
  iconv -f ascii -t ucs2 |
  efibootmgr \
    --create --gpt \
    --disk /dev/<disk> --part <partition_number> \
    --label "Elementary OS" \
    --loader "\\EFI\\elementary\\vmlinuz-<version>.efi" \
    --write-signature --append-binary-args -

The --disk argument takes the device name of the disk, e.g. --disk /dev/sda, the --part argument takes the partition number of the ESP, e.g. 4. You can find the ESP partition number with the following command:

gdisk -l /dev/sda | awk '$6=="EF00" {print $1}'

Ensure that you repeat the steps after each kernel update

Either you this manually (just repeat the steps above) or you write a small script which does the job. To fully automatise it, the script could be hooked into the kernel post-install procedure, into the initramfs post-update procedure and into the kernel postrm procedure (to remove the UEFI boot entry). Actually, I don't know why this isn't done by default in the distributions, it's just a few lines of code.

Share:
23,087

Related videos on Youtube

Rafael Adel
Author by

Rafael Adel

About me

Updated on September 18, 2022

Comments

  • Rafael Adel
    Rafael Adel almost 2 years

    I've installed Fedora on my machine with / partition, swap partition and ESP partition for EFI booting.

    Now, I was installing Elementary OS instead of Fedora.

    1. I have formatted the / partition (/dev/sda3)
    2. Formatted the swap partition (/dev/sda4)
    3. But did not format the EFI boot partition (/dev/sda1)

    Now when i boot, i get my old grub menu that's was installed by Fedora. I can only boot into Elementary OS by:

    1. Entering the boot menu.
    2. Selecting boot from EFI file
    3. Navigate through /dev/sda1/, to get the elementary directory that contains grubx64.efi file. Which is /boot/efi/EFI/elementary/grubx64.efi.

    How can i fix that ? I thought of formatting the boot partition /dev/sda1/ with fat16 or something then re-installing grub on it.

    My /dev/sda1 now contains this :

    root@rafael:/home/rafael# ls /boot/efi/
    EFI  mach_kernel  System
    
    root@rafael:/home/rafael# ls /boot/efi/EFI/
    BOOT/       elementary/ fedora/     
    
    root@rafael:/home/rafael# ls /boot/efi/EFI/fedora/
    BOOT.CSV  fonts  gcdx64.efi  grub.cfg  grubx64.efi  MokManager.efi  shim.efi  shim-fedora.efi
    
    root@rafael:/home/rafael# ls /boot/efi/EFI/elementary/
    grubx64.efi
    

    Here's my efibootmgr output :

    BootCurrent: 003D
    Timeout: 0 seconds
    BootOrder: 2001,2002,2003
    Boot0000* Notebook Hard Drive
    Boot0010* Internal CD/DVD ROM Drive
    Boot0011* Internal CD/DVD ROM Drive (UEFI)
    Boot0012* Fedora
    Boot0013* Fedora
    Boot0014* Fedora
    Boot0015* Fedora
    Boot0016* Fedora
    Boot0017* Fedora
    Boot0018* Fedora
    Boot0019* Fedora
    Boot001A* Fedora
    Boot001B* Fedora
    Boot001C* Fedora
    Boot001D* Fedora
    Boot001E* Fedora
    Boot001F* elementary
    Boot2001* USB Drive (UEFI)
    Boot2002* Internal CD/DVD ROM Drive (UEFI)
    

    Any help would be appreciated.

  • Rafael Adel
    Rafael Adel almost 11 years
    Hmmm, I did grep EFI_STUB /boot/config-3.2.0-49-generic but got nothing.
  • Marco
    Marco almost 11 years
    kernel 3.2 is too old (it's from January 2012) to support EFI_STUB. You need at least kernel 3.3.
  • Marco
    Marco almost 11 years
    @RafaelAdel If you don't want to build your own kernel you can check for a newer kernel version in the software repositories. Elementary seems to be based on Ubuntu and a kernel 3.5 or 3.8 should be available. The newer ones are more likely to have EFI_STUB enabled.
  • Rafael Adel
    Rafael Adel almost 11 years
    Actually there's kernel 3.10.1 now. Gonna give it a try.
  • Michael Shigorin
    Michael Shigorin almost 11 years
    Marco, advising stub use is irresponsible unless you're eager to guide each user through what's unsupported by his distribution and not pass it down like "do after each kernel upgrade". It's fine to have but not so fine to automate, I'm telling you this as a guy who's responsible for UEFI support in ALT Linux.
  • Marco
    Marco almost 11 years
    @MichaelShigorin It's easy to hook it into /etc/kernel/postinst.d, /etc/kernel/postrm.d and /etc/initramfs/post-update.d/. The only thing the scripts need to do is copy/remove two files (kernel and initramfs) from /boot to the ESP and call efibootmgr.
  • Michael Shigorin
    Michael Shigorin almost 11 years
    So go ahead and implement it in debian at least. BTW my answer is not a comment since it actually suggests refind (which tends to be an answer with crippled/missing boot menu in firmware or just broken/incomplete configuration). Unfortunately short boot chains is not what UEFI is about in practice, especially with RestrictedBoot :-/
  • Lingzhu Xiang
    Lingzhu Xiang almost 11 years
    @MichaelShigorin I've been using Debian kernel with EFISTUB for a year and it's fine. Shorter boot chain is the point, because it gets rid of the bloated grub. I don't see how Secure Boot has anything to do here.
  • Michael Shigorin
    Michael Shigorin almost 11 years
    grub-install has learned to grok EFI (you can force it to with --target=x86_64-efi but efivars.ko must be loaded by that time anyways).