我正在尝试为 UEFI Windows/Linux 多重引导设置构建自定义 grub 菜单。我已经通过 USB 驱动器成功测试了菜单,其中包含:
/EFI/boot/BOOTX64.EFI
/grub/grub.cfg
/grub/x86_64-efi/*
…etc.
从该驱动器启动时,我可以毫无问题地访问菜单。接下来,我将 grub 转移到我的 PC 的 EFI 系统分区:
/boot/grub/bootx64.efi
/boot/grub/grub.cfg
/boot/grub/x86_64-efi/*
…etc.
该分区上还有 Windows 的引导加载程序,采用/EFI/Microsoft/boot
.
最后,我使用 Windows 实用程序 BOOTICE(或只是系统 BIOS)来添加\boot\grub\bootx64.efi
.我重新启动,grub 出现了。
...除了没有调出菜单之外,我最终得到了救援提示。我的假设是我只是将 grub.cfg 和模块放在错误的位置 - 然而,真正奇怪的是它ls
没有显示分区 - 只是(hd0) (hd1)
。我的期望是诸如(hd0) (hd0,msdos1)
等之类的东西 - 但 grub 救援似乎根本无法在ls
任何分区上进行。 ls (hd0)
两者ls (hd1)
都会产生“文件系统未知”。
我的系统包含一个物理磁盘,带有分区:
1 = EFI system partition (fat32)
2 = Veracrypted partition (with Windows installation)
3 = Veracrypted partition (data)
4 = Linux swap
5 = Linux root
6 = Linux home
为什么 grub 能够从 EFI 系统分区启动 - 但随后无法看到该分区或任何其他分区?更重要的是,如何才能像 USB 一样从内部驱动器获取其菜单?
答案1
ls (hd0)
意味着您正在尝试将整个磁盘作为单个文件系统进行访问;如果磁盘以任何方式分区,则该消息(hd0): Filesystem is unknown.
是正常的且符合预期。
相反,只需输入ls (hd0
没有右括号,然后按 TAB 键。如果 GRUB 可以识别分区类型,那么它应该列出 GRUB 已知的分区及其文件系统类型。
您的问题可能是 GRUB 期望其配置文件位于 中<partition root>/grub/grub.cfg
,而不是位于 中<partition root>/boot/grub/grub.cfg
,模块目录也是如此。
GRUBbootx64.efi
文件包含 GRUB 核心映像,以及一些可选的 GRUB 模块。如果这组嵌入式模块不包含part_gpt
,GRUB 将无法识别 GPT 分区表,这将导致无法访问包含其余 GRUB 模块的文件系统。这可能是进入 GRUB 救援模式的另一个可能原因。
答案2
感谢 telcoM 关于 bootx64.efi 中嵌入式模块的信息,我能够找到解决方案:基本上,grub-install
我必须明确地grub-install
直接复制到内部系统分区,而不是复制 USB 记忆棒上的所有 grub 文件。
据推测,当 grub-install 在 USB 记忆棒上运行时,它发现它是一个 MBR 分区设备,并且没有在 bootx64.efi 中嵌入 part_gpt 模块,这就是为什么它无法识别任何内部分区 - 而当grub-install 直接在内部磁盘上运行,它看到 GPT 并嵌入该模块。无论哪种情况,解决方案都不是从 USB 记忆棒复制 grub 文件,而是直接将 grub 安装到内部分区。
答案3
我遇到了由 msdos 分区引起的内核错误,它导致我的计算机说找不到磁盘,只能启动到 grub。在 grub 中,我运行了 ls 命令,但没有列出任何内容。这是我为让 ls 显示列表所做的事情......
Go to your grub command line type:
set root=ls ; Hit enter
然后再次运行 ls 命令,所有分区将被列出。如果您遇到 msdos 内核错误,这将有所帮助,您将能够找到并修复 msdos 分区导致 grub 失控的损坏分区。