rEFInd (简体中文)

From ArchWiki

翻译状态:本文是 rEFInd翻译。上次翻译日期:2021-03-19。如果英文版本有所更改,则您可以帮助同步翻译。

rEFInd 是一个 UEFI 能够启动 EFISTUB 内核的启动管理器。它是 rEFIt (不再维护)的一个分支并且针对非 Mac 硬件修复了若干问题。它被设计为平台无关,可启动多个操作系统。

注意: 整篇文章中 esp 代表 EFI system partition (简体中文) 的挂载点。

安装

安装 refind 包。

安装 rEFInd 启动管理器

rEFInd 附带了实现了对 ReiserFS, Ext2, Ext4, Btrfs, ISO-9660 and HFS+ 只读支持的 UEFI drivers。而且 rEFInd 能够访问任何 UEFI 本身能够存取的文件系统,包括 FAT (由 UEFI 规范强制要求), 在 Mac 上的 HFS+ 和一些系统上的 ISO-9660。

额外的驱动可以参考 The rEFInd Boot Manager: Using EFI Drivers: Finding Additional EFI Drivers

为了使用 rEFInd, 务必将它安装到 EFI 分区, 使用 rEFInd 安装脚本或者手动复制文件并设置启动入口.

警告: 你的内核和 initramfs 必须在一个 rEFInd 能够读取的文件系统上。

以 rEFInd 安装脚本安装

rEFInd 包含有一个 refind-install 脚本来简化将你的 rEFInd 设置为默认 EFI 启动项的过程。这个脚本有几个选项用于处理不同的设置和 UEFI 实现。想要了解不同选项的含义,请参见 refind-install(8) 或者读安装脚本里面的注释。

对于许多系统来说,运行下面的命令就足够了:

# refind-install

此操作会尝试找到并挂载您的 ESP,将 rEFInd 的文件复制到 esp/EFI/refind/,并使用 efibootmgr 将 rEFInd 设置为默认的 UEFI 启动项。

或者您可以将 rEFInd 安装到默认/回退(fallback)启动路径 esp/EFI/BOOT/bootx64.efi。这对于可启动的 USB 驱动器或者在那些 efibootmgr 做的 NVRAM 更改有问题的系统上会有帮助:

# refind-install --usedefault /dev/sdXY

其中 /dev/sdXY 是你的 EFI 分区 (块设备, 不是挂载点).

提示: 默认情况下 refind-install 只会为内核所在的文件系统安装驱动。 其他的文件系统需要手动安装,通过将 /usr/share/refind/drivers_x64/ 复制到 esp/EFI/refind/drivers_x64/, 或者你可以以 --alldrivers 选项安装。 这对于可启动的 USB 驱动器有帮助。

将 rEFInd 的文件安装到 ESP 之后, 验证 rEFInd 已经在你的内核所在文件夹创建了包含内核参数refind_linux.conf 文件。如果你用了 --usedefault 选项,该文件不会被创建,请以 root 身份运行 mkrlconf 来创建它。

警告:refind-install 运行在chroot环境下 (例如:安装Arch Linux时的live环境) /boot/refind_linux.conf 内将会添加live系统的内核选项,而不是安装它的系统。

编辑 /boot/refind_linux.conf 并确保其中的 kernel parameters (简体中文) 对于你的系统是正确的,否则下次启动可能会出现内核错误。

查看示例:rEFInd#refind_linux.conf

默认情况下,rEFInd 会扫描你的所有的驱动器(它有驱动的那些)并为它找到的每一个 EFI bootloader 添加一个启动入口,其中就包含你的内核(因为 Arch 默认启用了 EFISTUB )。因此你在这时候就可能有一个可以启动的系统。

Secure Boot

要在 rEFInd 中使用 Secure Boot,请参考 Managing Secure Boot

使用 PreLoader

要获取经过签名的 PreLoader.efiHashTool.efi 二进制文件,请参考 Secure Boot#Set up PreLoader

--preloader /path/to/preloader 选项执行 refind-install

