跳转至内容

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。请参阅 设备文件#块设备名称 以了解块设备命名方案的说明。
  • Y 是 ESP 的分区索引,因此如果 ESP 是 /dev/sda1,则 Y 应为 1
注意 有关如何添加、删除、更改和排序引导条目的更多信息,请阅读 efibootmgr 及其文档。

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

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

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


提示 如果您正在使用 安全启动启用的 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 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

注意 请记住,设备路径可能会随着设备的添加或删除、将安装迁移到不同机器以及其他因素而改变。这可能导致 BIOS hook 意外地将 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 在先前步骤中安装到的**磁盘**(**不是分区**)。

技巧与提示

引导条目自动化

要自动化内核集成(initramfsUKI)与 Limine,请安装

或者

这两个工具都包含 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 对 initramfsUKI 的自动备用生成。
  • (可选)如果您倾向于使用 UKI 进行引导,请将 ENABLE_UKI 设置为 yes
提示 **UKI 的优点:**
  • systemd-bootrEFInd 可以自动加载由该工具生成的 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
  • limine-scan 检测活动的 EFI 引导条目(双重引导),并允许您轻松地将它们添加到 Limine。
提示 使用 limine-entry-tool 手动管理内核

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

Btrfs 的 Snapper 快照集成

limine-snapper-syncAUR 工具提供了 Snapper 和 Limine 引导加载程序之间的集成。它对于以下方面很有用:

  • 引导到选定的 Snapper 快照。
  • 提供 3 种不同的方法来恢复系统快照:rsyncreplace 或原生 snapper
  • 在恢复快照后,向 Limine 引导加载程序添加一个“备份”快照条目,以便在需要时可以轻松回滚。
  • 当创建包含相同可引导文件的新快照时,自动修复 ESP 上已损坏的可引导文件。
  • 如果 ESP 上相同可引导文件的两个哈希不匹配,则自动记录有关潜在硬件问题的错误消息。
  • 测试只读快照:使用 overlayfs 在类不可变系统中测试已安装的软件包,而无需修改原始数据。请注意,这不包括测试引导分区或单独的 home 子卷/分区。
提示 **启用 OverlayFS**

对于 dracut,在使用 limine-dracut-supportAUR 时,btrfs-snapshot-overlay 模块开箱即用。

对于 mkinitcpio,在 filesystems hook 之后手动添加 btrfs-overlayfssd-btrfs-overlayfs hook。两者都由 limine-mkinitcpio-hookAUR 提供。
在使用 systemd hooks 时,请使用 sd-btrfs-overlayfs,因为 btrfs-overlayfs 不兼容。

注意 如果您正在使用 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 是可选的,但对于自动识别非常有帮助。重命名 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-enrolllimine-enroll-config,这些命令由 limine-dracut-supportAURlimine-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 中的故障排除指南

参见

© . 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.