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.
华硕
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
存在一个大问题,即如果机器从 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).
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 格式。
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启动项目录。
-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.
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