错误的 grub 前缀 (efi) `grub-install` 和 `update-grub` 无法修复它

错误的 grub 前缀 (efi) `grub-install` 和 `update-grub` 无法修复它

问题:

引导时,grub 会进入提示符(grub>,而不是grub rescue>)。我需要输入:

set prefix=(hd0,gpt8)/boot/grub
insmod normal
normal

获得正常的 grub 菜单。

到目前为止,我发现的每一篇文章都是通过执行grub-install和/或update-grub一旦您设法启动系统来解决的。
我尝试了这些,但问题仍然存在。

细节:

我使用 Windows 10 和 pop-os(基于 ubuntu)进行双重启动。我有一台宏碁笔记本电脑,启动模式设置为UEFI安全启动enabled

我的分区如下所示:

$ lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,UUID,LABEL,PARTUUID,PARTTYPE
NAME            SIZE FSTYPE MOUNTPOINT UUID                                 LABEL    PARTUUID                             PARTTYPE
sda           238.5G                                                                                                      
├─sda1          529M ntfs              6272EE1672EDEF2B                     Recovery b593e2b8-992e-4d79-9074-d990ba21d10c de94bba4-06d1-4d40-a16a-bfd50179d6ac
├─sda2          100M vfat              64EE-A907                                     6ef6e12c-3858-4a83-a1dd-8297719bd477 c12a7328-f81f-11d2-ba4b-00a0c93ec93b
├─sda3           16M                                                                 1b6ba39a-e528-4cf9-b158-cd1a9312afc2 e3c9e316-0b5c-4db8-817d-f92df00215ae
├─sda4        117.2G ntfs              8E6008B56008A655                              c2f2d5bf-16a3-4e99-a6db-2385b36f3f46 ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
├─sda5         58.6G ntfs              F6D0CCD7D0CC9EED                     Storage  c10e8d39-26c3-4d3b-8548-0aa97816ba0b ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
├─sda6          477M swap              74da5edc-3b6c-4644-a151-6b93562c8fa4          408e91bd-c7e7-4ab8-a2ac-bb2bb7fde375 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
│ └─cryptswap 476.5M swap   [SWAP]     2d2336c7-64c1-4d53-8e99-f66f9b93bef5                                               
├─sda7          600M vfat   /boot/efi  7565-8082                                     a8c1ff00-3790-4ca0-a360-642e6f1859f0 c12a7328-f81f-11d2-ba4b-00a0c93ec93b
└─sda8           61G ext4   /          d40fe3bd-0749-4c29-9e9b-97a064a659dd          8a3b8567-c511-48cd-a3fa-776b556d17da 0fc63daf-8483-4772-8e79-3d69d8477de4
  • 分区1-4是由windows创建的,引导加载程序位于sda2.
  • 分区5是我为了方便在windows/linux之间共享文件而创建的。
  • 其余分区由 pop-os 创建(完成 Windows 安装后),pop-os 引导加载程序位于sda7.

我安装 grub 为:

$ sudo apt install grub-efi
$ sudo grub-install --bootloader-id=grub
Installing for x86_64-efi platform.
Installation finished. No error reported.
$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-7642-generic
Found initrd image: /boot/initrd.img-5.4.0-7642-generic
Found linux image: /boot/vmlinuz-5.4.0-7634-generic
Found initrd image: /boot/initrd.img-5.4.0-7634-generic
Found linux image: /boot/vmlinuz-5.4.0-7629-generic
Found initrd image: /boot/initrd.img-5.4.0-7629-generic
Found linux image: /boot/vmlinuz-5.4.0-7626-generic
Found initrd image: /boot/initrd.img-5.4.0-7626-generic
Found Windows Boot Manager on /dev/sda2@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings
done

之后我的/boot目录如下所示:

