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 並確保其中的 內核參數 對於你的系統是正確的,否則下次啟動可能會出現內核錯誤。
默認情況下,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。
首先,將可執行文件複製到 ESP:
# 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#通過標籤。如果未指定 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支持運行各種第三方工具。工具需要單獨安裝。在 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