使用 grub2-gpt 启动非 EFI MS-DOS Windows 7 分区

dzi*_*ift 4 windows linux grub ubuntu uefi

我有以下设置:

  • UEFI华硕主板
  • GPT TABLE 和 Ubuntu/dev/sdb
  • MS-DOS 表、Windows 7 和 Linux Mint /dev/sda

我尝试从 Ubuntu 11.10 使用 grub2 启动 Windows 7 分区。

我的 Windows“系统保留”是/dev/sda3.

GRUB窗口项(标准):

menuentry "Windows 7 (loader) (on /dev/sda3)" --class windows --class os {
        insmod part_msdos
        insmod ntfs
        set root='(hd0,msdos3)'
        search --no-floppy --fs-uuid --set=root 644C5AC04C5A8CA4
        chainloader +1
}
Run Code Online (Sandbox Code Playgroud)

分离输出:

Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      32.3kB  296MB   296MB   primary   ext2
 2      296MB   423GB   423GB   extended
 5      296MB   20.3GB  20.0GB  logical   ext4
 6      20.3GB  363GB   342GB   logical   ext4
 7      363GB   423GB   60.1GB  logical   ntfs
 3      423GB   423GB   105MB   primary   ntfs         boot
 4      423GB   500GB   77.2GB  primary   ntfs


Disk /dev/sdb: 1500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name  Flags
 1      17.4kB  20.0MB  20.0MB  fat16                 boot
 2      20.0MB  50.9GB  50.9GB  ext4
 4      50.9GB  1103GB  1052GB  btrfs
 5      1103GB  1156GB  52.7GB  ext4
 6      1156GB  1233GB  77.2GB  ntfs
 7      1233GB  1233GB  105MB   ntfs
 3      1496GB  1500GB  4271MB  linux-swap(v1)
Run Code Online (Sandbox Code Playgroud)

尝试从 grub2 启动 Windows 后,我收到消息:

错误:无效的 EFI 文件路径

Jde*_*eBP 8

你不能这样做。

很明显,任何预引导应用程序,例如操作系统的引导加载程序,都与机器固件紧密耦合;就像一个普通的应用程序被绑定到它所使用的服务的操作系统上一样。EFI 引导加载程序不能在机器上运行,除非该机器提供 EFI 固件服务。除非该机器提供旧的 PC/AT 固件服务,否则旧的 PC/AT 样式引导加载程序无法在机器上运行。

chainloaderGRUB 中动词体现了这一点。它没有记录在案,但根据 GRUB 的托管方式,它会做不同的事情——即 GRUB 正在(预期)在什么机器固件上运行。在旧 PC/AT 系统上托管的 GRUB 版本上,它期望得到一个磁盘块集或文件,并以旧 PC/AT VBR 的方式加载和运行它所提供的(第一个扇区)引导程序。在 EFI 托管的 GRUB 版本上,它期望获得文件名,并像普通 EFI 应用程序一样加载和运行文件。

您拥有 EFI 托管的 GRUB 版本。您已作为文件名传递+1chainloader,但这根本不是预启动 EFI 应用程序映像文件的有效路径。GRUB 一直无法构建EFI 设备路径为映像文件,因为您为其提供了一个语法错误的路径。因此出现错误消息。

正确使用 chainloader在 EFI 托管的 GRUB 中命名文件。对于 Microsoft Windows NT 6.1,这将是与 EFI 系统分区上的 BCD 存储并存的 Microsoft 引导管理器的 EFI 版本:

chainload (hd1,gpt1)/EFI/Microsoft/Boot/bootmgfw.efi

当然,这对你不起作用,因为你要么没有在这台机器上安装 Windows NT 6.1——而是在其他机器上并将硬盘转移到这台机器上——或者没有安装它的 EFI-bootstrappable 版本,以某种方式说服 Windows NT 6.1 在您的 EFI 机器上运行其安装实用程序的非 EFI 版本。我怎么知道?因为Microsoft 不会让您像以前那样将它安装到 EFI 机器上的非 EFI 分区的硬盘上,而且因为您有一个合适的EFI 系统分区(第二个硬盘上的 FAT 分区)和它的当您只需要前者时,就相当于穷人

因此,Windows NT 6.1 尚未安装 EFI 托管版本的 Microsoft 启动管理器,BCD 存储位于错误的位置,并且还会存在其他几个问题 — 与 Windows NT 需要一个硬件/固件组合以及已经为此配置了适当的驱动程序和设置,然后突然在另一个硬件/固件组合上启动 - 稍后为您存储。