如何重新创建EFI引导分区?


10

我已经在计算机上安装了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)

任何帮助,将不胜感激。



1
您的UEFI实施是否具有诸如F8之类的任何引导选择菜单?请发布efibootmgr输出,以便可以看到是否有elementary的条目(似乎不是,但是要确定)。您可能还希望refind作为您的启动管理器。万一您想快速浏览一下该系统上的E17,有一个可以正常运行映像(490M ISO链接)以及每周快照。关于E polis可能不
那么出色

@MichaelShigorin好的,我已经添加了efibootmgr输出。
拉斐尔·阿德尔2013年

Answers:


5

我不知道您为什么首先使用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引导项)。实际上,我不知道为什么默认情况下在发行版中没有这样做,这只是几行代码。


嗯,我没有,grep EFI_STUB /boot/config-3.2.0-49-generic但一无所获。
拉斐尔·阿德尔

内核3.2太旧(从2012年1月开始),无法支持EFI_STUB。您至少需要内核3.3。
Marco Marco

@RafaelAdel如果您不想构建自己的内核,则可以在软件存储库中检查较新的内核版本。Elementary似乎基于Ubuntu,并且应该提供3.5或3.8内核。较新的版本更可能启用了EFI_STUB。
Marco Marco

实际上,现在有内核3.10.1。试一试。
拉斐尔·阿德尔

2
Marco,建议使用存根是不负责任的,除非您渴望引导每个用户了解其发行版所不支持的内容,并且不要像“在每次内核升级后执行”那样将其传递给他人。我可以告诉您,这是一个负责ALT Linux中UEFI支持的人,它可以自动化,但没有那么好。
Michael Shigorin

2

我做的 !

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

efibootmgr -b <entry_hex_number> -B

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

mkfs.vfat -F32 /dev/sda1

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

grub-install /dev/sda

3
您不需要写MBR的grub-install。我不知道您的发行版grub是否可以同时完成这两项操作,但是您需要将grubx64.efi(或shim.efi)复制到/ boot / efi / EFI / $ distro /和efibootmgr -c -l / boot /efi/EFI/$distro/grubx64.efi。
Lingzhu Xiang

1
grub-install已经学会了破解EFI(您可以使用--target = x86_64-efi强制它,但是无论如何必须在那个时候加载efivars.ko)。
Michael Shigorin 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.