将 Windows 10 添加到 Grub2 引导加载程序

将 Windows 10 添加到 Grub2 引导加载程序

我通过修改 40_custom 并添加以下内容完成了将 Windows 添加到引导加载程序选项的常规步骤:

menuentry "Windows 10" {
     insmod part_gpt
     insmod chain
     set root='(hd0,msdos2)'
     chainloader +1
     }

但是,当我在引导加载程序中选择 Windows 时,它显示“错误:签名无效。按任意键继续”。我不知道为什么我会收到此错误。我该如何修复它?编辑:它说这里有语法错误,但我看不到任何错误。 if [ "${grub_platform}" == "pc" ]; then menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS/MBR" { insmod part_msdos insmod ntfs insmod search_fs_uuid insmod ntldr
search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXXXXXXXXXXXXXX ntldr /bootmgr } fi

EDIT2: sudo fdisk -l 的输出

~$ sudo fdisk -l
Disk /dev/sda: 298.1 GiB, 320072933376 bytes, 625142448 sectors
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: 0x71b1e4fb

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1              63     80324     80262  39.2M de Dell Utility
/dev/sda2  *    223580160 286285823  62705664  29.9G 83 Linux
/dev/sda3        30801920 223580159 192778240  91.9G  7 HPFS/NTFS/exFAT
/dev/sda4       286287870 625141759 338853890 161.6G  5 Extended
/dev/sda5       571742208 573741055   1998848   976M 82 Linux swap / Solaris
/dev/sda6       573743104 625141759  51398656  24.5G 83 Linux
/dev/sda7       286287872 345180159  58892288  28.1G 83 Linux

Partition table entries are not in disk order.


Disk /dev/sdb: 7.5 GiB, 8004829184 bytes, 15634432 sectors
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: 0x037cbc77

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1  *     2048 15634431 15632384  7.5G  c W95 FAT32 (LBA)

答案1

您似乎遵循了旧指南,希望 Windows 使用 MBR 分区。

“无效签名”错误表明安全启动已启用。启用安全启动后,所有引导加载程序都必须使用私钥进行签名,并且固件 NVRAM 中的安全启动变量中必须包含匹配的公钥。 GRUB 正在尽职尽责地读取您指定的分区的第一个扇区,但由于它不包含适当的安全引导签名,因此固件拒绝执行它。

安全启动需要本机 UEFI 样式启动作为先决条件。您也许可以在系统上禁用安全启动,但由于 GRUB 已经为您启动,因此可能不需要这样做。

insmod part_gpt建议您期望磁盘具有 GPT 风格的分区,通常与 UEFI 引导风格一起使用,但另一方面,set root=(hd0,msdos2)期望有 MBR 分区。

在我使用 GPT 分区的 Debian 系统上,该set root行显示:set root='hd0,gpt1'。如果您的系统使用 GPT 分区,请使用gptN分区标识符而不是msdosN.

chainloader +1告诉 GRUB 从分区的第一个块读取引导块;在UEFI本机启动中,没有这样的事情。要在 UEFI 模式下启动 Windows,该set root行应指向包含 Windows 引导加载程序的 EFI 系统分区,并且 chainloader 行应为chainloader /EFI/Microsoft/Boot/bootmgfw.efi

答案2

您可以通过编辑/etc/grub.d/40_custom.如果该文件已经是工作配置的条目,请更改40为 /etc/grub.d/ 中尚未使用的另一个数字 [首先加载较低的数字]。如果您正在编辑现有的配置文件,进行备份!

我曾经Grub-Customizer添加新的 grub 配置。它自动生成的条目不起作用,因此我根据 telcoM 的建议将其编辑为自定义脚本。

这是我的40_custom文件。

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Windows 10 (loader)"{
    insmod part_gpt
    search --no-floppy --set=root --fs-uuid 109C-D028
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

然后,运行ubdate-grub

您可以禁用任何不使用(但想要保存)的配置条目,使用chmod -x /path/to/file+x来启用它。这会将它们保留在应有的位置,同时将其从 GRUB2 菜单中隐藏起来。


有关我的系统的一些相关信息: 运行 Arch Linux(2019 年 3 月)和 Windows 10,每个都在自己单独的驱动器上。每个都有 GPT。显然,如果在 UEFI 中运行,GRUB2 将不会加载 BIOS 分区(如果在 BIOS 模式下启动,则不会加载 UEFI 磁盘)。

答案3

您应该安装os-prober并运行一次

sudo apt-get install os-prober
sudo os-prober

生成grub配置文件

sudo grub-mkconfig -o /boot/grub/grub.cfg

不要手动编辑文件

相关内容