Linux

如何重新創建 EFI 引導分區?

  • December 26, 2013

我已經在我的機器上安裝了 Fedora,帶有用於 EFI 引導的/分區、swap分區和分區。ESP

現在,我安裝的是 Elementary OS 而不是 Fedora。

  1. 我已經格式化了/分區(/dev/sda3)
  2. 格式化交換分區 (/dev/sda4)
  3. 沒有格式化 EFI 引導分區 (/dev/sda1)

現在當我啟動時,我得到了由 Fedora 安裝的舊 grub 菜單。我只能通過以下方式啟動 Elementary OS:

  1. 進入啟動菜單。
  2. 選擇從 EFI 文件啟動
  3. 瀏覽/dev/sda1/, 以獲取elementary包含grubx64.efi文件的目錄。這是/boot/efi/EFI/elementary/grubx64.efi

我該如何解決?/dev/sda1/我想用或其他東西格式化引導分區,fat16然後在其上重新安裝 grub。

/dev/sda1現在包含這個:

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

這是我的efibootmgr輸出:

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)

任何幫助,將不勝感激。

我做到了 !

首先,我通過以下方式刪除了所有不必要的引導條目:

efibootmgr -b <entry_hex_number> -B

然後,用文件系統重新格式化 ESP 分區FAT32

mkfs.vfat -F32 /dev/sda1

然後將 grub 安裝為/dev/sdaNOT/dev/sda1

grub-install /dev/sda

我不知道你為什麼首先使用 grub。UEFI 充當引導載入程序,它允許從引導菜單中選擇不同的作業系統或單個核心。儘管有一些例外,但通常不需要連結第二個引導載入程序,在這種情況下是 grub。

您提到,您安裝了基本作業系統而不是Fedora,這意味著您只需要載入一個作業系統。在這裡,我提出了一種 使用 grub 的方法。核心需要使用 EFI_STUB 編譯,如果是這種情況,您可以檢查

grep EFI_STUB /boot/config-<version>

將核心和initramfs複製到ESP(EFI系統分區)

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

在 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 -

--disk參數取磁碟的設備名稱,例如 ,--disk /dev/sda參數--part取 ESP 的分區號,例如 4。您可以使用以下命令找到 ESP 分區號:

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

確保在每次核心更新後重複這些步驟

您可以手動執行此操作(只需重複上述步驟),或者您編寫一個完成這項工作的小腳本。為了使其完全自動化,腳本可以掛接到核心安裝後程序、initramfs 更新後程序和核心 postrm 程序(以刪除 UEFI 引導條目)。實際上,我不知道為什麼發行版預設不這樣做,它只是幾行程式碼。

引用自:https://unix.stackexchange.com/questions/83669