如何在使用 GPT/UEFI GRUB 的系统上的 MBR 分区磁盘上启动 Windows 10 分区?

如何在使用 GPT/UEFI GRUB 的系统上的 MBR 分区磁盘上启动 Windows 10 分区?

好吧,让我解释一下。这是一台 UEFI 计算机。它有两个磁盘。主磁盘使用 GPT 进行分区,并通过 GRUB2 引导至 Arch Linux 分区。辅助磁盘使用 MBR 进行分区,并且仅当我在 UEFI 设置实用程序中禁用主磁盘时才会启动。辅助磁盘有一个包含 Windows 10 的分区。我的问题是如何将菜单项添加到引导辅助磁盘上的 Windows 10 分区的主 GRUB2 配置中?我尝试grub-mkconfigos-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。时期。

你不得不

  1. 在某处获取 Windows UEFI 启动文件,将它们解压到/boot/efi/EFI/Microsoft/Boot
  2. 重新创造BCD
  3. 删除所有条目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

来源
  1. https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/bcdboot
  2. https://askubuntu.com/questions/447686/how-to-boot-windows-8-from-a-legacy-mbr-partition-in-uefi-mode-via-grub
  3. https://wiki.archlinux.org/title/GRUB
  4. https://wiki.archlinux.org/title/GRUB#Windows

答案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

相关内容