GRUB/EFI 示例

出自 ArchWiki

本文或本章节的事实准确性存在争议。

原因: 下面的许多示例表明,GRUB EFI 二进制文件 (grubx64.efi) 需要复制到特殊位置 (例如, esp/EFI/BOOT/bootx64.efi)。尽管这可能有效,但这只是备用文件名。其他选项也可能有效,例如使用 efibootmgrUEFI shell。(在 Talk:GRUB/EFI examples 中讨论)

众所周知,不同的主板制造商对 UEFI 的实现方式有所不同。此页面的目的是展示在 EFI 模式下安装/恢复 GRUB 时已知的硬件特定方法。

注意: 在整篇文章中,esp 表示 EFI 系统分区 (也称为 ESP) 的挂载点。

宏碁 (Acer)

Aspire V3-571G (可能也适用于其他 Aspire One 笔记本电脑)

由于最初仅随 Windows 7 出货,此笔记本电脑的某些变体仅具有部分 EFI 兼容性。此笔记本电脑的后续版本出货时具有更完整的 UEFI 兼容性。因此,如果 GRUB 放置在 Windows 引导加载程序二进制文件预期所在的位置 (esp/EFI/BOOT/bootx64.efi),则早期版本只能引导 GRUB。但是,二进制文件只能从启动菜单 (按键 F12) 手动引导,这可能是因为它缺少 Microsoft 签名。解决此问题的方法是升级到较新版本的系统固件,但是,由于某些原因,早期版本的机器被锁定而无法升级,因此该过程并非易事。

警告: 如果操作不当,可能会导致您的机器永久性无法运行!请谨慎操作。

