翻译状态:本文是 rEFInd 的翻译。上次翻译日期:2021-03-19。如果英文版本有所更改,则您可以帮助同步翻译。
rEFInd 是一个 UEFI 能够启动 EFISTUB 内核的启动管理器。它是 rEFIt (不再维护)的一个分支并且针对非 Mac 硬件修复了若干问题。它被设计为平台无关,可启动多个操作系统。
安装
安装 rEFInd 启动管理器
rEFInd 附带了实现了对 ReiserFS, Ext2, Ext4, Btrfs, ISO-9660 and HFS+ 只读支持的 UEFI drivers。而且 rEFInd 能够访问任何 UEFI 本身能够存取的文件系统,包括 FAT (由 UEFI 规范强制要求), 在 Mac 上的 HFS+ 和一些系统上的 ISO-9660。
为了使用 rEFInd, 务必将它安装到 EFI 分区, 使用 rEFInd 安装脚本或者手动复制文件并设置启动入口.
警告: 你的内核和 initramfs 必须在一个 rEFInd 能够读取的文件系统上。
以 rEFInd 安装脚本安装
rEFInd 包含有一个 refind-install 脚本来简化将你的 rEFInd 设置为默认 EFI 启动项的过程。这个脚本有几个选项用于处理不同的设置和 UEFI 实现。想要了解不同选项的含义,请参见
对于许多系统来说,运行下面的命令就足够了:
# 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
使用 PreLoader
要获取经过签名的 PreLoader.efi 和 HashTool.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。
提示: 经过签名的 HashTool 只能够访问启动它的分区。 这意味着如果你的内核不在 EPS 上, 你就不能从 HashTool 注册它的 hash. 你可以使用 #KeyTool 来替代这种情况, 因为它可以将一个 hash 注册到 MokList 并且不被限制在一个分区。在使用之前,请记住要先注册 KeyTool 的 hash。
使用 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 进行签名,请安装
提示: 如果您已经创建了一个计算机所有者密钥,则将文件命名为 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
进入 MokManager 之后,将 refind_local.cer 添加到 MoKList。在 rEFInd 的安装目录下,如 esp/EFI/refind/keys/refind_local.cer,一个叫做 keys 的文件夹里面可以找到 refind_local.cer。
使用你自己的密钥
创建目录 /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 二进制文件将会被用提供的密钥和证书签名。
手动安装
注意: 对于 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/sdX 和 Y 是你的 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 会从其安装目录中的子目录 drivers 和 drivers_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 后执行该命令,它将防止该命令失败。更多信息参见
注意: 如果 ESP 未挂载到 /boot,而你依靠自动挂载来挂载它,请确保按照 EFI system partition#Alternative mount points 来预加载 vfat 模块。否则,如果
配置
rEFInd 的配置文件 refind.conf 存放在 rEFInd EFI 应用的同一目录下(通常为 esp/EFI/refind 或 esp/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。
提示:
当 /etc/os-release 与内核位于同一分区时,rEFInd 会自动为启动项选择 Arch Linux图标 (os_arch.png)。如果你的 /boot 是一个单独的分区,参考 Configuring the Boot Manager: Setting OS Icons。
rEFInd 不支持检测统一内核映像的分布。要为统一内核映像提供图标,请将 /usr/share/refind/icons/os_arch.png 复制到 esp/EFI/Linux/ 并确保文件名匹配。例如,如果你有 esp/EFI/Linux/Arch-linux.efi,则将对应的图标命名为 esp/EFI/Linux/Arch-linux.png。
为了使 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 具有回退机制,可以:
从 GPT partition attributes 检测内核选项 (ro 或者 rw)。 (使用属性 60 "read-only") 或者 /etc/fstab。
注意: rEFInd 不支持转义码 (如 /etc/fstab 中的 路径名空格)。
手动启动项
如果未自动检测到内核,或者你只想对菜单项的选项进行更多控制,则可以使用 refind.conf 中的 stanzas 来手动创建引导项。确保 scanfor 包含 manual,否则这些条目将不会出现在 rEFInd 的菜单中。内核参数使用 options 关键字设置。 rEFInd 将使用 stanza 中的 initrd 关键字指定的文件附加 initrd= 参数。如果你需要其他 initrd(例如微码),则可以在 options 中指定它们(并且 initrd 关键字指定的会添加到末尾)。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系统分区)。
警告:
loader 和 initrd 的路径是相对于 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
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 引导项。
工具
This article or section is a candidate for moving to Unified Extensible Firmware Interface.
Notes: 尽管 rEFInd 为这些常用工具提供了一个特殊的接口,但它们不是 rEFInd 的特性。 (Discuss in Talk:REFInd (简体中文)#template:move at refind#tools: to uefi)
rEFInd支持运行各种[1]。工具需要单独安装。在 refind.conf 中编辑 showtools 文件选择要显示的内容。
esp/EFI/refind/refind.conf
UEFI shell
复制 shellx64.efi 到 EFI 分区 的根目录。
Memtest86
安装 AUR 并将它复制到 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
参照 #使用 PreLoader, HashTool.efi 将被放在 rEFInd 的文件夹内。
MokManager
参照 #使用 shim,MokManager 将被放在 rEFInd 的文件夹内。
KeyTool
将 KeyTool EFI 二进制文件放在 esp/ 或者 esp/EFI/tools/ 中,并命名为 KeyTool.efi 或 KeyTool-signed.efi。
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 )的用户可能会对 AUR 感兴趣。
提示与小技巧
在 UEFI shell 中使用驱动
This article or section is a candidate for moving to Unified Extensible Firmware Interface#UEFI drivers.
Notes: 不是只有 rEFInd 的驱动能被加载,已将所有与 UEFI 通用驱动的信息移动到一篇文章。 (Discuss in Talk:REFInd (简体中文)#)
要在 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 支持的帧缓冲区分辨率,请 /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
对于 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 上的 AUR 是 "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。
参见