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(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 会扫描你的所有的驱动器(它有驱动的那些)并为它找到的每一个 EFI bootloader 添加一个启动入口,其中就包含你的内核(因为 Arch 默认启用了 EFISTUB )。因此你在这时候就可能有一个可以启动的系统。
Secure Boot
要在 rEFInd 中使用 Secure Boot,请参考 Managing 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。
更多信息参见 refind-install(8)。
使用 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
进入 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-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/
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=
更改为正确的更新命令。如果您进行了#手动安装,则可以创建自己的更新脚本以使用钩子进行调用。
refind-install
命令中额外添加选项 --yes
。如果在禁用 Secure Boot 后执行该命令,它将防止该命令失败。更多信息参见 refind-install(8)。/boot
,而你依靠自动挂载来挂载它,请确保按照 EFI system partition#Alternative mount points 来预加载 vfat
模块。否则,如果 refind与内核一起升级,ESP 将变得不可访问。配置
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_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_linux.conf
中的 %v
}(通过从文件名中提取if)。为了使 rEFInd 支持Arch Linux内核,必须按照 #对于 rEFInd 自动检测到的内核中的说明编辑 esp/EFI/refind/refind.conf
中的 extra_kernel_version_strings
。 无需配置的情况
如果你仅将 rEFInd 安装到 ESP 上并毫不费力地启动它(例如通过 UEFI Shell 或 KeyTool,或直接从固件),您仍然可以通过自动检测从启动菜单,而无需进行任何配置。
这之所以可行,是因为 rEFInd 具有回退机制,可以:
- 通过 Discoverable Partitions Specification 或者
/etc/fstab
分辨 root 分区(对于root=
参数)。 - 从 GPT partition attributes 检测内核选项 (
ro
或者rw
)。 (使用属性60
"read-only") 或者/etc/fstab
。
/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系统分区)。
-
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 引导程序。
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.efi
到 EFI 分区 的根目录。
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
参照 #使用 PreLoader, HashTool.efi
将被放在 rEFInd 的文件夹内。
MokManager
参照 #使用 shim,MokManager 将被放在 rEFInd 的文件夹内。
KeyTool
安装 efitools。
将 KeyTool EFI 二进制文件放在 esp/
或者 esp/EFI/tools/
中,并命名为 KeyTool.efi
或 KeyTool-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。
参见
- The rEFInd Boot Manager by Roderick W. Smith.
- Wikipedia:rEFInd
/usr/share/refind/docs/README.txt
- rEFInd discussion forum on Sourceforge