rEFInd (简体中文)
rEFInd 是一个 UEFI 能够启动 EFISTUB 内核的启动管理器。它是 rEFIt (不再维护)的一个分支并且针对非 Mac 硬件修复了若干问题。它被设计为平台无关,可启动多个操作系统。
esp 代表 EFI system partition (简体中文) 的挂载点。
安装 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 安装脚本或者手动复制文件并设置启动入口.
以 rEFInd 安装脚本安装
rEFInd 包含有一个 refind-install 脚本来简化将你的 rEFInd 设置为默认 EFI 启动项的过程。这个脚本有几个选项用于处理不同的设置和 UEFI 实现。想要了解不同选项的含义,请参见 或者读安装脚本里面的注释。
对于许多系统来说,运行下面的命令就足够了:
# refind-install
此操作会尝试找到并挂载您的 ESP,将 rEFInd 的文件复制到 ,并使用 efibootmgr 将 rEFInd 设置为默认的 UEFI 启动项。
或者您可以将 rEFInd 安装到默认/回退(fallback)启动路径 。这对于可启动的 USB 驱动器或者在那些 efibootmgr 做的 NVRAM 更改有问题的系统上会有帮助:
# refind-install --usedefault /dev/sdXY
其中 /dev/sdXY 是你的 EFI 分区 (块设备, 不是挂载点).
将 rEFInd 的文件安装到 ESP 之后, 验证 rEFInd 已经在你的内核所在文件夹创建了包含内核参数的 文件。如果你用了 选项,该文件不会被创建,请以 root 身份运行 mkrlconf 来创建它。
默认情况下,rEFInd 会扫描你的所有的驱动器(它有驱动的那些)并为它找到的每一个 EFI bootloader 添加一个启动入口,其中就包含你的内核(因为 Arch 默认启用了 EFISTUB )。因此你在这时候就可能有一个可以启动的系统。
Secure Boot
要在 rEFInd 中使用 Secure Boot,请参考 Managing Secure Boot。
使用 PreLoader
要获取经过签名的 和 二进制文件,请参考 Secure Boot#Set up PreLoader。
以 选项执行 。
# refind-install --preloader /usr/share/preloader-signed/PreLoader.efi
当你下次以 Secure Boot 开启状态启动时,HashTool 会启动并让你注册 rEFInd (loader.efi) 、rEFInd 的驱动器 (如 )和内核 (如 ) 的 hash。
更多信息参见 。
使用 shim
安装 。阅读 Secure Boot#shim,但是跳过所有的文件复制。
使用 hash
要只使用带有 hash 的 shim,请以 参数执行 :
# refind-install --shim /usr/share/shim-signed/shimx64.efi
当你下次以 Secure Boot 开启状态启动时, MokManager 会启动并让你注册 rEFInd (loader.efi) 、rEFInd 的驱动器 (如 )和内核 (如 ) 的 hash。
使用机器所有者密钥(Machine Owner Key)
要使用计算机所有者密钥(MOK)对 rEFInd 进行签名,请安装 。
以 和 选项执行 :
# 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,一个叫做 的文件夹里面可以找到 refind_local.cer。
更多信息参见 。
使用你自己的密钥
跟随 Secure Boot#Using your own keys 来创建密钥。
创建目录 并将 Signature Database (db) 密钥和证书放在其中。 将文件命名为: (PEM 格式私钥), (PEM 格式证书) 和 refind_local.cer (DER 格式证书)。
在运行安装脚本时添加 选项,如:
# refind-install --localkeys
rEFInd EFI 二进制文件将会被用提供的密钥和证书签名。
手动安装
如果 脚本没有正常工作,您可以手动设置 rEFInd。
首先,将可执行文件复制到 EPS:
# mkdir -p esp/EFI/refind # cp /usr/share/refind/refind_x64.efi esp/EFI/refind/
如果想要将 rEFInd 安装到默认/回退(fallback) 启动路径,请在下面将 替换为 ,并将 rEFInd EFI 可执行文件复制到 :
# mkdir -p esp/EFI/BOOT # cp /usr/share/refind/refind_x64.efi esp/EFI/BOOT/bootx64.efi
然后使用 efibootmgr 来在 UEFI NVRAM 中创建一个启动入口,其中 和 Y 是你的 EFI 分区的设备和分区号。如果你要将 rEFI 安装到默认/回退(fallback) 启动路径 ,你可以跳过这一步。
# efibootmgr --create --disk /dev/sdX --part Y --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager" --verbose
此时,你应该能重启到 rEFInd,但是它无法引导你的内核。如果你的内核不在你的 ESP 上,那么 rEFInd 可以挂载你的分区来查找它,只要它具有正确的驱动程序即可。
rEFInd 会从其安装目录中的子目录 和 (例如 )自动加载所有驱动程序。
# 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
该示例配置文件具有很好的注释并且不言自明。
除非你在配置文件中设置了,否则你应该复制 rEFInd 的图标以摆脱难看的占位符:
# cp -r /usr/share/refind/icons esp/EFI/refind/
你可以尝试通过复制不同的字体并更改 中的 font 设置来进行尝试:
# cp -r /usr/share/refind/fonts esp/EFI/refind/
更新 rEFInd
Pacman 只更新在 中的文件,不会将新文件复制到 ESP。 如果最初 成功安装了 rEFInd,则可以再次运行以更新文件。 新的配置文件会被复制为 ,你可以使用一个 diff 工具选择、改变合并到你的配置文件。如果你的 rEFInd 需要#手动安装,你需要自己找出需要复制哪些文件。
Pacman 钩子
你可以使用一个 pacman 钩子来自动化更新过程:
你可能需要为你的设置将 更改为正确的更新命令。如果您进行了#手动安装,则可以创建自己的更新脚本以使用钩子进行调用。
refind-install 命令中额外添加选项 --yes。如果在禁用 Secure Boot 后执行该命令,它将防止该命令失败。更多信息参见 refind-install(8)。配置
rEFInd 的配置文件 存放在 rEFInd EFI 应用的同一目录下(通常为 或 )。默认的配置文件包含了解释了所有选项的扩展注释,更详细的解释参考 Configuring the Boot Manager。
传递内核参数
有两种方法可以设置 rEFInd 传递给内核的内核参数。
对于 rEFInd 自动检测到的内核
对于自动检测到的内核,你可以在 中显式指定内核参数,也可以依靠 rEFInd 识别 root 分区和内核参数的能力。更多信息参见Methods of Booting Linux: For Those With Foresight or Luck: The Easiest Method。
为了使 rEFInd 支持 Arch Linux 内核的命名方案并因此使其与各自的 initramfs 镜像相匹配,必须取消注释并编辑 中的 选项。例如:
refind_linux.conf
如果 rEFInd 自动检测到你的内核,你可以将包含内核参数的 文件放置在与内核相同的目录中。你可以使用 作为起点。 未注释的第一行将是内核的默认参数。随后的行将在子菜单中创建可使用 , F2, 或 访问的条目。
或者,尝试以 root 身份运行 mkrlconf。它将会尝试在 中找到你的内核,并自动生成 。该脚本只会设置最基本的内核参数,因此请确保检查其创建的文件的正确性。
如果未指定 参数,rEFInd 将通过在与内核相同的目录中搜索常用RAM磁盘文件名来自动添加它。如果需要多个 参数,则必须在 中手动指定它们。例如,一个在 initramfs 之前传递的微码:
无需配置的情况
如果你仅将 rEFInd 安装到 ESP 上并毫不费力地启动它(例如通过 UEFI Shell 或 KeyTool,或直接从固件),您仍然可以通过自动检测从启动菜单,而无需进行任何配置。
这之所以可行,是因为 rEFInd 具有回退机制,可以:
- 通过 Discoverable Partitions Specification 或者 分辨 root 分区(对于
root=参数)。 - 从 GPT partition attributes 检测内核选项 ( 或者 )。 (使用属性 "read-only") 或者 。
手动启动项
如果未自动检测到内核,或者你只想对菜单项的选项进行更多控制,则可以使用 中的 stanzas 来手动创建引导项。确保 包含 ,否则这些条目将不会出现在 rEFInd 的菜单中。内核参数使用 关键字设置。 rEFInd 将使用 stanza 中的 initrd 关键字指定的文件附加 参数。如果你需要其他 initrd(例如微码),则可以在 中指定它们(并且 initrd 关键字指定的会添加到末尾)。
手动启动项在 Creating Manual Boot Stanzas 中有详细解释。
您可能需要更改 volume以匹配文件系统的标签、PARTLABEL 或内核镜像所在分区的 PARTUUID。PARTUUID 必须大写的。有关分配卷标的示例,请参见 Persistent block device naming (简体中文)#by-label。如果未指定 volume,则默认为启动 rEFInd 的卷(通常是EFI系统分区)。
在已有的 Windows UEFI 安装中使用 rEFInd
rEFInd 兼容 UEFI Windows 安装时创建的 EFI 系统分区,因此没有必要创建或格式化另一个 FAT32 分区。只需挂载 Windows 的 ESP 并像往常一样安装 rEFInd。默认情况下,rEFInd 的自动检测功能应该识别任何现有的 Windows 引导程序。
工具
rEFInd支持运行各种。工具需要单独安装。在 中编辑 文件选择要显示的内容。
Memtest86
安装 并将它复制到 esp/EFI/tools/。
# cp /usr/share/memtest86-efi/bootx64.efi esp/EFI/tools/memtest86.efi
密钥管理工具
rEFInd 能够检测 Secure Boot 密钥管理工具,如果他们被放在 EPS 上的 rEFInd 的文件夹内,如 或 esp/EFI/tools/。
HashTool
参照 #使用 PreLoader, 将被放在 rEFInd 的文件夹内。
MokManager
参照 #使用 shim,MokManager 将被放在 rEFInd 的文件夹内。
KeyTool
安装 。
将 KeyTool EFI 二进制文件放在 或者 esp/EFI/tools/ 中,并命名为 或 。
关于签名 的指导,请参考 Secure Boot#Using KeyTool。
GPT fdisk (gdisk)
下载 gdisk EFI 应用 并将 复制到 esp/EFI/tools/。
关机或重启
据报道,rEFInd 内置了关机和重启菜单项。由于这个工具列表是这个 wiki 中的同类工具中最广泛的,因此 UEFI shell 或其他 UEFI 引导管理器(如 systemd-boot )的用户可能会对 powerofforreboot.efiAUR 感兴趣。
提示与小技巧
在 UEFI shell 中使用驱动
要在 UEFI shell 中使用 rEFInd 的驱动,请使用 命令来加载它们,并使用 来刷新驱动器映射。
Shell> load FS0:\EFI\refind\drivers\ext4_x64.efi Shell> map -r
现在你可以从 UEFI shell 访问你的文件系统了。
设置 efifb 分辨率
如果 中的分辨率被设置为一个不正确的值,在除了 Apple Mac 的所有系统中, rEFInd 都会展示一个支持的分辨率列表。对于 Apple Mac, 它会静默使用默认分辨率。
要确定 efifb 支持的帧缓冲区分辨率,请 将 复制到 ESP 的根目录。进入 UEFI shell 并运行 modelist.efi。
在 中设置一个。重启并用 来检查设置是否已被应用。
自动检测
要允许在 Btrfs 子卷上进行内核自动检测,请取消注释并编辑 中的 。
然后在 中将 添加到 rootflags,之后将 添加到 initrd 路径之前。
手动启动项
如果将一个 btrfs 子卷作为根目录引导,请将子卷的路径预先添加到 loader 和 initrd 路径之前,并用 修改 行。在下面的示例中,root 已作为名为“ROOT”的btrfs子卷挂载(例如 mount -o subvol=ROOT /dev/sdxY /mnt):
如果失败将导致以下错误信息:
LoaderDevicePartUUID
从 0.13.1 版本开始,rEFInd 支持设置 UEFI 变量 LoaderDevicePartUUID。启用此选项允许 自动挂载 EFI 系统分区,而无需在 中指定它。请参阅 systemd#GPT partition automounting。
对于 rEFInd, 要设置 , 请编辑 并取消注释 :
您可以通过使用 cat /sys/firmware/efi/efivars/LoaderDevicePartUUID-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f 检查它的值,或者通过查看 输出中 “Boot loader sets ESP partition information” 的状态来验证它是否已设置。
疑难解答
Apple Macs
AUR 上的 是 "bless" 工具的实验性替代品。如果它不能正常工作, 在 OS X 中使用 "bless" 来将 rEFInd 设置为默认启动项。
# bless --setBoot --folder esp/EFI/refind --file esp/EFI/refind/refind_x64.efi
VirtualBox
6.1 版本之前的 VirtualBox 将只引导默认的 路径,因此 至少需要与 选项一起使用。有关详细信息,请参阅 VirtualBox/Install Arch Linux as a guest#Installation in EFI mode on VirtualBox < 6.1。
参见
- The rEFInd Boot Manager by Roderick W. Smith.
- Wikipedia:rEFInd
- rEFInd discussion forum on Sourceforge