请稍侯

windows menuentry 的两种写法

10 January 2024

Windows menuentry 的两种写法

以下两个 menuentry 是用于引导加载程序(如 GRUB)的配置文件,用于启动 Windows 操作系统的菜单项。

第1种

menuentry "Windows" {
    insmod ntfs
    set root=(hd0,X)
    chainloader +1
}

# 或

menuentry 'Windows 10 (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-3022DA4B125A1D42' {
	insmod part_msdos
	insmod ntfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  3022DA4B125A1D42
	else
	  search --no-floppy --fs-uuid --set=root 3022DA4B125A1D42
	fi
	parttool ${root} hidden-
	drivemap -s (hd0) ${root}
	chainloader +1
}

第1种第1个 menuentry:

  • 名称为 "Windows" 的菜单项。
  • 使用 insmod ntfs 加载 ntfs 模块,以便支持 NTFS 文件系统。
  • 使用 set root=(hd0,X) 设置根目录为硬盘的第一个分区(hd0)的第 X 个分区。
  • 使用 chainloader +1 加载 Windows 操作系统的引导加载程序(通常是 ntldr 或 bootmgr)。

第1种的第2个 menuentry

  • menuentry 'Windows 10 (on /dev/sda1)': 这是菜单项的名称,显示在 GRUB 菜单中。
  • --class windows --class os: 这是菜单项的类别,用于分类和样式化。
  • $menuentry_id_option 'osprober-chain-3022DA4B125A1D42': 这是菜单项的唯一标识符,用于识别操作系统。

接下来是 menuentry 中的命令:

  • insmod part_msdos: 加载 part_msdos 模块,以支持 MBR 分区表。
  • insmod ntfs: 加载 ntfs 模块,以支持 NTFS 文件系统。
  • set root='hd0,msdos1': 将 /dev/sda1 分区设置为根分区。

然后是条件语句:

  • if [ x$feature_platform_search_hint = xy ]: 检查是否支持平台搜索提示。
  • search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 3022DA4B125A1D42: 如果支持平台搜索提示,则搜索指定 UUID 的分区,并设置为根分区。搜索提示提供了 BIOS、EFI 和裸机(baremetal)的搜索选项。
  • else: 如果不支持平台搜索提示,则执行以下命令。
  • search --no-floppy --fs-uuid --set=root 3022DA4B125A1D42: 搜索指定 UUID 的分区,并将其设置为根分区。

其他命令包括:

  • parttool ${root} hidden-: 将根分区的隐藏标志位清除,以确保分区可见。
  • drivemap -s (hd0) ${root}: 映射 (hd0) 到根分区,以便后续的 chainloader 命令可以正确加载。
  • chainloader +1: 加载 Windows 10 操作系统的引导加载程序。

第2种

menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' --class windows --class os $menuentry_id_option 'osprober-efi-3876-F8BB' {
    insmod part_gpt
    insmod fat
    search --no-floppy --fs-uuid --set=root 3876-F8BB
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

第2种 menuentry:

  • 名称为 "Windows Boot Manager (on /dev/nvme0n1p1)" 的菜单项。
  • 通过 insmod part_gpt 加载 GPT 分区表模块。
  • 通过 insmod fat 加载 fat 模块,以便支持 FAT 文件系统。
  • 使用 search --no-floppy --fs-uuid --set=root 3876-F8BB 在文件系统中搜索具有 UUID “3876-F8BB” 的分区,并将其设置为根分区。
    • search: 这是 GRUB 的命令,用于在文件系统中搜索分区。
    • --no-floppy: 这是一个选项,告诉 GRUB 不要搜索软盘驱动器。
    • --fs-uuid: 这是一个选项,指示 GRUB 使用分区的 UUID 进行搜索。
    • --set=root: 这是一个选项,指示 GRUB 将搜索到的分区设置为根分区。
    • 在这个 search 命令中,3876-F8BB 是一个示例分区的 UUID。UUID(Universally Unique Identifier)是一个唯一标识符,用于在文件系统中标识不同的分区。你需要将 3876-F8BB 替换为你要搜索的具体分区的 UUID
  • 使用 chainloader /EFI/Microsoft/Boot/bootmgfw.efi 加载 Windows Boot Manager 的引导程序(bootmgfw.efi)。

如果第2种方式启动不了,尝试直接设置root分区,并指定引导程序的路径,如下:

menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' {
	insmod part_gpt
	insmod fat
	set root=(hd0,1)
	chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

更新grub,并重启

update-grub
reboot

如果通过search UUID的查到的是多个分区,可以挂载那个正确的引导分区后,在上面创建一个特定的文件,然后通过 search file 的方式找出来并设置root, 如下引导EXSi的设置 search --file --set=root /exsi8.md, 其中exsi8.md是自定义创建的的标识文件,用来根据此文件名找到这个启动分区:

menuentry "EXSi 8.0" {
	insmod part_gpt
	insmod fat
	# set root=(hd2,1)
	# search --no-floppy --fs-uuid --set=root 56BB-1C70
	search --file --set=root /exsi8.md
	chainloader /EFI/BOOT/BOOTx64.EFI
}