Limine
Limine 是一个先进、便携、多协议的 引导加载程序,最初是作为 Limine 引导协议的参考实现而开发的,但也支持引导 Linux 以及链式加载其他引导加载程序。
esp 表示 EFI 系统分区(也称为 ESP)的挂载点。支持的文件系统
Limine 支持 FAT12、FAT16、FAT32 和 ISO9660。支持的文件系统列表根据 Limine 的 设计理念 被有意地限制了。
安装
安装 limine 包。
部署引导加载程序
UEFI 系统
BOOTX64.EFI 文件名替换为 BOOTIA32.EFI。在 UEFI 系统上部署 Limine 涉及将 /usr/share/limine/BOOTX64.EFI 文件复制到 EFI 系统分区,并使 UEFI BIOS 了解它。
# mkdir -p esp/EFI/arch-limine # cp /usr/share/limine/BOOTX64.EFI esp/EFI/arch-limine/
efibootmgr 创建的自定义固件启动项不起作用或被忽略**,建议将 BOOTX64.EFI 文件复制到 esp/EFI/BOOT/BOOTX64.EFI,这是默认的引导加载程序应用程序搜索位置,并跳过本节的其余部分。Limine 不会自动在 NVRAM 中添加引导加载程序的条目。请使用 efibootmgr 为 Limine 设置条目。
要做到这一点,可以执行以下操作:
# efibootmgr \
--create \
--disk /dev/sdX \
--part Y \
--label "Arch Linux Limine Boot Loader" \
--loader '\EFI\arch-limine\BOOTX64.EFI' \
--unicode
/dev/sdX是 ESP 所在的**磁盘**(**不是分区**)。例如/dev/sda或/dev/nvme0n1。请参阅 设备文件#块设备名称 以了解块设备命名方案的说明。Y是 ESP 的分区索引,因此如果 ESP 是/dev/sda1,则Y应为1。
使用 MBR 的 BIOS 系统
在 BIOS 系统上部署 Limine 涉及将 /usr/share/limine/limine-bios.sys 文件复制到 Limine 需要引导的文件,该文件包含 Limine 需要的第 3 阶段代码,复制到磁盘的根目录、/boot、/limine 或 /boot/limine 目录中的任何分区,只要文件系统受支持即可。这通常意味着需要使用 FAT 分区作为 /boot,并将 limine-bios.sys 文件复制到 /boot/limine。
例如:
# mkdir -p /boot/limine # cp /usr/share/limine/limine-bios.sys /boot/limine/
然后,需要将早期阶段的引导加载程序代码部署到磁盘
# limine bios-install /dev/sdX
/dev/sdX 是要安装 Limine 的**磁盘**(**不是分区**)。例如 /dev/sda 或 /dev/nvme0n1。这必须是承载 /boot 分区的磁盘。请参阅 设备文件#块设备名称 以了解块设备命名方案的说明。
使用 GPT 的 BIOS 系统
要为从 GPT 分区磁盘引导的 BIOS 部署 Limine,需要指定一个 GPT 分区来存储早期阶段的引导加载程序代码(这除了 FAT 引导分区之外,通常挂载在 /boot,如前一节所述)。此分区的大小必须至少为 32 KiB,并且不应格式化为文件系统或挂载。
在磁盘上创建一个没有文件系统且分区类型 GUID 为 21686148-6449-6E6F-744E-656564454649 的分区。
- fdisk:创建分区并使用
t命令将**分区类型**更改为BIOS boot。 - gdisk:创建类型为
ef02的分区。 - GNU Parted:创建分区并设置
bios_grub标志。
然后将早期阶段的引导加载程序代码部署到磁盘和分区。
# limine bios-install /dev/sdX partition_number
/dev/sdX 是要安装 Limine 的**磁盘**(**不是分区**)。例如 /dev/sda 或 /dev/nvme0n1。这必须是承载 /boot 分区的磁盘。请参阅 设备文件#块设备名称 以了解块设备命名方案的说明。
如果省略分区号,limine bios-install 将尝试自动检测它。
与 BIOS/MBR 情况一样,必须将 limine-bios.sys 文件复制到磁盘的任何分区中,可以是根目录、/boot、/limine 或 /boot/limine 目录,使用受支持的文件系统,与部署了早期阶段引导加载程序代码的同一磁盘上。
UEFI + BIOS 可引导驱动器
只要驱动器是 MBR 格式的,并且包含一个 EFI 系统分区(可以是与 BIOS 系统使用的 /boot 分区相同的分区),就可以同时遵循 BIOS 和 UEFI 部署过程,以创建能够同时在传统 BIOS 和 UEFI 系统上引导的驱动器。例如,这对于将操作系统安装到 USB 闪存驱动器上很有用,该驱动器将用于多个可能支持也可能不支持 UEFI 的系统,或者方便在系统之间移动硬盘。
配置
limine 不提供默认配置文件,因此需要创建它。此文件对于让 Limine 知道哪些操作系统可供引导至关重要。配置文件有很多选项,因为 Limine 允许相当程度的自定义。有关配置文件、其格式和选项的详细文档可以在 此处找到。
对于 UEFI 系统,配置文件可以与 Limine EFI 可执行文件位于同一目录中,这是它首先搜索的地方(推荐,因为它允许安装具有不同配置的多个 Limine 实例,而不会发生冲突)。
对于 BIOS 系统(或对于未将配置文件放在 Limine 可执行文件旁边的 UEFI 系统),配置文件必须位于 Limine 部署的驱动器上的分区根目录、/boot、/limine 或 /boot/limine 目录中,只要该分区的文件系统受支持。
配置文件必须命名为 limine.conf。
boot():/ 代表 limine.conf 所在的分区。下面是一个简单的配置文件示例,其中包含 1 个引导菜单条目,描述了一个典型的 Arch Linux 内核和 initramfs。
limine.conf
timeout: 5
/Arch Linux
protocol: linux
path: boot():/vmlinuz-linux
cmdline: root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
module_path: boot():/initramfs-linux.img
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 是根文件系统的 UUID。
如果 /boot 分区(其中包含内核和 initramfs)与 limine.conf 文件所在的分区不匹配(例如,在具有额外 /boot 分区但非 ESP 的 UEFI 系统上,并且 limine.conf 放在 ESP 上),则可能需要在配置文件中将 boot():/ 替换为 uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx):/,其中 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 代表 /boot FAT 分区的 PARTUUID。
Failed to open image with path: ... is the path correct? 而失败。在某些系统上,这可能是因为固件在启动时未初始化所有存储设备,而快速启动又被启用。某些固件实现提供了强制初始化所有磁盘的选项,这可能会解决问题。否则,可能需要禁用快速启动。
为防止这种情况发生,可以首先在配置文件中嵌入每个资源文件的 BLAKE2B(b2sum)校验和。Limine 文件路径有一个可选字段,包含文件的 BLAKE2B 校验和。可以通过附加 # 字符,然后是**128 个字符**的校验和来指定此字段。
boot():/path#checksum
然后,为了保护配置文件本身,可以使用以下命令将配置文件的 BLAKE2B 校验和嵌入 Limine EFI 可执行文件中(其中 checksum 代表配置文件自身的 BLAKE2B 校验和)。
limine enroll-config /path/to/deployed/limine.efi checksum
Limine EFI 可执行文件现在知道了配置文件的 BLAKE2B 校验和,可以进行签名(请参阅 sbctl(8))并安全加载。
Memtest86+
将以下条目之一添加到配置文件中。
对于 UEFI,安装 memtest86+-efi 并添加
limine.conf
/Memtest86+
protocol: efi
path: boot():/memtest86+/memtest.efi
对于 BIOS,安装 memtest86+ 并添加
limine.conf
/Memtest86+
protocol: linux
path: boot():/memtest86+/memtest.bin
Windows 条目 (UEFI)
将以下内容添加到配置文件中:
limine.conf
/Windows
protocol: efi
path: boot():/EFI/Microsoft/Boot/bootmgfw.efi
或者,如果 limine.conf 不在 ESP 上,请将 boot():/ 替换为 uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx):/,其中 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 是 ESP 的 PARTUUID。
pacman hook
虽然不是强制性的,但设置一个 pacman hook 以在 Limine 升级时部署 Limine 可能会很有用。
UEFI
- 如果使用的不是
esp/EFI/arch-limine(例如esp/EFI/BOOT),请确保替换 ESP 目录路径。 - 如果使用 32 位 UEFI 系统,请确保将
BOOTX64.EFI替换为BOOTIA32.EFI。
/etc/pacman.d/hooks/99-limine.hook
[Trigger] Operation = Install Operation = Upgrade Type = Package Target = limine [Action] Description = Deploying Limine after upgrade... When = PostTransaction Exec = /usr/bin/cp /usr/share/limine/BOOTX64.EFI esp/EFI/arch-limine/
BIOS
/etc/pacman.d/hooks/99-limine.hook
[Trigger] Operation = Install Operation = Upgrade Type = Package Target = limine [Action] Description = Deploying Limine after upgrade... When = PostTransaction Exec = /bin/sh -c "/usr/bin/limine bios-install /dev/sdX && /usr/bin/cp /usr/share/limine/limine-bios.sys /boot/limine/"
/dev/sdX是 Limine 在先前步骤中安装到的**磁盘**(**不是分区**)。
技巧与提示
引导条目自动化
要自动化内核集成(initramfs 或 UKI)与 Limine,请安装
- limine-dracut-supportAUR 用于 Dracut
或者
这两个工具都包含 pacman hook,用于自动处理内核条目。
- 在更新或重新安装 Limine 时,其 EFI 映像会自动部署到 x86_64 架构的 UEFI 系统的 ESP 上。
- 在使用传统 BIOS 或 ARM 或 RISC-V 等替代 CPU 架构时,EFI 二进制文件的自动部署将被禁用。在这些情况下,必须将特定的 Limine 二进制文件手动部署到您的引导分区。
一些不符合标准的 UEFI 主板(例如,某些 **MSI** 主板)具有非标准或损坏的 EFI 实现。它们可能无法与 efibootmgr 或基于内核的 UEFI 检测一起正常工作。
要跳过 UEFI 检测和注册,并将 Limine 设置为位于标准 EFI 路径 esp/EFI/BOOT/BOOTX64.EFI 的备用引导加载程序,请运行:
# limine-install --skip-uefi --fallback
之后,打开 BIOS 设置并更改引导顺序,使标准 EFI 路径成为默认引导选项。
配置
(可选)如果 /etc/default/limine 不存在,请将其从 /etc/limine-entry-tool.conf 复制。
编辑 /etc/default/limine。
- 如果
bootctl --print-esp-path未检测到您的 ESP,请手动将ESP_PATH设置为您想要使用的任何已挂载的 FAT32 引导分区。然后运行limine-install来安装 Limine EFI 二进制文件。 - (可选)设置
KERNEL_CMDLINE[default]+=以及您偏好的完整 内核参数。
- 如果不确定要使用哪些内核参数,请从
/proc/cmdline复制到KERNEL_CMDLINE[default]=,**但不要从 Live ISO、临时环境或快照执行此操作。** - 如果未设置
KERNEL_CMDLINE[default]=或KERNEL_CMDLINE=,该工具将首先尝试从文件/etc/kernel/cmdline读取。如果不可用,它将回退到从/proc/cmdline读取。 - 可选地,
KERNEL_CMDLINE[fallback]=应用于包含名称为 fallback 的内核条目。 - 此外,
KERNEL_CMDLINE[kernel name]=对应于启动菜单中的内核条目名称,允许每个内核条目具有唯一的内核命令行/参数。例如,KERNEL_CMDLINE[linux-lts]=用于 linux-lts 内核条目。 KERNEL_CMDLINE[key]+=将内核参数附加到/etc/limine-entry-tool.d/*.conf下的下放配置文件中定义的现有KERNEL_CMDLINE[key]值。相反,KERNEL_CMDLINE[key]=根据配置优先级完全替换它们。
注意: /etc/default/limine 具有最高优先级,并且会覆盖所有下放配置。因此,建议使用 += 来附加内核参数。示例:
KERNEL_CMDLINE[default]+="rw root=UUID=..."KERNEL_CMDLINE[default]+="quiet splash"
- (可选)为了节省 ESP 空间,将
DRACUT_FALLBACK设置为no以禁用 Dracut 对 initramfs 或 UKI 的自动备用生成。 - (可选)如果您倾向于使用 UKI 进行引导,请将
ENABLE_UKI设置为yes。
- systemd-boot 或 rEFInd 可以自动加载由该工具生成的 UKI。
- 如果安装并启用了 sbctl,该工具可以在更新或安装内核时自动使用您的安全启动密钥对 UKI 进行签名。
- (可选)将
FIND_BOOTLOADERS设置为yes以检测并添加 systemd-boot、rEFInd 或默认 EFI 加载程序到 Limine(如果它们存在于同一 ESP 中)。 - (可选)将
ENABLE_LIMINE_FALLBACK设置为yes以使 Limine EFI 条目成为默认的备用项。某些主板会在固件更新清除自定义引导条目时自动引导此项。 - (可选)安装 kernel-modules-hook 以在内核升级失败时保留内核,确保系统在重启后仍可运行。
limine-update 以重新生成 limine.conf。有关更多配置选项,请参阅 limine-entry-tool README。
命令
limine-install将 Limine 安装到您的 EFI 系统分区。
limine-install --fallback将 Limine 安装为默认的备用引导加载程序。
limine-update更新 Limine 并根据您的 initramfs 生成器生成 initramfs 或 UKI。- 对于 mkinitcpio:运行
limine-mkinitcpio而不是mkinitcpio。 - 对于 dracut:运行
limine-dracut而不是dracut。
- 对于 mkinitcpio:运行
limine-scan检测活动的 EFI 引导条目(双重引导),并允许您轻松地将它们添加到 Limine。
如果您不使用 initramfs 工具或使用 booster 等其他工具,limine-entry-toolAUR 不提供 initramfs 生成,也不包含用于内核管理的自动 pacman hooks。您可以自由创建自定义脚本,使用 limine-entry-tool 命令及其所需的选项来管理(添加、更新和删除)引导条目。
Btrfs 的 Snapper 快照集成
limine-snapper-syncAUR 工具提供了 Snapper 和 Limine 引导加载程序之间的集成。它对于以下方面很有用:
- 引导到选定的 Snapper 快照。
- 提供 3 种不同的方法来恢复系统快照:
rsync、replace或原生snapper。 - 在恢复快照后,向 Limine 引导加载程序添加一个“备份”快照条目,以便在需要时可以轻松回滚。
- 当创建包含相同可引导文件的新快照时,自动修复 ESP 上已损坏的可引导文件。
- 如果 ESP 上相同可引导文件的两个哈希不匹配,则自动记录有关潜在硬件问题的错误消息。
- 测试只读快照:使用 overlayfs 在类不可变系统中测试已安装的软件包,而无需修改原始数据。请注意,这不包括测试引导分区或单独的 home 子卷/分区。
对于 dracut,在使用 limine-dracut-supportAUR 时,btrfs-snapshot-overlay 模块开箱即用。
对于 mkinitcpio,在 filesystems hook 之后手动添加 btrfs-overlayfs 或 sd-btrfs-overlayfs hook。两者都由 limine-mkinitcpio-hookAUR 提供。
在使用 systemd hooks 时,请使用 sd-btrfs-overlayfs,因为 btrfs-overlayfs 不兼容。
目录路径 /usr/lib/modules/* 必须与 / 位于同一个根子卷中,因为选定的快照在引导期间需要来自此路径的匹配内核模块。否则,快照将无法引导。
配置
使用 limine-dracut-support 或 limine-mkinitcpio-hook(参见 #引导条目自动化)可以在内核安装、更新或删除时自动更新 esp/limine.conf 中的内核引导条目。这允许您跳过第一个配置步骤。
1. 将 esp/limine.conf 配置为包含 //Snapshots 或 /Snapshots 关键字以自动生成快照条目。
一个例子:
limine.conf
/+Arch Linux
comment: Any comment
comment: machine-id=yyyyyyyyyyyyyyyyyy
//Linux
protocol: linux
path: boot():/vmlinuz-linux
cmdline: root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw rootflags=subvol=/@
module_path: boot():/initramfs-linux.img
//Snapshots
- 包含来自
/etc/machine-id的 machine-id 是可选的,但对于自动识别非常有帮助。重命名 OS 名称无关紧要。 - 可引导文件必须放置在与 limine.conf 相同的 ESP 中,因为仅支持
boot():函数。
2.(可选)如果 /etc/limine-snapper-sync.conf 中的配置尚不存在,请将其复制到 /etc/default/limine。
编辑 /etc/default/limine,这将覆盖 /etc/limine-snapper-sync.conf。
- 如果
bootctl --print-esp-path未检测到您的 ESP,请手动将ESP_PATH设置为您的 ESP/boot 挂载点。 - (可选)设置
MAX_SNAPSHOT_ENTRIES以限制快照条目的数量。默认值为 8。 - (可选)设置
LIMIT_USAGE_PERCENT以在 ESP 使用率超过限制时停止创建新的快照条目。默认值为 85。
- 如果使用**自定义** Snapper 布局,请务必配置以下内容:
- 指定
ROOT_SUBVOLUME_PATH以指向您的根子卷的路径。在大多数情况下,默认值为/@。 - 指定
ROOT_SNAPSHOTS_PATH以指向您的根快照的路径。默认值为/@/.snapshots,这是根子卷/@的标准 Snapper 布局。
- 指定
3. 运行命令以检查它是否成功或显示错误消息:
# limine-snapper-sync
limine-reset-enroll 和 limine-enroll-config,这些命令由 limine-dracut-supportAUR、limine-mkinitcpio-hookAUR 或未安装的 limine-entry-toolAUR 提供。如果您不使用它们,可以安全地忽略此错误。或者,要防止此错误,请编辑 /etc/limine-snapper-sync.conf 以删除两行:
COMMANDS_BEFORE_SAVE="limine-reset-enroll"COMMANDS_AFTER_SAVE="limine-enroll-config"
4. 如果一切正常,则 启用/启动 limine-snapper-sync.service 以自动将引导条目与 Snapper 快照列表同步。
5. (可选)安装 snap-pac。它会触发 Snapper 在系统更新期间创建快照,然后 limine-snapper-sync 会同步这些快照以在 Limine 中生成相关的快照条目。
有关更多详细信息和附加配置选项,请参阅 limine-snapper-sync README。
命令
limine-snapper-sync将 Limine 快照条目与 Snapper 列表同步。limine-snapper-list显示当前的 Limine 快照条目。limine-snapper-info提供有关版本、可引导快照总数以及验证可引导文件的详细信息。limine-snapper-restore从选定的可引导快照恢复您的系统,包括匹配的内核版本。
已知问题
- 仅支持任何 Snapper 布局,不支持没有 Snapper 的任意 Btrfs 布局。
- 无法为在工具安装之前创建的旧快照生成可引导快照条目,因为这些快照通常不再具有相应的内核版本。
故障排除
遇到问题?查看 README 中的故障排除指南。