问题:
引导时,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
我期望会发生什么
(hd0,gpt7)/EFI/grub/grub.efi
我从 UEFI 固件启动 grub 。- grub 读取 处的配置文件
(hd0,gpt7)/EFI/grub/grub.cfg
。这会将 设置root
为(hd0,gpt8)
并将prefix
设置为(hd0,gpt8)/boot/grub
。 - grub 在 处加载配置
(hd0,gpt8)/boot/grub/grub.cfg
。 - grub 向我提供了一个菜单,我选择要加载的操作系统并继续我的一天。
实际发生了什么
(hd0,gpt7)/EFI/grub/grub.efi
我从 UEFI 固件启动 grub 。- 幼虫才不是读取位于 的配置文件
(hd0,gpt7)/EFI/grub/grub.cfg
。相反,它设置root
为(hd0,gpt7)
和prefix
到(hd0,gpt7)/boot/ubuntu
。
我按照上面的描述手动修复了错误prefix
。 - grub 在 处加载配置
(hd0,gpt8)/boot/grub/grub.cfg
。 - 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.efi
GRUB,而是使用预编译和安全引导签名的/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/grub
GRUB_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
先跑步。