# refind-install --preloader /usr/share/preloader-signed/PreLoader.efi

当你下次以 Secure Boot 开启状态启动时,HashTool 会启动并让你注册 rEFInd (loader.efi) 、rEFInd 的驱动器 (如 ext4_x64.efi)和内核 (如 vmlinuz-linux) 的 hash。

更多信息参见 refind-install(8)

提示: 经过签名的 HashTool 只能够访问启动它的分区。 这意味着如果你的内核不在 EPS 上, 你就不能从 HashTool 注册它的 hash. 你可以使用 #KeyTool 来替代这种情况, 因为它可以将一个 hash 注册到 MokList 并且不被限制在一个分区。在使用之前,请记住要先注册 KeyTool 的 hash。
使用 shim

安装 shim-signedAUR。阅读 Secure Boot#shim,但是跳过所有的文件复制。

使用 hash

要只使用带有 hash 的 shim,请以 --shim /path/to/shim 参数执行 refind-install

# refind-install --shim /usr/share/shim-signed/shimx64.efi

当你下次以 Secure Boot 开启状态启动时, MokManager 会启动并让你注册 rEFInd (loader.efi) 、rEFInd 的驱动器 (如 ext4_x64.efi)和内核 (如 vmlinuz-linux) 的 hash。

使用机器所有者密钥(Machine Owner Key)

要使用计算机所有者密钥(MOK)对 rEFInd 进行签名,请安装 sbsigntools

提示: 如果您已经创建了一个计算机所有者密钥,则将文件命名为 refind_local.key(PEM 格式私钥)、refind_local.crt (PEM 格式证书)和 refind_local.cer (DER 格式证书),并放置在/etc/refind.d/keys目录中。

--shim /path/to/shim--localkeys 选项执行 refind-install

# refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys

refind-install 会为你创建密钥并为它和它的驱动器签名。你需要用同一个密钥为内核签名,如:

# sbsign --key /etc/refind.d/keys/refind_local.key --cert /etc/refind.d/keys/refind_local.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
提示: 内核签名可以由 pacman hook 自动化, 参见 Secure Boot#Signing the kernel with a pacman hook

进入 MokManager 之后,将 refind_local.cer 添加到 MoKList。在 rEFInd 的安装目录下,如 esp/EFI/refind/keys/refind_local.cer,一个叫做 keys 的文件夹里面可以找到 refind_local.cer

更多信息参见 refind-install(8)

使用你自己的密钥

跟随 Secure Boot#Using your own keys 来创建密钥。

创建目录 /etc/refind.d/keys 并将 Signature Database (db) 密钥和证书放在其中。 将文件命名为: refind_local.key (PEM 格式私钥), refind_local.crt (PEM 格式证书) 和 refind_local.cer (DER 格式证书)。

在运行安装脚本时添加 --localkeys 选项,如:

# refind-install --localkeys

rEFInd EFI 二进制文件将会被用提供的密钥和证书签名。

手动安装

提示: rEFInd 能够以多种方式启动 Linux。参见 The rEFInd Boot Manager: Methods of Booting Linux。本节将阐述使用 EFISTUB 的过程。
注意: 对于 32 位 EFI,请将 x64 替换为 ia32

如果 refind-install 脚本没有正常工作,您可以手动设置 rEFInd。

首先,将可执行文件复制到 EPS:

# mkdir -p esp/EFI/refind
# cp /usr/share/refind/refind_x64.efi esp/EFI/refind/

如果想要将 rEFInd 安装到默认/回退(fallback) 启动路径,请在下面将 esp/EFI/refind/ 替换为 esp/EFI/BOOT/,并将 rEFInd EFI 可执行文件复制到 esp/EFI/BOOT/bootx64.efi:

# mkdir -p esp/EFI/BOOT
# cp /usr/share/refind/refind_x64.efi esp/EFI/BOOT/bootx64.efi

