好吧,让我解释一下。这是一台 UEFI 计算机。它有两个磁盘。主磁盘使用 GPT 进行分区,并通过 GRUB2 引导至 Arch Linux 分区。辅助磁盘使用 MBR 进行分区,并且仅当我在 UEFI 设置实用程序中禁用主磁盘时才会启动。辅助磁盘有一个包含 Windows 10 的分区。我的问题是如何将菜单项添加到引导辅助磁盘上的 Windows 10 分区的主 GRUB2 配置中?我尝试grub-mkconfig
过os-prober
,但无法找到 Windows 10 安装。 Windows 10 安装显然没有任何问题,因为它可以自行启动。然后我尝试手动将各种菜单项添加到 grub.cfg 但它们不起作用。以下是我尝试过的一些条目。
menuentry "Windows 10 (loader) (on /dev/sda3)" {
insmod part_msdos
insmod ntfs
insmod ntldr
ntldr (hd0,msdos3)/bootmgr
}
menuentry "windows 10 (loader) (on /dev/sda3) 2" {
insmod part_msdos
insmod ntfs
chainloader (hd0,msdos3)+1
}
menuentry "Windows 10 (loader) (on /dev/sda3) 3" {
insmod part_msdos
insmod ntfs
chainloader (hd0,msdos3)/Windows/Boot/EFI/bootmgfw.efi
}
最成功的是最后一个,它显然引导到 EFI FW 程序,但给出了 BCD 错误(正常引导时不存在)。
答案1
您无法从 UEFI 启动以 MBR 模式安装的 Windows。时期。
你不得不
- 在某处获取 Windows UEFI 启动文件,将它们解压到
/boot/efi/EFI/Microsoft/Boot
- 重新创造
BCD
- 删除所有条目
HKEY_LOCAL_MACHINE\System\MountedDevices
这可能会使您的 Windows 可启动。
答案2
最小工作示例
我的系统:
/dev/sda has a old windows 10 install on a MBR partition table
/dev/sdb has a gpt layout with grub and arch
--/dev/sdb1 efi system partition (esp) --this should be your main esp
通常,如果您启动到 Windows,Windows 启动管理器会在 MBR 中查找 Windows 分区的开头。如果您想从 grub uefi 启动,您需要指定 windows 分区开头的相应 uefi 启动项。
生成 UEFI 启动文件
由于 Windows 位于 MBR 上,因此目前没有此类文件。要生成它,您可以使用 bcdboot[1] 在命令中。确保你的主esp(这里是arch efi系统分区)安装在windows中(这里我们将\dev\sdb1安装在字母X上,例如windows磁盘管理工具或cmd中的diskpart[note1]。注意\dev\sdb1不使用磁盘 /dev/sdb)
bcdboot C:\Windows /s X: /f windows-uefi
在本例中我们使用 bcdboot1获取有关我们的 Windows 分区 (C:\Windows) 的所有相关启动信息,并生成一个名为 windows-uefi (/f windows-uefi) 的文件,其中包含我们的 efi 系统分区所在驱动器上的所有信息 X (/s X :) 看 [1] 以供参考。
注意1:当然,您可以在任何您喜欢的地方生成该文件,然后复制它。有趣的是 os-prober 会搜索所有 efi 系统分区。这就是为什么它可以第一时间找到 Windows gpt/uefi 安装。
更新 grub
由于您使用的是 arch,所以没有像 debian 中那样的 update-grub。您必须使用以下命令手动执行此操作:
# grub-mkconfig -o /boot/grub/grub.cfg
如果您的配置文件位于标准位置。请参阅维基百科了解更多细节和边缘情况。确保您正在运行 os-prober。再次查阅 wiki 以确保这一点。它应该检测我们之前创建的 windows-uefi 文件并将其添加到启动项。
注意2:# 表示您需要提升权限,因此请使用 sudo 执行,或者 - 如果您知道自己在做什么 - 以 root 身份执行。
轶事
当我给自己升级硬件时,我搜索了这个方法,因为我懒得重新安装Windows。从那时起,它就一直像魅力一样发挥作用。最好的部分:现在我允许安装 Windows 11,因为 Windows 检测到它已在 uefi 模式下启动,即使它仍然是 MBR 安装 xD
来源
答案3
UEFI引导到GRUB,然后GRUB找到Windows分区并加载Windows加载程序。所以,理论上,即使Windows是MBR,它也应该可以工作,因为GRUB不使用MBR,GRUB直接将加载程序定位在C分区中。
尽量不要使用 hd0,但是这样:
搜索 --set=root --fs-uuid 12345678-1234-1234-1234-1234567890
ntldr /bootmgr
--fs-uuid 之后使用真实的 uuid
在 Windows 命令行中使用它来查找 uuid
wmic 音量获取 Driveletter、DeviceID