Limine
Limine 是一个高级的、可移植的、支持多协议的引导加载程序。它最初是作为 Limine 引导协议的参考实现而开发的,但也支持引导 Linux 以及链式加载其他引导加载程序。
esp 表示 EFI 系统分区(即 ESP)的挂载点。支持的文件系统
Limine 支持 FAT12、FAT16、FAT32 和 ISO9660。根据 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/
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。有关块设备命名方案的描述,请参阅 Device file#Block device names。Y是 ESP 的分区索引,因此如果 ESP 是/dev/sda1,那么Y应该是1。
使用 MBR 的 BIOS 系统
在 BIOS 系统上部署 Limine,需要将 /usr/share/limine/limine-bios.sys 文件(包含 Limine 引导所需的第 3 阶段代码)复制到 Limine 将被部署的分区(只要文件系统受支持)的根目录、/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 分区的磁盘。有关块设备命名方案的描述,请参阅 Device file#Block device names。
使用 GPT 的 BIOS 系统
要从 GPT 分区磁盘部署用于 BIOS 引导的 Limine,需要指定一个用于存储早期引导加载程序代码的 GPT 分区(这除了上一节中解释的通常挂载在 /boot 的 FAT 引导分区之外)。此分区的大小必须至少为 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 分区的磁盘。有关块设备命名方案的描述,请参阅 Device file#Block device names。
如果省略分区号,limine bios-install 将尝试自动检测它。
与 BIOS/MBR 的情况一样,必须使用受支持的文件系统,将 limine-bios.sys 文件复制到早期引导加载程序代码部署所在磁盘的任一分区的根目录、/boot、/limine 或 /boot/limine 目录中。
UEFI + BIOS 可引导驱动器
只要驱动器是 MBR 格式化的,并且包含一个 EFI 系统分区(可以是 BIOS 系统所使用的 /boot 分区),就可以同时执行 BIOS 和 UEFI 部署程序,从而创建一个既能在传统 BIOS 又能在 UEFI 系统上引导的驱动器。这对于将操作系统安装在 USB 闪存盘上非常有用,例如需要在不支持 UEFI 或支持 UEFI 的多台机器上使用,或者为了方便在不同系统间迁移硬盘。
配置
limine 不提供默认配置文件,因此必须创建一个。此文件对于告诉 Limine 有哪些可引导的操作系统是必需的。由于 Limine 允许相当程度的自定义,配置文件有很多选项。有关配置文件、其格式和选项的详细文档,可以在此处找到。
对于 UEFI 系统,配置文件可以驻留在与 Limine EFI 可执行文件相同的目录中,系统会首先在此处搜索(推荐,因为它允许安装多个带有不同配置的 Limine 实例,且不会冲突)。
对于 BIOS 系统(或未将配置文件与 Limine 可执行文件放在一起的 UEFI 系统),配置文件需要驻留在 Limine 部署所在驱动器上任一分区的根目录、/boot、/limine 或 /boot/limine 目录中,只要该分区的文件系统受支持即可。
配置文件必须命名为 limine.conf。
boot():/ 表示 limine.conf 所在的分区。以下是一个简单的配置文件示例,其中包含一个引导菜单条目,描述了一个典型的 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。
如果内核和 initramfs 所在的 /boot 分区与 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? 在某些系统上,这可能是因为当启用了快速引导(Fast Boot)时,固件在引导过程中没有初始化所有存储设备。一些固件实现提供了强制初始化所有磁盘的选项,这可能会解决该问题。否则,可能需要禁用快速引导。
为了防止这种情况,可以首先在配置文件中嵌入每个资源文件的 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 钩子 以在 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 的磁盘(不是分区)。
技巧与提示
引导条目自动化
要使用 Limine 自动集成内核(initramfs 或 UKI),请安装:
- limine-dracut-supportAUR (针对 Dracut)
或者
- limine-mkinitcpio-hookAUR (针对 mkinitcpio)
这两个工具都包含用于自动处理内核条目的 pacman 钩子。
- 更新或重新安装 Limine 时,其 EFI 映像会自动复制到 UEFI x86_64 系统上的 ESP 路径
esp/EFI/limine/limine_x64.efi。 - 当使用传统 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/limine-entry-tool.conf,请将其复制到 /etc/default/limine。
编辑 /etc/default/limine:
- 如果
bootctl --print-esp-path未检测到您的 ESP,请手动将ESP_PATH设置为您要使用的任何已挂载的 FAT32 引导分区。然后运行limine-install来安装 Limine EFI 二进制文件。 - 如下所述配置永久的 内核参数。
- 如果您想为所有已安装的内核使用相同的 内核命令行,推荐和默认位置是
/etc/kernel/cmdline。大多数 initramfs 工具和 systemd 都支持此文件。 - 如果不确定要使用哪些内核参数,请从
/proc/cmdline复制它们,但不要从实时 ISO、临时环境或快照中执行此操作。 - 可选地,如果设置了
KERNEL_CMDLINE[default],它将优先于/etc/kernel/cmdline和/proc/cmdline。 - 可选地,
KERNEL_CMDLINE[fallback]=适用于包含名称 fallback 的内核条目。 - 此外,
KERNEL_CMDLINE[内核名称]=对应于引导菜单中的内核条目名称,允许每个内核条目拥有独特的 内核命令行。例如,针对 linux-lts 内核条目的KERNEL_CMDLINE[linux-lts]=。 KERNEL_CMDLINE[键]+=将内核参数附加到/etc/limine-entry-tool.d/*.conf下的嵌入配置文件中定义的现有KERNEL_CMDLINE[键]值。相比之下,KERNEL_CMDLINE[键]=根据配置优先级完全替换它们。- 支持从内核命令行解析并转换为非 UKI 条目的 Limine 模块路径的多个
initrd=参数。 - 命令行开头或结尾不需要引号,因为内部的引号不会被转义。
注意: /etc/default/limine 具有最高优先级,并覆盖所有嵌入配置。因此,在附加内核参数时,建议使用 +=。示例:
KERNEL_CMDLINE[default]+=rw root=UUID=...KERNEL_CMDLINE[default]+=quiet splash initrd=/amd-ucode.img
- (可选)为了节省 ESP 空间,请将
DRACUT_FALLBACK设置为no,以禁用 Dracut 为 initramfs 或 UKI 自动生成的备用映像。 - (可选)如果您更喜欢使用 UKI 引导,请将
ENABLE_UKI设置为yes。
- systemd-boot 或 rEFInd 可以自动加载由该工具生成的 UKI。
- 如果安装并启用了 sbctl,则该工具可以在更新或安装内核时使用您的安全引导密钥自动对 UKI 进行签名。
- (可选)将
FIND_BOOTLOADERS设置为yes,以便在 systemd-boot、rEFInd 或默认 EFI 加载程序存在于同一个 ESP 中时检测并将其添加到 Limine。 - (可选)安装 kernel-modules-hook 以在升级失败时保留内核,确保重启后系统的功能正常。
- (可选)将 Limine 安装为默认的 EFI 备用加载程序。如果自定义引导条目被 BIOS 固件或 Windows 更新删除,一些主板会自动引导此加载程序。
# limine-install --fallback
- (可选)要测试不同的自定义 Limine 二进制文件,请编辑
/etc/default/limine并添加:
SKIP_LIMINE_VERSION_CHECK=yes LIMINE_BINARY_PATH=/path/to/custom_limine.efi
这会跳过版本验证并使用您指定的 Limine 二进制文件进行安装到引导分区。
limine-update 以重新生成 limine.conf。有关更多配置选项,请参阅 limine-entry-tool README。
命令
limine-install将 Limine 安装到您的 EFI 系统分区。limine-update更新 Limine 并根据您的 initramfs 生成器生成 initramfs 或 UKI。- 对于 mkinitcpio:运行
limine-mkinitcpio而不是mkinitcpio。 - 对于 dracut:运行
limine-dracut而不是dracut。
- 对于 mkinitcpio:运行
limine-scan检测活动的 EFI 引导条目(双引导)并允许您轻松地将其添加到 Limine。limine-list以分层树状视图显示引导条目,默认深度为 3。- 按路径删除一个或多个匹配的引导条目,保留其可引导文件。position 选择目标匹配条目。默认值为 1。如果设置为 0,则删除所有匹配项。
# limine-remove-entry "entry name/sub-entry name/..." position
limine-enroll-config在启用安全引导时使用sbctl对二进制文件esp/EFI/limine/limine_x64.efi进行签名。
当在 /etc/default/limine 中设置 ENABLE_ENROLL_LIMINE_CONFIG=yes 时,limine-enroll-config 会将 esp/limine.conf 的校验和注册到 esp/EFI/limine/limine_x64.efi 中,然后再对其进行签名,以防止未经授权的修改。
启用此功能后,如果您修改了 limine.conf 却忘记重新注册它,由于 Limine 的安全限制,这将阻止引导。在这种情况下,禁用安全引导也无济于事。在启用此功能之前,请确保您拥有一个可靠的备用引导加载程序(无需签名和注册)以供恢复。
钩子
钩子位于以下目录中:
/etc/boot/hooks/pre.d/*在内核管理和更新引导分区上的esp/limine.conf之前执行。/etc/boot/hooks/post.d/*在内核管理和更新引导分区上的esp/limine.conf之后执行。
执行顺序基于文件名的词法排序。
可以通过在文件名后附加 .disabled 后缀来禁用钩子。
示例
1. /etc/boot/hooks/post.d/90-limine-enroll-config 将 Limine 配置校验和注册到 Limine 二进制文件中。
2. /etc/boot/hooks/post.d/91-example-esp-set-ro.disabled 将引导分区设置为只读,以防止意外的递归写入。它默认被禁用。
查看有关 钩子 的更多信息。
如果您不使用 initramfs 工具或使用其他工具(如 booster),limine-entry-toolAUR 不提供 initramfs 生成,也不包含用于内核管理的自动 pacman 钩子。您可以随意使用带有所需选项的 limine-entry-tool 命令创建自定义脚本来管理(添加、更新和删除)引导条目。
Btrfs 的 Snapper 快照集成
limine-snapper-syncAUR 工具提供了 Snapper 与 Limine 引导加载程序之间的集成。它在以下方面非常有用:
- 引导到选定的 Snapper 快照。
- 提供 3 种恢复系统快照的不同方法:
rsync、replace或原生snapper。 - 在恢复快照后,向 Limine 引导加载程序添加一个“备份”快照条目,以便在需要时轻松回滚。
- 通过从包含相同可引导文件的最新创建的快照中复制文件,自动修复引导分区上损坏的可引导文件。
- 如果两个独立生成的引导文件哈希不匹配,则自动通知桌面有关潜在的硬件问题。
- 通过多个独立的根子卷支持类似 A/B 的系统,每个子卷都有自己的 Limine 快照条目,需要唯一的 machine-ID 和内核命令行中的自定义子卷路径才能引导。
- 测试只读快照:使用 overlayfs 在不可变系统上测试任何已安装的软件包,而无需修改原始数据。请注意,这并不意味着测试引导分区或单独的 home 子卷/分区。
对于 dracut,使用 limine-dracut-supportAUR 时,btrfs-snapshot-overlay 模块可以直接工作。
对于 mkinitcpio,在 filesystems 钩子之后手动添加 btrfs-overlayfs 或 sd-btrfs-overlayfs 钩子。两者都由 limine-mkinitcpio-hookAUR 提供。
当使用 systemd 钩子 时,请使用 sd-btrfs-overlayfs,因为 btrfs-overlayfs 与其不兼容。
或者,当使用 systemd init 时,编辑:
/etc/default/limine
SNAPSHOT_KERNEL_PARAMETERS+=systemd.volatile=overlay
执行此操作时,请为 dracut 手动排除 btrfs-snapshot-overlay 模块,或者为 mkinitcpio 手动在 systemd 钩子之后添加 sd-volatile,然后重新构建 initramfs。
目录路径 /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 是可选的,但对于自动识别非常有帮助。重命名操作系统名称无关紧要。 - 可引导文件必须放置在与 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 挂载点。 - (可选)设置
LIMIT_USAGE_PERCENT以在超过引导分区使用限制时停止创建新的快照条目。默认值为 85。 - (可选)设置
MAX_SNAPSHOT_ENTRIES以限制快照引导条目的数量。默认值为 8,或者将其更改为auto。在auto模式下,当达到引导分区使用限制MAX_SNAPSHOT_ENTRIES时,旧的快照引导条目会自动删除,且不会发出警告。
- 如果使用 自定义 Snapper 布局,请确保配置以下内容:
- 为您的根子卷路径指定
ROOT_SUBVOLUME_PATH。在大多数情况下,默认值为/@。 - 为您的根快照路径指定
ROOT_SNAPSHOTS_PATH。默认值为/@/.snapshots,这是根子卷/@的标准 Snapper 布局。
- 为您的根子卷路径指定
3. 运行命令以检查它是否成功或显示错误消息:
# limine-snapper-sync
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从选定的可引导快照恢复您的系统,包括匹配的内核版本。limine-snapper-remove number1..number2删除快照引导条目以释放引导分区上的空间。它不会删除相应的 Snapper 快照。
已知问题
- 仅支持 Snapper 布局,不支持没有 Snapper 的任意 Btrfs 布局。
- 无法为在该工具安装之前创建的旧快照生成可引导快照条目,因为这些快照通常不再具有其相应的内核版本。
故障排除
遇到问题?查看 README 中的故障排除指南。