因此,我设法让我已有 17 年历史的 Intel Core2 Quad 在 Windows 98、XP、10 和 Debian 12 上运行。
我首先安装了 Windows 98,然后安装了 Windows XP。这导致出现 XP 启动菜单,其中提供了 XP 或 98。然后我安装了 Windows 10,这导致出现启动菜单,其中提供了 Windows 10 或“其他版本的 Windows”。如果我选择“其他版本”,我将获得 XP 引导加载程序。
然后,我在第四个也是最后一个主分区(无 UEFI)上安装了 Debian,该分区安装了 Grub2,并为我提供了条目 Debian 和“Windows 10(在 /dev/sda1 上)”。在 Grub2 中选择“Windows 10”会让我获得 Win10 引导加载程序等。但是,sda1 是 Win98,因此 Win10 必须自行安装在那里。但是,Grub2 又将自己安装到了哪里呢?
我实际上想要实现的是让所有四个条目都包含在 Grub2 中。我该怎么做才能实现这一点?os-prober 仅找到 Win10。
我可以毫无问题地查看和安装所有 Windows 分区。
最初,系统具有经典的 Windows 9x MBR 引导代码,以及 Windows 98 分区的分区引导记录 (PBR) 中的 DOS 样式 FAT32 引导代码 (
sda1
)。添加 XP 后,它必须用 Windows 2000/XP/2003 样式的 MBR 启动代码替换 Windows 9x MBR,因为
NTLDR
当在 XP 启动菜单中选择该操作系统时,XP 启动管理器 ( ) 可以执行 Windows 9x MBR 的工作。XP 的主分区 (sda2
我猜) 也会安装适当类型的 PBR(FAT32 NT5.0 类型或 NTFS 类型)。同样,在添加 Windows 10(到
sda3
?)后,MBR 代码再次被 Windows 7+ 风格的 MBR 启动代码取代,该代码调用 Windows 10 启动管理器(bootmgr
)。但是 Windows Vista 和更新版本会将其启动管理器放在与主系统分区不同的分区中。我猜你会
bootmgr
在 的根目录中找到一个名为 的文件sda1
;在 Windows 中,它可能具有隐藏/系统/只读属性,因此它通常是不可见的。因此,Windows 10 也可能sda1
用“NT6.0”样式的 FAT32 分区启动记录覆盖了 的 PBR。最后,安装 Debian 12 再次用 GRUB 替换了 MBR 代码。GRUB 的部分内容也将包含在 MBR 和第一个分区开头之间的间隙中,这通常只是未使用的空间,以满足分区对齐要求。
Windows 测试
os-prober
似乎需要挂载分区:如果您运行时未挂载 Windows 分区os-prober
,那么这可能是它们被忽略的原因。GRUB 的 BIOS 版本通过链式加载其 PBR 来启动 Microsoft 操作系统。因此,从 启动 XP
sda2
和从 启动 Windows 10应该没有问题。如果在挂载 Windows 分区的情况下运行不起作用,sda1
您可能需要将类似下面的内容添加到/etc/grub.d/40_custom
并运行:sudo update-grub
os-prober
不幸的是,由于 Windows 9x 的 PBR 不再位于
sda1
分区的第一个块中,因此它无法再像那样启动。但我想我记得 NTLDR 如何启动旧版本的 Windows:它将其他操作系统的 PBR 副本存储在 NTLDR 本身所在的磁盘上,使用类似
bootsect.dos
或 的名称。如果您阅读上的 Windows XP 文件,bootsect.w98
您应该会看到该文件的名称。BOOT.INI
sda2
了解了这一点,您可能希望将
bootsect.*
文件从 的根目录复制sda2
到sda1
,只是为了在您决定摆脱 Windows XP 时保护它(并且通常尽量减少不同 OS 分区之间的相互依赖性)。然后,您可以添加一个 GRUB 菜单项,如下所示:这应该从复制的文件中加载 Windows 9x PBR 的保存副本,从而允许 Windows 98 直接从 GRUB 启动。
不幸的是,如果不对 Windows 10 引导程序进行重大移植,您无法完全分离 Windows 98 和 Windows 10 的分区,这在 Unix&Linux StackExchange 上不是主题。(而且由于 Windows 10 声称具有“自我修复”功能,它可能会自行将其添加回去
sda1
。)