$ sudo tree -a /boot
/boot
├── config-5.4.0-7626-generic
├── config-5.4.0-7629-generic
├── config-5.4.0-7634-generic
├── config-5.4.0-7642-generic
├── efi
│   ├── c0cc91f7cdfcb9a597d9db525eb08842
│   ├── EFI
│   │   ├── BOOT
│   │   │   └── BOOTX64.EFI
│   │   ├── Linux
│   │   ├── grub
│   │   │   ├── grub.cfg
│   │   │   └── grubx64.efi
│   │   ├── Pop_OS-d40fe3bd-0749-4c29-9e9b-97a064a659dd
│   │   │   ├── cmdline
│   │   │   ├── initrd.img
│   │   │   ├── initrd.img-previous
│   │   │   ├── vmlinuz.efi
│   │   │   └── vmlinuz-previous.efi
│   │   └── systemd
│   │       └── systemd-bootx64.efi
│   ├── loader
│   │   ├── entries
│   │   │   ├── Pop_OS-current.conf
│   │   │   └── Pop_OS-oldkern.conf
│   │   ├── loader.conf
│   │   └── random-seed
│   └── System Volume Information
│       ├── AadRecoveryPasswordDelete
│       └── ClientRecoveryPasswordRotation
├── grub
│   ├── fonts
│   │   └── unicode.pf2
│   ├── grub.cfg
│   ├── grubenv
│   └── x86_64-efi
│       ├── acpi.mod
|       < files omitted ... > 
│       └── zstd.mod
├── initrd.img -> initrd.img-5.4.0-7642-generic
├── initrd.img-5.3.0-7642-generic
< files omitted ... > 
├── initrd.img.old -> initrd.img-5.4.0-7634-generic
├── System.map-5.4.0-7626-generic
< files omitted ... > 
├── vmlinuz -> vmlinuz-5.4.0-7642-generic
├── vmlinuz-5.4.0-7626-generic
< files omitted ... > 
└── vmlinuz.old -> vmlinuz-5.4.0-7634-generic

16 directories, 314 files

/boot/efi/EFI/grub/boot/efi/EFI/BOOT和下的文件/boot/grub是由 新增的grub-install

另外,这对我来说看起来不错:

$ cat /boot/efi/EFI/grub/grub.cfg 
search.fs_uuid d40fe3bd-0749-4c29-9e9b-97a064a659dd root hd0,gpt8 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

重新启动后,我按 F2 并设法添加EFI/grub/grubx64到启动顺序的顶部。 在此输入图像描述

保存并退出后,我进入 grub 提示符。

然后,使用该set命令我会看到以下输出(省略了一些条目):

grub> set
cmdpath=(hd0,gpt7)/EFI/grub
grub_cpu=x86_64
grub_platform=efi
prefix=(hd0,gpt7)/EFI/ubuntu
root=(hd0,gpt7)

我现在迷路了,似乎加载了正确的引导加载程序(cmdpath=(hd0,gpt7)/EFI/pop),但中的设置EFI/grub/grub.cfg完全被忽略。这些不正确的设置从哪里来?

prefix如上所述修复后,我得到了一个功能齐全的 grub 菜单,其中包含 1. pop-os、2. pop-os 后备映像、3. windows 和 4. 启动设置的条目。我尝试了所有选项,它们都有效。

所以我设法启动到 popOs,efibootmgr -v告诉我:

$ efibootmgr -v
BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0003,0001,0002,0000,2001,2002,2003
Boot0000* Windows Boot Manager     HD(2,GPT,6ef6e12c-3858-4a83-a1dd-8297719bd477,0x109000,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)RC
Boot0001* systemd                  PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)/File(\EFI\systemd\systemd-bootx64.efi)A01 ..
Boot0002* HDD0: HFS256G39TND-N210A PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)RC
Boot0003* grub                     PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)/File(\EFI\grub\grubx64.efi)A01 ..
Boot0004* EFI USB Device           RC
Boot0005* EFI DVD/CDROM            RC
Boot0006* EFI Network              RC
Boot2001* EFI USB Device           RC
Boot2002* EFI DVD/CDROM            RC
Boot2003* EFI Network              RC

我期望会发生什么

  1. (hd0,gpt7)/EFI/grub/grub.efi我从 UEFI 固件启动 grub 。
  2. grub 读取 处的配置文件(hd0,gpt7)/EFI/grub/grub.cfg。这会将 设置root(hd0,gpt8) 并将prefix设置为(hd0,gpt8)/boot/grub
  3. grub 在 处加载配置(hd0,gpt8)/boot/grub/grub.cfg
  4. grub 向我提供了一个菜单,我选择要加载的操作系统并继续我的一天。