然后使用 efibootmgr 来在 UEFI NVRAM 中创建一个启动入口,其中 /dev/sdXY 是你的 EFI 分区的设备和分区号。如果你要将 rEFI 安装到默认/回退(fallback) 启动路径 esp/EFI/BOOT/bootx64.efi,你可以跳过这一步。

# efibootmgr --create --disk /dev/sdX --part Y --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager" --verbose

此时,你应该能重启到 rEFInd,但是它无法引导你的内核。如果你的内核不在你的 ESP 上,那么 rEFInd 可以挂载你的分区来查找它,只要它具有正确的驱动程序即可。

rEFInd 会从其安装目录中的子目录 driversdrivers_arch(例如 drivers_x64)自动加载所有驱动程序。

# mkdir esp/EFI/refind/drivers_x64
# cp /usr/share/refind/drivers_x64/drivername_x64.efi esp/EFI/refind/drivers_x64/

现在,rEFInd应该为你的内核提供了一个启动项,但是不会传递正确的内核参数。设置#传递内核参数。现在,你应该可以使用 rEFInd 引导内核了。如果仍然无法启动或想要调整 rEFInd 的设置,则可以使用配置文件来更改许多选项:

# cp /usr/share/refind/refind.conf-sample esp/EFI/refind/refind.conf

该示例配置文件具有很好的注释并且不言自明。

除非你在配置文件中设置了textonly,否则你应该复制 rEFInd 的图标以摆脱难看的占位符:

# cp -r /usr/share/refind/icons esp/EFI/refind/

你可以尝试通过复制不同的字体并更改 refind.conf 中的 font 设置来进行尝试:

# cp -r /usr/share/refind/fonts esp/EFI/refind/
提示: 在 rEFInd 中按 F10将会保存屏幕截图到 ESP 分区的根目录。

更新 rEFInd

Pacman 只更新在 /usr/share/refind 中的文件,不会将新文件复制到 ESP。 如果最初 refind-install 成功安装了 rEFInd,则可以再次运行以更新文件。 新的配置文件会被复制为 refind.conf-sample ,你可以使用一个 diff 工具选择、改变合并到你的配置文件。如果你的 rEFInd 需要#手动安装,你需要自己找出需要复制哪些文件。

Pacman 钩子

你可以使用一个 pacman 钩子来自动化更新过程:

/etc/pacman.d/hooks/refind.hook
[Trigger]
Operation=Upgrade
Type=Package
Target=refind

[Action]
Description = Updating rEFInd on ESP
When=PostTransaction
Exec=/usr/bin/refind-install

你可能需要为你的设置将 Exec=更改为正确的更新命令。如果您进行了#手动安装,则可以创建自己的更新脚本以使用钩子进行调用。

提示: 如果你使用 #Secure Boot 设置 rEFInd,则可能需要在 refind-install 命令中额外添加选项 --yes。如果在禁用 Secure Boot 后执行该命令,它将防止该命令失败。更多信息参见 refind-install(8)
注意: 如果 ESP 未挂载到 /boot,而你依靠自动挂载来挂载它,请确保按照 EFI system partition#Alternative mount points 来预加载 vfat 模块。否则,如果 refind与内核一起升级,ESP 将变得不可访问。

配置

rEFInd 的配置文件 refind.conf 存放在 rEFInd EFI 应用的同一目录下(通常为 esp/EFI/refindesp/EFI/BOOT)。默认的配置文件包含了解释了所有选项的扩展注释,更详细的解释参考 Configuring the Boot Manager

传递内核参数

有两种方法可以设置 rEFInd 传递给内核的内核参数

对于 rEFInd 自动检测到的内核

对于自动检测到的内核,你可以在 /boot/refind_linux.conf 中显式指定内核参数,也可以依靠 rEFInd 识别 root 分区和内核参数的能力。更多信息参见Methods of Booting Linux: For Those With Foresight or Luck: The Easiest Method

提示:

为了使 rEFInd 支持 Arch Linux 内核的命名方案并因此使其与各自的 initramfs 镜像相匹配,必须取消注释并编辑 refind.conf 中的 extra_kernel_version_strings选项。例如:

