GRUB2 可以和 Windows 共享 EFI 系统分区吗?

cra*_*150 33 dual-boot windows grub2 gpt uefi

我有一个现有的 Windows 7 GPT 安装,它已经有一个 EFI 系统分区。

我现在正在尝试在单独的硬盘上安装 Linux,该硬盘也是 GPT 格式。我没有找到任何可以在没有 EFI 系统分区的情况下启动 grub 的工作方法,所以我的问题是:

grub2 是否可以使用与 Windows 相同的 EFI 系统分区?我如何告诉 grub2 使用它?

澄清我的设置:

gpt /dev/sda:
    1 EFI System partition created by windows (100MB)
    2 "Microsoft reserved partition" (200MB)
    3 Windows root (rest of disk)

gpt /dev/sdb:
    # After answering my own question: this partition is not needed
    1 boot partition containing grub, kernels etc.(32MB)
    2 crypto LVM partition (rest of disk)
Run Code Online (Sandbox Code Playgroud)

我希望 grub2 使用现有的/dev/sda1EFI 分区。

PS:我的主板支持 EFI。

cra*_*150 25

经过一天的研究,我现在可以回答我自己的问题:是的,这是可能的,您甚至可以将该分区用作 /boot 并存储您的内核/initramfs/etc。那里。

要求:

  • Grub >= 2.00(1.98 和 1.99 不起作用)
  • Grub 必须从 Linux 内核安装,该内核支持 EFI 变量(CONFIG_EFI_VARS在模块中编译或作为模块编译efivars
  • 要创建 EFI 引导条目,您需要 efibootmgr

设置:

首先将您的 EFI 分区挂载到 /boot

mount /dev/sdX1 /boot
Run Code Online (Sandbox Code Playgroud)

如果您查看挂载条目,您会发现它只是一个 FAT(32) 分区。在/boot你应该找到一个目录efi

由于 grub 将调用efibootmgr,您应该加载evivars,如果它未编译到内核中:

modprobe efivars
Run Code Online (Sandbox Code Playgroud)

现在你可以安装 grub:

# Replace x86_64 with i386 for 32 bit installations
grub2-install --target=x86_64-efi
Run Code Online (Sandbox Code Playgroud)

Grub 像往常一样将其文件安装到/boot/grub2. 如果一切正常,您现在应该还有一个文件夹/boot/efi/grub2/boot/efi/<name_of_your_distro>. 有了--bootloader-id=insert_name_here你还可以指定自己的文件夹名称。

Grub 会efibootmgr自动调用并在 EFI 引导菜单中创建一个具有该名称的引导条目(在我的情况下,这意味着它在 EFI 菜单中显示为可引导设备,不确定是否在每个 EFI 板上都是这种情况)

进一步的设置与通常的 grub2 设置没有什么不同,grub2-mkconfig会将适用于 EFI 的模块添加到您的grub.cfg.

链式加载窗口:

当我要求使用 Windows 进行双启动时,我将包含用于链式加载的 grub 配置:

在 EFI 上链式加载 Windows 安装与在 MBR 磁盘上加载略有不同。您将不需要ntfspart_mbr模块,而不是fatpart_gpt需要。

此外,不需要设置 root,此信息由 Windows 自己的启动管理器存储。而是指定search命令。它所需的参数可以由下式确定

grub-probe --target=hints_string /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
Run Code Online (Sandbox Code Playgroud)

这将为您提供指定 EFI 分区位置的搜索参数,它应该类似于:

--hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 1ce5-7f28
Run Code Online (Sandbox Code Playgroud)

chainloader您需要在 EFI 分区中设置 Windows 的 EFI 加载程序的路径,而不是告诉要读取的扇区数。这对于所有 Windows EFI 安装都是一样的。结果条目应如下所示:

menuentry "Microsoft Windows x86_64 UEFI-GPT" {
    insmod part_gpt
    insmod fat
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --no-floppy --set=root <insert ouput from grub-probe here>
    chainloader /efi/Microsoft/Boot/bootmgfw.efi
}
Run Code Online (Sandbox Code Playgroud)

资料来源:这些涵盖了更多情况,如果你想从 EFI 启动,它们值得一读: