我正在使用 grub2 对装有 Windows 10 和 PopOS 的笔记本电脑进行双启动。
问题是 grub 不显示操作系统选择菜单,而是直接进入 grub shell。如何配置/安装 grub2 以自动显示选择菜单?
我可以按如下方式手动加载 Grub 菜单,然后按预期运行,查看 popOS、高级 popOS、Windows、系统设置,甚至是我配置的自定义“关机”菜单项/etc/grub.d/40_custom
。
grub>set prefix=(hd0,gpt5)/boot/grub
grub>insmod normal
grub>normal
当检查 grub 加载的值时,问题似乎是所有路径都指向第一个分区(windows 引导加载程序),因此指向无处。
grub 启动的路径如下:
cmdpath=(hd0,gpt1)
prefix=(hd0,gpt1)/boot/grub
root=hd0,gpt1
gpt1
是 Windows 引导加载程序,所以我推测它正在寻找它的配置但没有找到它。
我尝试重新安装 grub 包,重新安装 grub,更新它并运行 ubuntu 启动修复工具,正如各种在线帖子中提到的类似问题所建议的那样(全部单独):
sudo apt install --reinstall grub-common grub-efi-amd64-bin grub-efi-amd64-signed grub-efi-amd64 grub2-common
sudo grub-install /dev/sda
sudo update-grub2
所有这些都有效并报告了成功但并没有改变任何事情。
我还检查了是否/boot/efi/EFI/pop/grub.cfg
设置了正确的值:
search.fs_uuid 1672afd3-3d1c-462d-9284-1f0d6b1e07e9 root hd0,gpt5
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
我的分区布局(德语):
Festplatte /dev/sda: 256GB
Sektorgröße (logisch/physisch): 512B/4096B
Partitionstabelle: gpt
Disk-Flags:
Nummer Anfang Ende Größe Dateisystem Name Flags
1 1049kB 106MB 105MB fat32 EFI system partition boot, esp
2 106MB 123MB 16,8MB Microsoft reserved partition msftres
3 123MB 202GB 202GB ntfs Basic data partition msftdata
5 202GB 256GB 53,2GB ext4
4 256GB 256GB 537MB fat32 boot, esp
我推测 grub2 位于分区 4 中。
我的 UEFI 显示 3 个启动选项,Windows 引导加载程序、Ubuntu 的 grub 以及仅启动 grub-shell 的硬盘。
安全启动也被禁用,否则 grub 将拒绝加载内核。
答案1
显然 OP 已经解决了他们的问题,但对于仍然发现此问题的人来说:
我遇到了一个非常类似的问题,我的$prefix
变量指向了错误的目录。我通过将文件移动grub.cfg
到 中定义的路径来解决这个$prefix
问题。在 pop-os 上,该路径位于/EFI/ubuntu
efi 分区上。
在启动的系统上在终端输入此命令:
sudo cp -r /boot/efi/EFI/pop /boot/efi/EFI/ubuntu
或者
sudo cp -r /boot/efi/grub /boot/efi/EFI/ubuntu
它的作用是:
grub.cfg
当 grub 启动时,它会在定义的路径 ( )处搜索文件$prefix
。在 pop-os 上,此路径通常/EFI/ubuntu
位于 grub 加载的分区上。当您启动系统时,efi 分区会自动挂载到/boot/efi
。因此,/
对于 grub 来说,这与您的操作系统相同/boot/efi/
。将文件移动到/boot/efi/EFI/ubuntu
可使 grub 在路径 处找到它/EFI/ubuntu
。
我希望这是合理的。这只是我的理解,我可能错了。
注意:当我ls -la /
在 grub 中执行此操作时,它将EFI
文件夹显示为efi
,这确实让我感到困惑。但显然 grub 并不真正关心大写字母。
答案2
好的,我明白了:
显然,我的 UEFI 不理解一个硬盘上的多个 EFI 分区,并且默认使用 Windows 创建的分区,这可能是因为安装了旧的 ubuntu,上面有 grub。
对于遇到类似问题的人,请确保您正在启动的启动映像确实是您想要的。通过set
在 grub shell 中执行并查看cmdline
参数来做到这一点。它会告诉您启动了哪个分区。