esp/EFI/refind/refind.conf
...
extra_kernel_version_strings linux-hardened,linux-zen,linux-lts,linux
...
注意:
  • rEFInd 仅支持为每个内核检测一个 initramfs 镜像,这意味着它将不检测 fallback initramfs 或微码镜像,必须手动指定它们。
  • 如果没有上述 extra_kernel_version_strings 行,refind_linux.conf 中的 %v 变量将不适用于 Arch Linux 内核
refind_linux.conf

如果 rEFInd 自动检测到你的内核,你可以将包含内核参数的 refind_linux.conf 文件放置在与内核相同的目录中。你可以使用 /usr/share/refind/refind_linux.conf-sample 作为起点。 refind_linux.conf 未注释的第一行将是内核的默认参数。随后的行将在子菜单中创建可使用 +, F2, 或 Insert 访问的条目。

或者,尝试以 root 身份运行 mkrlconf。它将会尝试在 /boot 中找到你的内核,并自动生成 refind_linux.conf。该脚本只会设置最基本的内核参数,因此请确保检查其创建的文件的正确性。

如果未指定 initrd= 参数,rEFInd 将通过在与内核相同的目录中搜索常用RAM磁盘文件名来自动添加它。如果需要多个 initrd= 参数,则必须在 refind_linux.conf 中手动指定它们。例如,一个在 initramfs 之前传递的微码

/boot/refind_linux.conf
"Boot using default options"     "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img"
"Boot using fallback initramfs"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v-fallback.img"
"Boot to terminal"               "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img systemd.unit=multi-user.target"
警告:
  • initrd 路径是相对于内核所在文件系统的根目录。这可能是 initrd=\boot\initramfs-%v.img 或者 initrd = initramfs-%v.img(如果 /boot 是一个单独的分区,例如 ESP)。
  • 在参数 initrd 中使用反斜杠 (\) 作为路径分隔符,否则内核可能无法找到 initramfs 镜像:EFI stub: ERROR: Failed to open file: /boot/intel-ucode.img
注意: rEFInd用内核的版本替换 refind_linux.conf 中的 %v}(通过从文件名中提取if)。为了使 rEFInd 支持Arch Linux内核,必须按照 #对于 rEFInd 自动检测到的内核中的说明编辑 esp/EFI/refind/refind.conf 中的 extra_kernel_version_strings
无需配置的情况

如果你仅将 rEFInd 安装到 ESP 上并毫不费力地启动它(例如通过 UEFI Shell 或 KeyTool,或直接从固件),您仍然可以通过自动检测从启动菜单,而无需进行任何配置。

这之所以可行,是因为 rEFInd 具有回退机制,可以:

注意: rEFInd 不支持转义码 (如 /etc/fstab 中的 路径名空格)。

手动启动项

如果未自动检测到内核,或者你只想对菜单项的选项进行更多控制,则可以使用 refind.conf 中的 stanzas 来手动创建引导项。确保 scanfor 包含 manual,否则这些条目将不会出现在 rEFInd 的菜单中。内核参数使用 options 关键字设置。 rEFInd 将使用 stanza 中的 initrd 关键字指定的文件附加 initrd= 参数。如果你需要其他 initrd(例如微码),则可以在 options 中指定它们(并且 initrd 关键字指定的会添加到末尾)。

手动启动项在 Creating Manual Boot Stanzas 中有详细解释。

esp/EFI/refind/refind.conf
...

menuentry "Arch Linux" {
	icon     /EFI/refind/icons/os_arch.png
	volume   "Arch Linux"
	loader   /boot/vmlinuz-linux
	initrd   /boot/initramfs-linux.img
	options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img"
	submenuentry "Boot using fallback initramfs" {
		initrd /boot/initramfs-linux-fallback.img
	}
	submenuentry "Boot to terminal" {
		add_options "systemd.unit=multi-user.target"
	}
}

