GRUB/EFI 示例
众所周知,不同的主板制造商对 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。
更多信息
- https://www.bios-mods.com/forum/Thread-Upgrade-Bios-To-UEFI-Insyde?pid=159051#pid159051
- https://catchtito.blogspot.com/2013/05/how-to-update-to-2x-bios-from-1x-bios.html
苹果 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
这里有一个注意事项。如果机器是从 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-install 或 efibootmgr 创建启动项。
P8Z77 系列
安装 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
是从零开始的启动条目索引。
-b
选项,该选项使输出在每页后暂停。map
列出识别的文件系统 (fs0
, ...) 和数据存储设备 (blk0
, ...)。运行 help -b
以列出可用命令。有关更多信息,请参阅 Unified Extensible Firmware Interface#重要的 UEFI Shell 命令。要列出现有的启动条目,您可以运行
Shell> bcfg boot dump -v
华擎 (Asrock)
Z97M Pro4
这与华硕 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 设置。
英特尔 (Intel)
S5400 系列
此主板可以在 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
将 GRUB 安装到默认/备用启动路径。