跳转至内容

Limine

来自 ArchWiki

Limine 是一个高级的、可移植的、支持多协议的引导加载程序。它最初是作为 Limine 引导协议的参考实现而开发的,但也支持引导 Linux 以及链式加载其他引导加载程序。

注意:在整篇文章中,esp 表示 EFI 系统分区(即 ESP)的挂载点。

支持的文件系统

Limine 支持 FAT12FAT16FAT32ISO9660。根据 Limine 的设计哲学,支持的文件系统列表是刻意限制的。

注意:这并不意味着 Limine 无法引导使用其他文件系统作为根分区的操作系统;它只是意味着内核、initramfs 以及引导时所需的任何其他文件都必须位于 FAT 分区(例如 UEFI 系统上的 ESP)上。

安装

安装 limine 软件包。

请遵循 #部署引导加载程序#配置 中的说明。

部署引导加载程序

UEFI 系统

注意:如果安装在 32 位 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。有关块设备命名方案的描述,请参阅 Device file#Block device names
  • Y 是 ESP 的分区索引,因此如果 ESP 是 /dev/sda1,那么 Y 应该是 1
注意:阅读 efibootmgr 及其文档,了解有关如何添加、删除、更改和排序引导条目的更多信息。

使用 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

注意:在 Limine 配置文件中,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

注意:当添加位于不同磁盘上的引导条目时,Limine 可能会失败并报错 Failed to open image with path: ... is the path correct? 在某些系统上,这可能是因为当启用了快速引导(Fast Boot)时,固件在引导过程中没有初始化所有存储设备。一些固件实现提供了强制初始化所有磁盘的选项,这可能会解决该问题。否则,可能需要禁用快速引导。


提示:如果您从启用了 安全引导 (Secure Boot) 的 UEFI 系统引导,请考虑保护 Limine 配置文件和资源文件(如内核和模块)。事实上,任何能够访问存储配置文件和所需资源的 FAT 分区的人都可以更改这些文件,即使在安全引导下也是如此。

为了防止这种情况,可以首先在配置文件中嵌入每个资源文件的 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

注意:请记住,设备路径可能会随着设备的添加或删除、将安装迁移到不同机器以及其他因素而改变。这可能会导致 BIOS 钩子意外地在不需要的设备上安装 Limine。
/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 自动集成内核(initramfsUKI),请安装:

或者

这两个工具都包含用于自动处理内核条目的 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 为 initramfsUKI 自动生成的备用映像。
  • (可选)如果您更喜欢使用 UKI 引导,请将 ENABLE_UKI 设置为 yes
提示: UKI 的优点:
  • systemd-bootrEFInd 可以自动加载由该工具生成的 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
  • 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 将引导分区设置为只读,以防止意外的递归写入。它默认被禁用。

查看有关 钩子 的更多信息。

提示:使用 limine-entry-tool 手动管理内核

如果您不使用 initramfs 工具或使用其他工具(如 booster),limine-entry-toolAUR 不提供 initramfs 生成,也不包含用于内核管理的自动 pacman 钩子。您可以随意使用带有所需选项的 limine-entry-tool 命令创建自定义脚本来管理(添加、更新和删除)引导条目。

Btrfs 的 Snapper 快照集成

limine-snapper-syncAUR 工具提供了 Snapper 与 Limine 引导加载程序之间的集成。它在以下方面非常有用:

  • 引导到选定的 Snapper 快照。
  • 提供 3 种恢复系统快照的不同方法:rsyncreplace 或原生 snapper
  • 在恢复快照后,向 Limine 引导加载程序添加一个“备份”快照条目,以便在需要时轻松回滚。
  • 通过从包含相同可引导文件的最新创建的快照中复制文件,自动修复引导分区上损坏的可引导文件。
  • 如果两个独立生成的引导文件哈希不匹配,则自动通知桌面有关潜在的硬件问题。
  • 通过多个独立的根子卷支持类似 A/B 的系统,每个子卷都有自己的 Limine 快照条目,需要唯一的 machine-ID 和内核命令行中的自定义子卷路径才能引导。
  • 测试只读快照:使用 overlayfs 在不可变系统上测试任何已安装的软件包,而无需修改原始数据。请注意,这并不意味着测试引导分区或单独的 home 子卷/分区。
提示: 启用 OverlayFS

对于 dracut,使用 limine-dracut-supportAUR 时,btrfs-snapshot-overlay 模块可以直接工作。

对于 mkinitcpio,在 filesystems 钩子之后手动添加 btrfs-overlayfssd-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。

注意:如果您正在使用 GNOME,请注意 GDM 需要写入访问权限,无法从只读快照启动。您需要一个 OverlayFS 解决方案来提供临时的可写层。

目录路径 /usr/lib/modules/* 必须与 / 位于同一个根子卷中,因为选定的快照在引导期间需要此路径下的匹配内核模块。否则,快照将无法引导。

配置

注意:建议 ESP 的大小大于 4 GiB,具体取决于您计划安装多少个可引导快照、内核版本和大型早期引导模块(例如 NVIDIA 或 Wi‑Fi 驱动程序)。
提示: 自动引导配置

使用 limine-dracut-supportlimine-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 中的故障排除指南

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.