您可能需要更改 volume以匹配文件系统的标签、PARTLABEL 或内核镜像所在分区的 PARTUUID。PARTUUID 必须大写的。有关分配卷标的示例,请参见 Persistent block device naming (简体中文)#by-label。如果未指定 volume,则默认为启动 rEFInd 的卷(通常是EFI系统分区)。

警告:
  • loaderinitrd 的路径是相对于 volume 的根目录的相对路径。如果 /boot 是一个单独的分区(例如 ESP ),那么加载程序和 initrd 路径分别是 /vmlinuz-linux/initramfs-linux.img
  • 在所有引用的 initrd 参数中使用反斜杠 (\) 作为路径分隔符,否则内核可能无法找到 initramfs 镜像:EFI stub: ERROR: Failed to open file: /boot/initramfs-linux.img

在已有的 Windows UEFI 安装中使用 rEFInd

注意: 在页面 Windows and Arch Dual Boot (简体中文) 中查看通常的注意事项。

rEFInd 兼容 UEFI Windows 安装时创建的 EFI 系统分区,因此没有必要创建或格式化另一个 FAT32 分区。只需挂载 Windows 的 ESP 并像往常一样安装 rEFInd。默认情况下,rEFInd 的自动检测功能应该识别任何现有的 Windows 引导程序。

注意: 在某些情况下,Windows 的行为不同(低分辨率启动屏幕、OEM logo 被 Windows logo 替换、启动屏幕后出现黑屏、伪影)。如果您遇到这样的问题,请尝试在 esp/EFI/refind/refind.conf 中设置 use_graphics_for +,windows 或者将 graphics on 添加到Windows 引导项。

工具

rEFInd支持运行各种[1]。工具需要单独安装。在 refind.conf 中编辑 showtools 文件选择要显示的内容。

esp/EFI/refind/refind.conf
...
showtools shell, memtest, mok_tool, gdisk, fwupdate ...
...

UEFI shell

参见 Unified Extensible Firmware Interface#UEFI Shell

复制 shellx64.efiEFI 分区 的根目录。

Memtest86

安装 memtest86-efiAUR 并将它复制到 esp/EFI/tools/

# cp /usr/share/memtest86-efi/bootx64.efi esp/EFI/tools/memtest86.efi

密钥管理工具

rEFInd 能够检测 Secure Boot 密钥管理工具,如果他们被放在 EPS 上的 rEFInd 的文件夹内,如 esp/esp/EFI/tools/

HashTool

参照 #使用 PreLoaderHashTool.efi 将被放在 rEFInd 的文件夹内。

MokManager

参照 #使用 shim,MokManager 将被放在 rEFInd 的文件夹内。

KeyTool

安装 efitools

将 KeyTool EFI 二进制文件放在 esp/ 或者 esp/EFI/tools/ 中,并命名为 KeyTool.efiKeyTool-signed.efi

关于签名 KeyTool.efi 的指导,请参考 Secure Boot#Using KeyTool

GPT fdisk (gdisk)

下载 gdisk EFI 应用 并将 gdisk_x64.efi 复制到 esp/EFI/tools/

fwupdate

安装并设置好 fwupd

fwupx64.efi 和固件复制到 esp/EFI/tools/

# cp /usr/lib/fwupd/efi/fwupdx64.efi esp/EFI/tools/

关机或重启

据报道,rEFInd 内置了关机和重启菜单项。由于这个工具列表是这个 wiki 中的同类工具中最广泛的,因此 UEFI shell 或其他 UEFI 引导管理器(如 systemd-boot )的用户可能会对 powerofforreboot.efiAUR 感兴趣。

提示与小技巧

在 UEFI shell 中使用驱动

要在 UEFI shell 中使用 rEFInd 的驱动,请使用load 命令来加载它们,并使用 map -r 来刷新驱动器映射。

Shell> load FS0:\EFI\refind\drivers\ext4_x64.efi
Shell> map -r

现在你可以从 UEFI shell 访问你的文件系统了。

设置 efifb 分辨率

如果 refind.conf 中的分辨率被设置为一个不正确的值,在除了 Apple Mac 的所有系统中, rEFInd 都会展示一个支持的分辨率列表。对于 Apple Mac, 它会静默使用默认分辨率。

要确定 efifb 支持的帧缓冲区分辨率,请 gnu-efi/usr/share/gnu-efi/apps/x86_64/modelist.efi 复制到 ESP 的根目录。进入 UEFI shell 并运行 modelist.efi

Shell> FS0:\modelist.efi
GOP reports MaxMode 3
 0: 640x480 BGRR pitch 640
*1: 800x600 BGRR pitch 800
 2: 1024x768 BGRR pitch 1024

refind.conf 中设置一个。重启并用 dmesg | grep efifb 来检查设置是否已被应用。

Btrfs 子卷支持

提示: 确保安装了 btrfs_x64.efi 驱动程序, 可以将 /usr/share/refind/drivers_x64/btrfs_x64.efi 复制到 esp/EFI/refind/drivers_x64/btrfs_x64.efi来手动安装, 或者你也可以以 refind-install /dev/sdx --alldrivers 选项安装所有驱动程序。
警告: btrfs_x64.efi 不支持 raid1c3/4

自动检测

要允许在 Btrfs 子卷上进行内核自动检测,请取消注释并编辑 refind.conf 中的 also_scan_dirs

esp/EFI/refind/refind.conf
...
also_scan_dirs +,subvolume/boot
...

然后在 refind_linux.conf 中将 subvol=subvolume 添加到 rootflags,之后将 subvolume 添加到 initrd 路径之前。

/boot/refind_linux.conf
"Boot using standard options"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=subvolume initrd=subvolume\boot\initramfs-%v.img"

手动启动项

如果将一个 btrfs 子卷作为根目录引导,请将子卷的路径预先添加到 loader 和 initrd 路径之前,并用 rootflags=subvol=root_subvolume 修改 options 行。在下面的示例中,root 已作为名为“ROOT”的btrfs子卷挂载(例如 mount -o subvol=ROOT /dev/sdxY /mnt):

esp/EFI/refind/refind.conf
...
menuentry "Arch Linux" {
        icon     /EFI/refind/icons/os_arch.png
        volume   "[bootdevice]"
        loader   /ROOT/boot/vmlinuz-linux
        initrd   /ROOT/boot/initramfs-linux.img
        options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=ROOT"
...
}

如果失败将导致以下错误信息:ERROR: Root device mounted successfully, but /sbin/init does not exist.

LoaderDevicePartUUID

从 0.13.1 版本开始,rEFInd 支持设置 UEFI 变量 LoaderDevicePartUUID。启用此选项允许 systemd-gpt-auto-generator(8) 自动挂载 EFI 系统分区,而无需在 /etc/fstab 中指定它。请参阅 systemd#GPT partition automounting

对于 rEFInd, 要设置 LoaderDevicePartUUID, 请编辑 refind.conf 并取消注释 write_systemd_vars true:

esp/EFI/refind/refind.conf
...
write_systemd_vars true
...

您可以通过使用 cat /sys/firmware/efi/efivars/LoaderDevicePartUUID-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f 检查它的值,或者通过查看 bootclt 输出中 “Boot loader sets ESP partition information” 的状态来验证它是否已设置。

疑难解答

Apple Macs

AUR 上的 mactel-bootAUR 是 "bless" 工具的实验性替代品。如果它不能正常工作, 在 OS X 中使用 "bless" 来将 rEFInd 设置为默认启动项。

 # bless --setBoot --folder esp/EFI/refind --file esp/EFI/refind/refind_x64.efi

VirtualBox

6.1 版本之前的 VirtualBox 将只引导默认的 esp/EFI/BOOT/bootx64.efi 路径,因此 refind-install 至少需要与 --usedefault 选项一起使用。有关详细信息,请参阅 VirtualBox/Install Arch Linux as a guest#Installation in EFI mode on VirtualBox < 6.1

参见