GRUB (简体中文)/EFI examples (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 GRUB/EFI_examples翻译。上次翻译日期:2015-02-28。如果英文版本有所更改,则您可以帮助同步翻译。

Tango-preferences-desktop-locale-modified.png这篇文章或章节的翻译不反映原文。Tango-preferences-desktop-locale-modified.png

原因:Last updated in 2015(在 Talk:GRUB (简体中文)/EFI examples (简体中文)# 中讨论)

我们都知道不同的主板制造商有不同的 UEFI 实现。本文介绍了一些针对不同硬件来以 EFI 模式安装/恢复 GRUB 的可行方法。

Apple Mac EFI 系统

通用 Mac 电脑

使用 Mac OS X 自带的 bless 命令把 grubx64.efi 设置为默认启动选项。如果你只安装了 Linux, 也可以启动进入 Mac OS X 安装盘并打开终端。创建一个目录并挂载 EFI 系统分区:

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

然后让 bless 作用于 grub.efi 和 EFI 分区以设置为默认启动选项。

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

更多信息见 https://help.ubuntu.com/community/UEFIBooting#Apple_Mac_EFI_systems_.28both_EFI_architecture.29.

注意: TODO: GRUB 上游源 Bazaar 的 mactel 分支 http://bzr.savannah.gnu.org/lh/grub/branches/mactel/changes[失效链接 2020-08-02 ⓘ]. GRUB 开发者将停止提交变更。
注意: TODO: Fedora 开发者开发的实验性的 Linux 版 bless 工具 - mactel-bootAUR. 需要更多测试。

华硕

Z68 系列和 U47 系列

# cp /boot/efi/EFI/arch_grub/grubx64.efi /boot/efi/shellx64.efi

从 UEFI 设置/菜单启动 UEFI Shell 之后 (在华硕 UEFI BIOS 中切换到高级模式,按下位于右上角的 Exit 并选择"Launch EFI shell from filesystem device"). GRUB2 菜单会出现然后可以进入系统。之后,可以使用 efibootmgr 来设置菜单条目,例如 UEFI 分区是 /dev/sda1: (参见 Unified Extensible Firmware Interface)

efibootmgr -c -g -d /dev/sda -p 1 -w -L "Arch Linux (GRUB)" -l /EFI/arch_grub/grubx64.efi

如果你的主板没有这个选项 (就算它有), 你也可以使用 UEFI shell (Unified Extensible Firmware Interface#UEFI Shell) 来临时为 Arch 分区创建 UEFI 启动选项。

进入 EFI shell 之后,添加 UEFI 启动菜单条目:

Shell> bcfg boot add 0 fs1:\EFI\arch_grub\grubx64.efi "Arch Linux (GRUB2)"

此处 fs1 映射到 UEFI 系统分区,\EFI\arch_grub\grubx64.efi 来源于上面 grub-install 命令含有的 --bootloader-id.

这会临时添加 UEFI 启动选项以在下一次重启时进入 Arch. 进入之后,输入命令 modprobe efivars 并确证 efibootmgr 没有错误 (没有错误意味着你成功地进入了 UEFI 模式). 然后 GRUB#UEFI systems 会再次运行并能成功地往 UEFI 菜单永久性地添加启动条目。

ux32vd

注意: 如果没有正确设置 EFI 启动条目的话,BIOS 会无法从 GPT 硬盘启动。这种情况下 BIOS 甚至认不出硬盘。

存在一个大问题,即如果机器从 MBR 启动,之后运行 grub-install (或 efibootmgr) 会失败,并伴随着以下错误提示:

EFI variables are not supported on this system

首先应以 EFI 启动并创建启动条目。对于 Z68 系列可由如下方法完成: 复制 /boot/efi/EFI/arch_grub/grubx64.efi/boot/efi/shellx64.efi 并选择"Launch EFI shell from filesystem device". 成功启动之后就能以 grub-install 或 efibootmgr 创建启动条目了。

P8Z77 系列

  • 启动进 live 系统并 chroot 进目标系统。
  • 确证 100 MB fat32 的分区被标记为 "EFI System" (gdisk 使用16进制编码 ef00).
注意: 如果你得到信息"WARNING: Not enough clusters for a 32 bit FAT!",就要用 mkfs.vfat -s2 -F32 ... 来减小簇大小否则 UEFI 会无法读取分区。

在 CHROOT 内

# mount -t vfat /dev/sdXY /boot/efi
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch --recheck
# grub-mkconfig -o /boot/grub/grub.cfg
# wget https://github.com/tianocore/edk2/raw/ab7e02a4f86a8fe2afa2dcf88c404bcf210f9e62/ShellBinPkg/UefiShell/X64/Shell.efi
# umount /boot/efi

EFI 分区应该只包含两个文件:

/Shell.efi
/EFI/arch/grubx64.efi
  • 重启进入 BIOS (Delete 键可以做到).
  • 使用方向键移动到 'exit' 菜单进入到 EFI Shell.
  • 往菜单里为 Arch 添加新条目。下面的是一个范例,更多见文章 UEFI#Launching UEFI Shell.

在 EFI SHELL 内

Shell> bcfg boot dump -v
Shell> bcfg boot add 1 fs0:\EFI\arch\grubx64.efi "Arch Linux (grub manually added)"
Shell> exit
  • 重启进入 BIOS.
  • 进入 'Boot' 部分并调整启动选项次序,使得 "Arch Linux (grub 手动添加)" 在 SSD 上。
  • 进入该条目,享受成功的喜悦。

M5A97

完成标准 Arch 安装流程,确保已安装 grub 并且硬盘是 GPT 格式。

来自 GRUB#UEFI systems:

UEFI 系统分区需要挂载到 /boot/efi/ 以便 GRUB 安装脚本探测到:

# mkdir -p /boot/efi
# mount -t vfat /dev/sdXY /boot/efi

此处 X 是你的启动硬盘 Y 是你之前创建的 EFI 分区。

使用如下命令添加 GRUB UEFI 应用程序到 /boot/efi/EFI/arch_grub 以及添加模块到 /boot/grub/x86_64-efi:

# modprobe dm-mod
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck --debug
# mkdir -p /boot/grub/locale
# cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo

为 GRUB 生成配置文件:

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

然后复制 修改版 UEFI Shell v2 二进制文件 UefiShellX64.efi 到你的 EFI 系统分区根目录。

# cp ~/Shell2/UefiShellX64.efi /mnt/boot/efi/shellx64.efi

我们使用这个 Shell 应用程序因为 efibootmgr 命令在 grub-install 期间没有错误提示。

之后从 UEFI 设置/菜单启动 UEFI Shell 之后 (在华硕 UEFI BIOS 中切换到高级模式,按下位于右上角的 Exit 并选择"Launch EFI shell from filesystem device"). UEFI Shell 会出现。在此添加 GRUB UEFI app 到引导器。

Shell> bcfg boot add 3 fs0:\EFI\Arch_Grub\grubx64.efi "Arch_Grub"

此处 fs0 映射到 UEFI 系统分区,3 是0启动项目录。

注意: UEFI Shell 命令通常支持 -b 选项,它用来在每页输出完后暂停。map 列出识别的文件系统 (fs0, ...) 和数据存储设备 (blk0, ...). 运行 help -b 以列出可用命令。 Unified Extensible Firmware Interface#Important UEFI Shell commands

列出目前启动条目,运行:

Shell> bcfg boot dump -v

HP

EliteBook 840 G1

详见 HP EliteBook 840 G1#UEFI Setup.

注意: 上面的流程对一些 HP 其他型号也有用。

Intel

S5400 系列

这个主板可以在 BIOS 和 EFI 模式下运行。BIOS 模式需要 MBR 分区方案的硬盘,EFI 需要 GPT 的。注意这个主板执行 Intel EFI v1.10 标准,并且仅限 i386. 除开以下变更之外,遵循正常 UEFI 安装流程。

  • 不使用 grub-efi-x86_64 包,而是 grub-efi-i386.
  • 在 UEFI (v2.0) 前的固件 bcfg 命令不可用。startup.nsh 可在 EFI 分区的根目录使用,其中要包含引导器的路径。例如:

fs0:\EFI\arch_grub\boot.efi 必须位于在 EFI 分区根目录上的 startup.nsh 文件里。

  • grub.cfg 必须与 grub EFI 文件放到一起,否则 grub 会找不到并进入交互 shell.

联想

K450 IdeaCentre

"EFI System"分区要求文件 EFI\Boot\bootx64.efi 存在来进行引导,否则会收到"Error 1962: No operating system found. Boot sequence will automatically repeat." 假设"EFI System"挂载在 /boot/efi:

 # grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --recheck --debug
 # mkdir /boot/efi/EFI/Boot
 # touch /boot/efi/EFI/Boot/bootx64.efi

这是 UEFI 实现的疑似 bug 的解决方案。

M92p ThinkCentre

系统有 EFI 白名单标签。只能从标有"Red Hat Enterprise Linux"的启动。所以给引导器指定一个合适的 id:

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