如何重新创建 EFI 启动分区?

Raf*_*del 12 linux boot grub2 uefi

我已经在我的机器上安装了 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
Run Code Online (Sandbox Code Playgroud)

这是我的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)
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

Mar*_*rco 7

我不知道你为什么首先使用 grub。UEFI 充当引导加载程序,它允许从引导菜单中选择不同的操作系统或单个内核。尽管有一些例外,但通常不需要链接第二个引导加载程序,在这种情况下为 grub。

你提到,你安装的是elementary OS而不是Fedora,这意味着你只需要加载一个操作系统。在这里,我提出了一种 使用 grub 的方法。内核需要用 EFI_STUB 编译,如果是这种情况你可以检查

grep EFI_STUB /boot/config-<version>
Run Code Online (Sandbox Code Playgroud)

将内核和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>
Run Code Online (Sandbox Code Playgroud)

在 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 -
Run Code Online (Sandbox Code Playgroud)

--disk参数采用磁盘,例如设备名称 --disk /dev/sda,该--part参数采用ESP的分区编号,如4.您可以找到以下命令ESP分区号:

gdisk -l /dev/sda | awk '$6=="EF00" {print $1}'
Run Code Online (Sandbox Code Playgroud)

确保在每次内核更新后重复这些步骤

要么手动执行此操作(只需重复上述步骤),要么编写一个小脚本来完成这项工作。为了完全自动化,可以将脚本挂接到内核安装后过程、initramfs 更新后过程和内核 postrm 过程(以删除 UEFI 引导项)。实际上,我不知道为什么在发行版中默认情况下不这样做,它只是几行代码。

  • Marco,建议使用 stub 是*不负责任的*,除非您急于引导每个用户了解他的发行版不支持的内容,而不是像“每次内核升级后做”那样传递下去。自动化很好,但不是很好,我告诉你这是一个负责 ALT Linux 中 UEFI 支持的人。 (3认同)

Raf*_*del 3

我做到了 !

首先,我通过以下方式删除了所有不必要的启动项:

efibootmgr -b <entry_hex_number> -B
Run Code Online (Sandbox Code Playgroud)

然后,使用文件系统重新格式化 ESP 分区FAT32

mkfs.vfat -F32 /dev/sda1
Run Code Online (Sandbox Code Playgroud)

然后安装 grub 为/dev/sdaNOT/dev/sda1

grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)

  • 您不需要写入 MBR 的 grub-install。我不知道你发行版的 grub 是否同时执行这两件事,但你需要的是将 grubx64.efi (或 shim.efi)复制到 /boot/efi/EFI/$distro/ 和 efibootmgr -c -l /boot /efi/EFI/$distro/grubx64.efi。 (3认同)