实际发生了什么

  1. (hd0,gpt7)/EFI/grub/grub.efi我从 UEFI 固件启动 grub 。
  2. 幼虫才不是读取位于 的配置文件 (hd0,gpt7)/EFI/grub/grub.cfg。相反,它设置root(hd0,gpt7)prefix(hd0,gpt7)/boot/ubuntu

    我按照上面的描述手动修复了错误prefix
  3. grub 在 处加载配置(hd0,gpt8)/boot/grub/grub.cfg
  4. grub 向我提供了一个菜单,我选择要加载的操作系统并继续我的一天。

我尝试过的事情:

  • 禁用安全启动(没有区别)
  • 重新运行grub-install并且upgrade-grub(没有区别)
  • sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --recheck --debug /dev/sda &> grub.log(没有不同,在这里输出

答案1

grubx64.efi生成时,可以在其中嵌入grub-mkimage一个默认值。prefix

在 Debian 中,这被设置/EFI/debian为何时grub-mkimage被调用grub-install;在 Ubuntu 中,前缀/EFI/ubuntu分别是。这会导致 GRUB 首先读取位于 的迷你配置文件/EFI/(debian|ubuntu)/grub.cfg,该文件通常只包含几行,用于将 GRUB 重定向到/boot目录/文件系统所在的位置,然后从那里读取真正的配置文件:

<any configuration lines required to cover complications like software RAID, disk encryption or LVM>
search.fs_uuid <UUID of the filesystem that contains /boot>
set prefix=($root)'/boot/grub' # or just ($root)/grub if /boot is a separate filesystem 
configfile $prefix/grub.cfg

如果您使用 Pop!OS 的 GRUB 软件包,如果 Pop 的打包者没有给予足够的重视,它的grub-install/默认值中可能有类似的遗留“ubuntuism” 。grub-mkimage而且由于 Pop 的默认 UEFI 引导加载程序似乎是 gutmiboot 而不是 GRUB,因此这样的错误可能不会被注意到。

如果您已经安装了grub-efi-amd64-signed安全启动兼容性软件包,那么您的原始软件包/boot/efi/EFI/pop/grubx64.efi实际上可能与 不同/boot/grub/x86_64-efi/grub.efi,因为前者已经完成了安全启动签名过程,并且通常内置了所有 GRUB 模块。

也许 Pop!OS 开发人员grub-efi-amd64-signed按原样使用 Ubuntu 的软件包,而没有应用他们对非 SecureBoot 签名版本所做的更改?


背景:

grub-install与该选项一起使用时--uefi-secure-boot,或者如果检测到安全引导,则它不会使用为要安装的系统grub-mkimage构建优化的grubx64.efiGRUB,而是使用预编译和安全引导签名的/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed.

至少在 Debian 中,这是使用可重现的构建技术构建的,因此使用相应版本的源代码包和分离的安全启动签名文件,任何人都可以自己编译它并验证结果与预构建的结果完全相同版本。得到部分工作正常显然是 Debian 花了一段时间才获得安全启动支持的主要原因。

答案2

该问题的确切原因尚不完全清楚,但可能与 popOs 维护者错误配置的 grub 软件包有关。

grub-install我设法通过将创建的 grub 文件复制到 来解决这个问题/boot/efi/EFI/ubuntu。如果您使用的是 popOs 并且grub-install没有任何选项,那么以下操作应该有效:

sudo mv /boot/efi/EFI/pop /boot/efi/EFI/ubuntu

我尚未测试的另一种解决方法是:

sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/pop/grubx64.efi

欲了解更多信息,请参阅错误报告

答案3

引自萨姆·德迈耶回答,

我尚未测试的另一种解决方法是:

sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/pop/grubx64.efi

从efi 分区(我的操作系统上的那个分区处于打开状态)使得 GRUB 的主题无法使用grub.efi,即使我已经通过配置应用了它。而是使用默认的蓝色 grub 主题。/boot/grub/x86_64-efi/boot/efi/EFI/neon/grubx64.efi/etc/default/grubGRUB_THEME

我要解决的解决方案保持我的主题作品的问题只是将其复制/boot/efi/EFI/neon/grub.cfg/boot/efi/EFI/ubuntu/grub.cfg

sudo cp /boot/efi/EFI/neon/grub.cfg /boot/efi/EFI/ubuntu/grub.cfg

在此之前,您应该sudo grub-install先跑步。

相关内容