可以采取以下步骤来绕过限制并升级到更高版本的固件

  • 宏碁 (Acer)[死链 2023-04-23 ⓘ] 宏碁 CDN 直链Archive.org 镜像 获取同一型号机器的不兼容 2.x 版本的 BIOS 固件。
  • 解压缩存档以获取刷写工具可执行文件 (例如 Q5WV1221.exe)。
  • 在您选择的十六进制编辑器中打开此可执行文件 (一个好的简单编辑器是 ghex)。
  • 在十六进制编辑器中搜索块标志 字符串 DisableSecureCapsuleFlash=1
  • 更改 ASCII 字符串,使其变为 DisableSecureCapsuleFlash=0 (即将最后一个字节从十六进制 31 更改为 30)。
  • 保存修改后的二进制文件。
  • 获取 FreeDOS 的副本,将其刷写到启动介质,并将修改后的二进制文件也放入启动介质中 (更多信息请参见 从 Linux 刷写 BIOS#FreeDOS)
  • FreeDOS 中运行修改后的二进制文件,并按照屏幕上的说明进行操作。完成后,您应该将固件升级到官方不支持的 2.x 版本。
  • 现在您可以按照此处描述的 GRUB#UEFI 系统 正常安装 GRUB。

更多信息

苹果 Mac

从 macOS 中使用 bless 命令将 grubx64.efi 设置为默认启动选项。如果您仅安装了 Linux,也可以从 macOS 安装光盘启动并在那里启动终端。在终端中,创建一个目录并挂载 EFI 系统分区

# cd /Volumes
# mkdir efi
# mount -t msdos /dev/disk0s1 /Volumes/efi

然后在 grub.efi 和 EFI 系统分区上运行 bless,以将它们设置为默认启动选项。

# bless --folder=/Volumes/efi --file=/Volumes/efi/EFI/GRUB/grubx64.efi --setBoot
# bless --mount=/Volumes/efi --file=/Volumes/efi/EFI/GRUB/grubx64.efi --setBoot

华硕 (ASUS)

Z68 系列和 U47 系列

# cp esp/EFI/GRUB/grubx64.efi esp/shellx64.efi

之后,从 UEFI 设置/菜单启动 UEFI Shell (在华硕 UEFI BIOS 中,切换到高级模式,按右上角的退出,然后选择“从文件系统设备启动 EFI shell”)。GRUB 菜单将显示,您可以启动进入您的系统。之后,您可以使用 efibootmgr 设置菜单项,例如,如果您的 EFI 系统分区/dev/sda1

# efibootmgr --create --disk /dev/sda --part 1 --write-signature --loader /EFI/GRUB/grubx64.efi --label "GRUB" --verbose

如果您的主板没有这样的选项 (或者即使有),您可以使用 UEFI shell 为 Arch 分区临时创建一个 UEFI 启动选项。

一旦您启动进入 UEFI shell,添加一个 UEFI 启动菜单项

Shell> bcfg boot add 0 FS0:\EFI\GRUB\grubx64.efi "GRUB"

其中 FS0: 是对应于 EFI 系统分区 的映射,而 \EFI\GRUB\grubx64.efi 是来自上面 efibootmgr 命令的 --loader 的文件。

这将为下次启动临时添加一个 UEFI 启动选项以进入 Arch。进入 Arch 后,modprobe efivars 并确认 efibootmgr 没有创建错误 (没有错误意味着您已成功在 UEFI 模式下启动)。然后可以再次执行 GRUB 安装,并且应该在 UEFI 菜单中成功永久添加一个启动项。

ux32vd

注意: 如果没有正确设置 UEFI 启动项,BIOS 不允许计算机从 GPT 磁盘启动。在这种情况下,磁盘甚至可能在 BIOS 中看不到。解决方法是创建一个正确的 UEFI 启动项。

这里有一个注意事项。如果机器是从 MBR 启动的,则 grub-install (或 efibootmgr) 将无法创建 UEFI 启动项,并出现以下错误

EFI variables are not supported on this system

您首先需要使用 EFI 启动机器,然后创建启动项。这可以通过为 Z68 系列描述的方式完成:通过将 esp/EFI/GRUB/grubx64.efi 复制到 esp/shellx64.efi 并选择“从文件系统设备启动 EFI shell”。成功启动后,可以使用 grub-installefibootmgr 创建启动项。

P8Z77 系列

本文或本章节的事实准确性存在争议。

原因: 此过程很可能不再必要,您只需通过 efibootmgr 创建条目即可。(在 Talk:GRUB/EFI examples 中讨论)

安装 GRUB 并将 修改后的 UEFI Shell 二进制文件 复制到 ESP

EFI 系统分区 应仅包含两个文件

/Shell.efi
/EFI/GRUB/grubx64.efi
  • 重启并进入 BIOS (Delete 键可以做到这一点)。
  • 使用箭头键,移动到退出菜单,然后向下移动到EFI shell
  • 为菜单添加 Arch 条目。下面是一个示例,请参阅 Unified Extensible Firmware Interface#启动 UEFI Shell 文章以获取更多信息。

在 UEFI shell 中

Shell> bcfg boot dump -v
Shell> bcfg boot add 1 FS0:\EFI\GRUB\grubx64.efi "GRUB"
Shell> exit
  • 重启机器并进入 BIOS。
  • 导航到启动部分,并调整启动顺序,使“GRUB”成为 SSD 上的那个。
  • 启动到此条目并享受。

M5A97

完成标准的 Arch 安装步骤,确保将您的启动硬盘分区为 GPT。

安装 GRUB 并将 修改后的 UEFI Shell 二进制文件 复制到 ESP

我们需要此 shell 应用程序的原因是 efibootmgr 命令将在 grub-install 期间静默失败。

之后,从 UEFI 设置/菜单启动 UEFI Shell (在华硕 UEFI BIOS 中,切换到高级模式,按右上角的退出,然后选择“从文件系统设备启动 EFI shell”)。UEFI shell 将显示。从这里我们需要将我们的 GRUB 条目添加到 NVRAM。

Shell> bcfg boot add 3 FS0:\EFI\GRUB\grubx64.efi "GRUB"

其中 FS0: 是对应于 EFI 系统分区 的映射,而 3 是从零开始的启动条目索引。

提示: UEFI Shell 命令通常支持 -b 选项,该选项使输出在每页后暂停。map 列出识别的文件系统 (fs0, ...) 和数据存储设备 (blk0, ...)。运行 help -b 以列出可用命令。有关更多信息,请参阅 Unified Extensible Firmware Interface#重要的 UEFI Shell 命令

要列出现有的启动条目,您可以运行

Shell> bcfg boot dump -v

华擎 (Asrock)

Z97M Pro4

本文或本章节的事实准确性存在争议。

原因: 如果从已安装的系统启动时 efibootmgr 工作正常,为什么在 grub-install 执行它时它会不起作用?(在 Talk:GRUB/EFI examples 中讨论)

这与华硕 Z68 系列的步骤类似。这已在 Z97M Pro4 BIOS P1.90 上测试过。

# cp esp/EFI/GRUB/grubx64.efi esp/shellx64.efi

之后,从 UEFI 设置/菜单启动 UEFI Shell (在华擎 (ASROCK) UEFI BIOS 中,转到退出选项卡并选择“从文件系统设备启动 EFI Shell”)。GRUB 菜单将显示,您可以启动进入您的系统。之后,您可以使用 efibootmgr 设置菜单项,例如,如果您的 EFI 系统分区/dev/sda1

# efibootmgr --create --disk /dev/sda --part 1 --write-signature --loader /EFI/GRUB/grubx64.efi --label "GRUB" --unicode

戴尔 (Dell)

PowerEdge T30

戴尔 UEFI 实现需要 UEFI 固件解决方法 来加载 grub。否则,它将进入“未找到操作系统”屏幕。

Latitude E7450

除了 UEFI 固件解决方法 (没有它 GRUB 无法启动) 之外,戴尔 Latitude 似乎还需要将 EFI 系统分区挂载在 /boot 上。当 ESP 挂载在 /efi 上时,GRUB 无法找到配置文件并启动救援控制台。

微星 (MSI)

这些微星主板似乎希望 EFI 程序存在于与 GRUB 安装位置不同的位置。在按照安装 GRUB 的说明操作后,执行以下操作之一

B250M PRO-VH

# mkdir esp/EFI/BOOT
# cp esp/EFI/grub/grubx64.efi esp/EFI/BOOT/shellx64.efi

B150 PC MATE / B250 PC MATE / H110I PRO / Z370 GAMING PLUS / MPG B760I EDGE WIFI

将 GRUB 安装到默认/备用启动路径

惠普 (HP)

EliteBook 840 G1 & Probook 6570b

有关详细信息,请参阅 HP EliteBook 840 G1#UEFI 设置

注意: 上述链接中的步骤可能也适用于其他一系列惠普 (HP) 型号。

英特尔 (Intel)

S5400 系列

本文或章节需要扩充。

原因: 它是否支持从默认/备用启动路径 esp/EFI/BOOT/BOOTia32.efi 启动?如果支持,则可以简化说明。(在 Talk:GRUB/EFI examples 中讨论)

此主板可以在 BIOS 或 EFI 模式下运行。BIOS 模式需要 MBR 分区的硬盘驱动器,EFI 模式需要 GPT 硬盘驱动器。请注意,此主板在英特尔 EFI v1.10 规范下运行,并且仅为 IA32 (32 位)。可以遵循 UEFI 安装的正常步骤,但以下更改除外。

  • 必须使用 grub-efi-i386 目标,而不是使用 grub-efi-x86_64 目标
  • bcfg 命令不适用于 pre-UEFI (v2.0) 固件。EFI 系统分区 根目录上的 startup.nsh 文件可用于包含引导加载程序的路径。例如:FS0:\EFI\GRUB\grubia32.efi 必须放置在 EFI 系统分区根目录的 startup.nsh 文件中。
  • grub.cfg 文件必须与 grub EFI 二进制文件放置在同一目录中,否则 GRUB 将找不到它并进入交互式 shell。

联想 (Lenovo)

K450 IdeaCentre

EFI 系统分区需要存在文件 \EFI\BOOT\BOOTx64.efi 才能启动,否则您将收到“错误 1962:未找到操作系统。启动顺序将自动重复。”

将 GRUB 安装到默认/备用启动路径

这是针对 UEFI 实现中可能存在的错误的解决方法。

M92p ThinkCentre

此系统将 UEFI 启动条目列入白名单。它将从名为“Red Hat Enterprise Linux”或“Windows Boot Manager”的条目启动 (2021 年 1 月)。因此,请适当指定 bootloader-id

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id="Red Hat Enterprise Linux" --recheck --debug

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id="Windows Boot Manager" --recheck --debug

也可以使用 efibootmgr 编辑您的 EFI 配置。首先,列出您的启动条目

# efibootmgr

删除 Windows Boot Manager 的旧条目

# efibootmgr -Bb 0000

现在创建一个新的启动条目,该条目指向您的硬盘驱动器上的所需引导加载程序。请注意:-p 定义您的 EFI 系统分区所在的哪个分区上。

# efibootmgr -c -d /dev/sda -p 1 -L "Windows Boot Manager" -l "\EFI\boot\grubx64.efi"

这将设置您的 EFI 以启动条目“Windows Boot Manager”并加载 grub 引导加载程序。

X270 Thinkpad

本文或本章节的事实准确性存在争议。

原因: 在此笔记本电脑上进行 UEFI 启动无需执行任何特殊操作。(在 Talk:GRUB/EFI examples#X270 中讨论)

将 GRUB 安装到默认/备用启动路径