让Linux GRUB直接运行多个Windows系统

让Linux GRUB直接运行多个Windows系统

使用 BIOS/Legacy 磁盘上的三重启动系统,我测试了一种解决方案来避免Windows 启动管理器由 Linux GRUB 触发的菜单(参见这里) 并使 Windows 系统直接从 GRUB 启动,而不经过 WBM。我发现 Windows 系统“先验地”需要 WBM,如果没有 (来源)。所以我寻找一种解决方案,让每个系统都有自己的 WBM,但我不知道如何实现这一点。我在网上搜索过,但没有找到一些相关信息。


提醒:我有一个完美运行的虚拟三重启动(在我的情况下:Windows 10 Home 21H1/Windows 7 Pro/Debian 11),我想让 GRUB 直接运行所有 Windows 系统,而无需将它们分组到运行 Windows 启动管理器的一个条目中。

对我而言有用的解决方法(感谢 Tom Yan;见下文)是在 Linux 系统上重新启动,更改第一个 Windows 分区的类型以防止第二个 Windows 分区看到它(见下文),重新启动,完全重新安装第二个 Windows 系统(我重新安装是因为我没有找到在已安装的系统上添加 WBM 的解决方案),关闭电源,在 Live 会话中启动(在我的情况下,我使用了 Clonezilla 工具),因为从全新安装的 WBM 无法访问 Linux 系统,最后撤消对第一个分区的类型修改(见下文),并在 Linux chrooted 环境中安装和更新 grub 以替换 MBR 的引导加载程序(也见下文)。

注意:因为我是法国人,所以我在一些命令前面添加了 LC_ALL=C(环境变量),并且一些返回的输出也是如此,我发现这个技巧很实用且优雅:)

要更改分区的类型:

root@host:~# LC_ALL=C fdisk -l
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf1e6f539

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1           2048 42008575 42006528   20G  7 HPFS/NTFS/exFAT
/dev/sda2  *    42008576 71710719 29702144 14.2G  7 HPFS/NTFS/exFAT
/dev/sda3       71710720 83884031 12173312  5.8G 83 Linux


Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcdb5e72f

Device     Boot Start     End Sectors  Size Id Type
/dev/sdb1  *        2 2097119 2097118 1024M  c W95 FAT32 (LBA)
root@host:~# LC_ALL=C fdisk /dev/sda

Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): t
Partition number (1-3, default 3): 1
Hex code or alias (type L to list all): L

00 Empty            24 NEC DOS          81 Minix / old Lin  bf Solaris        
01 FAT12            27 Hidden NTFS Win  82 Linux swap / So  c1 DRDOS/sec (FAT-
02 XENIX root       39 Plan 9           83 Linux            c4 DRDOS/sec (FAT-
03 XENIX usr        3c PartitionMagic   84 OS/2 hidden or   c6 DRDOS/sec (FAT-
04 FAT16 <32M       40 Venix 80286      85 Linux extended   c7 Syrinx         
05 Extended         41 PPC PReP Boot    86 NTFS volume set  da Non-FS data    
06 FAT16            42 SFS              87 NTFS volume set  db CP/M / CTOS / .
07 HPFS/NTFS/exFAT  4d QNX4.x           88 Linux plaintext  de Dell Utility   
...
Hex code or alias (type L to list all): 83

Changed type of partition 'HPFS/NTFS/exFAT' to 'Linux'.

Command (m for help): p
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf1e6f539

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1           2048 42008575 42006528   20G 83 Linux
/dev/sda2  *    42008576 71710719 29702144 14.2G  7 HPFS/NTFS/exFAT
/dev/sda3       71710720 83884031 12173312  5.8G 83 Linux

Command (m for help): w
The partition table has been altered.
Syncing disks.

要从实时会话撤消类型的修改:

root@CZ-LIVE:~# LC_ALL=C fdisk /dev/sda

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): t
Partition number (1-3, default 3): 1
Hex code or alias (type L to list all): L

00 Empty            24 NEC DOS          81 Minix / old Lin  bf Solaris        
01 FAT12            27 Hidden NTFS Win  82 Linux swap / So  c1 DRDOS/sec (FAT-
02 XENIX root       39 Plan 9           83 Linux            c4 DRDOS/sec (FAT-
03 XENIX usr        3c PartitionMagic   84 OS/2 hidden or   c6 DRDOS/sec (FAT-
04 FAT16 <32M       40 Venix 80286      85 Linux extended   c7 Syrinx         
05 Extended         41 PPC PReP Boot    86 NTFS volume set  da Non-FS data    
06 FAT16            42 SFS              87 NTFS volume set  db CP/M / CTOS / .
07 HPFS/NTFS/exFAT  4d QNX4.x           88 Linux plaintext  de Dell Utility   
...
Hex code or alias (type L to list all): 07

Changed type of partition 'Linux' to 'HPFS/NTFS/exFAT'.

Command (m for help): p
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf1e6f539

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1           2048 42008575 42006528   20G  7 HPFS/NTFS/exFAT
/dev/sda2  *    42008576 71710719 29702144 14,2G  7 HPFS/NTFS/exFAT
/dev/sda3       71710720 83884031 12173312  5,8G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

从 Linux 安装 GRUBchrooted现场会议的环境:

root@CZ-LIVE:~# lsblk -lo NAME,FSTYPE,LABEL,UUID
NAME FSTYPE LABEL   UUID
sda                 
sda1 ntfs   W10H    7A42F6E942F6A8D1
sda2 ntfs   W7P     964843B148438EC5
sda3 ext4           a696a4ab-3120-4028-bd87-c2aaa40499bd                 
...     
root@CZ-LIVE:~# mount /dev/sda3 /mnt/
root@CZ-LIVE:~# for f in /dev /proc /sys /run ; do mount -B $f /mnt$f ; done
root@CZ-LIVE:~# chroot /mnt/
root@CZ-LIVE:/# grub-install /dev/sda
Installation pour la plate-forme i386-pc.
Installation terminée, sans erreur.
root@CZ-LIVE:/# update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.10.0-19-amd64
Found initrd image: /boot/initrd.img-5.10.0-19-amd64
Found linux image: /boot/vmlinuz-5.10.0-16-amd64
Found initrd image: /boot/initrd.img-5.10.0-16-amd64
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and  
 create new boot entries.
Found Windows on /dev/sda1
Found Windows on /dev/sda2
done
root@CZ-LIVE:/# 
exit
root@CZ-LIVE:~# for f in /run /sys /proc /dev ; do umount -l /mnt$f ; done

注意:我们可以看到update-grub发现了两个 Windows 分区。

从此时,我们可以从 GRUB 菜单中看到所有 Windows 系统条目:

root@host:~# gawk '/^(menuentry|submenu)/ { printf '\
' gensub( /[^\x27]+\x27([^\x27]+)\x27.+/ , "\\1" , "g" ) ; '\
' uuid = gensub( '\
' /.+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}).*/ '\
' , "\\1" , "g" ) ; '\
' if ( uuid != $0 ) { printf " [" uuid "]" } printf "\n" }' \
  /boot/grub/grub.cfg
Debian GNU/Linux [a696a4ab-3120-4028-bd87-c2aaa40499bd]
Advanced options for Debian GNU/Linux [a696a4ab-3120-4028-bd87-c2aaa40499bd]
Windows 7 Pro (on /dev/sda2)
Windows 10 Home (on /dev/sda1)

注意:在此配置中我手动修改了/boot/grub/grub.cfg自定义标题条目,因为 GRUB“先验”没有解决方案来查看内部系统版本;此外,不建议在此处进行修改,因为它将被下一次更新 grub 覆盖,而是我们必须从/etc/grub.d/30_os-prober文件

就这些了 :D

对我来说,这是一个很好的解决方法,因为我认为可以添加 WBM 而不影响 Windows 分区上的数据,尤其是不必重新安装它。如果我找到一种更简单的方法来实现这一点或使其更加自动化,我会完成这篇文章。也许你有更好的方法?

答案1

假设是 UEFI 的情况,您需要确保 Windows 安装不共享一个 EFI 系统分区(ESP)。

如果您必须坚持使用正统/传统的 Windows 安装,则需要暂时​​“隐藏”现有 Windows 安装(以及 Linux 安装)的 ESP,例如,使用 或 将分区类型(GUID)更改为非 ESP 类型(即,除 之外的任何一个)C12A7328-F81F-11D2-BA4B-00A0C93EC93B。不过,请确保在新安装完成后将它们改回来,否则您可能会(以一种“永久”的方式)破坏现有安装的启动。fdiskgdisk

或者您可以避免使用 Windows 安装程序,而采用更“手动”的方式进行安装,即使用bcdbootdism

请注意,由于 Windows/WBM 具有主导性,因此每次启动任何安装时,EFI/Microsoft/Boot/bootmgfw.efi如果它注意到 WBM UEFI 启动条目未指向自身,它将(再次)将其注册到 UEFI 固件。在大多数(如果不是全部)UEFI 固件上,这将导致 WBM UEFI 启动条目成为启动顺序中的第一个(在更改条目指向哪个 WBM 之后)。因此,您需要EFI/Microsoft/Boot/bootmgfw.efi在每个 Windows ESP 上删除并改为使用 grub chainload EFI/Boot/bootx64.efi(这是不同路径上的相同文件)。(因此您可能还需要避免使用 os-prober,而是编写自己的 grub conf 或 grub conf 片段。)

更令人恼火的是,每次有累积更新时,Windows 都会“修复”ESP。因此,基本上,更新完成后,您必须像每个月一样对所有安装执行删除操作。(您需要通过进入 UEFI 启动菜单或 Windows 的高级启动来明确启动 grub,然后从 Linux 中删除该文件。)

对于 BIOS/旧版 Windows 安装,只需确保暂时隐藏所有现有 Windows 分区即可。(它们可能都有类型代码0x7,您只需将其更改为例如0x83,这会使 Windows 安装程序忽略它们。)

PS 如果您的机器有多个驱动器,并且您可以像每个驱动器(驱动器,而不是分区)一样拥有一个 Windows,那么您可能不必处理EFI/Microsoft/Boot/bootmgfw.efi上述麻烦,因为据我所知,当每个 WBM 位于不同的驱动器(再次强调,是驱动器,而不是 ESP)上时,大多数 UEFI 固件都支持多个 WBM UEFI 启动条目。在开始新安装之前,仍请确保隐藏 ESP。(Windows 安装程序将尽力让您的安装共享一个 ESP/WBM,即使它们不在同一驱动器上。)

相关内容