Limine

出自 ArchWiki

Limine 是一个先进的、可移植的、多协议的启动引导器,最初是作为 Limine 启动协议的参考实现而开发的,但也支持启动 Linux 以及链式加载其他启动引导器的能力。

注意: 在整篇文章中,esp 指的是 EFI 系统分区(也称为 ESP)的挂载点。

支持的文件系统

Limine 支持 FAT12FAT16FAT32ISO9660。 支持的文件系统列表是根据 Limine 的 设计理念 有意限制的。

安装

安装 limine 软件包。

安装 Limine 启动引导器

BIOS 系统

支持 MBR 和 GPT 分区设备,安装过程非常相似。

部署

核心启动引导器文件位于 /usr/share/limine/ 中。对于安装到 BIOS 系统而言,最重要的是 limine-bios.sys 文件,其中包含 Limine 启动所需的 stage 3 代码。此文件需要位于将要部署 Limine 的磁盘上任何分区(只要文件系统受支持)的根目录、/boot 目录、/limine 目录或 /boot/limine 目录中。

例如

# cp /usr/share/limine/limine-bios.sys /boot/

然后 stage 1 和 stage 2 需要部署到磁盘上。无论使用 MBR 还是 GPT,安装过程都是相同的,因为它会自动检测使用的方案并进行相应的安装

# limine bios-install /dev/sdX

其中 /dev/sdX 是要安装 Limine 的磁盘不是分区)。例如 /dev/sda/dev/nvme0n1。有关块设备命名方案的描述,请参阅 Device file#块设备名称

UEFI 系统

在 UEFI 系统上部署 Limine 涉及将 /usr/share/limine/BOOTX64.EFI 文件复制到 EFI 系统分区,通常是 esp/EFI/BOOT/BOOTX64.EFI,但也可以使用其他文件名,只要 UEFI BIOS 能够识别它们即可。与 GRUB 不同,Limine 不会在 NVRAM 中为启动引导器添加条目:使用 efibootmgr 为 Limine 设置条目。

UEFI+BIOS 可启动驱动器

只要驱动器是 GPT 格式化的,并且包含 EFI 系统分区,就可以同时遵循 BIOS 和 UEFI 部署程序,以创建一个能够在传统 BIOS 和 UEFI 系统上启动的驱动器。这非常有用,例如,在 USB 闪存驱动器上安装操作系统,该驱动器将在可能支持或可能不支持 UEFI 的多个系统上使用,或者为了方便在系统之间移动硬盘驱动器。

配置

limine 不附带默认配置文件,因此需要创建一个。此文件是必要的,用于告知 Limine 哪些操作系统可用于启动。配置文件有很多选项,因为 Limine 允许相当程度的自定义。有关配置文件的详细文档、其格式和选项,请参见 此处

配置文件与 limine-bios.sys 一样,需要位于部署 Limine 的驱动器上的分区(只要该分区的文件系统受支持)的根目录、/boot 目录、/limine 目录或 /boot/limine 目录中。配置文件必须命名为 limine.conf

注意: 在 Limine 配置中,boot():/ 代表 limine.conf 所在的分区。如果不存在单独的 /boot 分区,并且 limine.conf 而是位于根分区上,那么,在以下示例中,boot():/ 应改为 boot():/boot/

以下是一个简单的示例配置,其中包含 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

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

为了防止这种情况,您应该首先在配置中嵌入每个资源文件的 b2sum 校验和。 Limine 文件路径有一个可选字段,其中包含文件的 b2sum 校验和。可以通过附加 # 字符,然后附加 128 个字符的校验和来指定此字段


boot():/path#checksum
为了保护配置文件,您应该使用 limine enroll-config 命令将其 b2sum 嵌入到 EFI 可执行文件中。

Windows 条目

为了能够启动 Windows,我们需要知道 ESP 中 bootmgfw.efi 的路径。这可以通过进入 ESP 并使用以下命令来完成

$ find -name "bootmgfw.efi"
./EFI/Microsoft/Boot/bootmgfw.efi

我们现在需要做的就是将以下内容添加到配置中

limine.conf
/Windows
    protocol: efi
    path: boot():/EFI/Microsoft/Boot/bootmgfw.efi

从另一个磁盘启动

使用 efi 协议加载 UKI,并使用 uuid(分区 UUID): 指定路径,请参阅 UKI#Limine

pacman 钩子

虽然不是强制性的,但设置一个 pacman 钩子 在 Limine 升级时部署它可能很有用。

以下仅为示例。编辑路径和设备以匹配系统配置。

BIOS

注意: 请记住,设备路径可能会随着设备的添加或移除、将安装移动到不同的机器以及其他因素而更改。这可能会导致 BIOS 钩子意外地将 Limine 安装到不需要的设备上。
/etc/pacman.d/hooks/liminedeploy.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/"

UEFI

/etc/pacman.d/hooks/liminedeploy.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 /boot/EFI/BOOT/

技巧与诀窍

启动条目自动化

Dracut 支持

limine-dracut-supportAUR 专为喜欢使用 Dracut 生成 initramfsUKI 的用户而设计。它通过自动化 Limine 启动引导器中内核的添加和删除来简化内核管理。

注意: 当更新或重新安装 Limine 时,其 EFI 镜像会自动部署到 x86_64 架构 UEFI 系统上的 ESP。

配置

与其编辑 /etc/limine-entry-tool.conf,不如修改 /etc/default/limine,它优先于 /etc/limine-entry-tool.conf

1. 编辑 /etc/default/limine

  • ESP_PATH 设置为您的 ESP 路径。(或者,如果 bootctl 自动检测到 ESP,则无需配置 ESP_PATH)。
  • 使用您首选的 内核参数 设置 KERNEL_CMDLINE[default]=
提示
  • 如果未设置 KERNEL_CMDLINE[default]=KERNEL_CMDLINE=,该工具将首先尝试从文件 /etc/kernel/cmdline 中读取。如果不可用,它将回退到从 /proc/cmdline 读取。
  • 可选地,KERNEL_CMDLINE[fallback]= 应用于包含名称 fallback 的内核条目。
  • 此外,KERNEL_CMDLINE["kernel name"]= 条目对应于启动菜单中的内核条目名称,允许每个内核条目使用唯一的内核 cmdline/参数。例如,linux-lts 内核条目的 KERNEL_CMDLINE["linux-lts"]=
  • 为了节省 ESP 空间,将 DRACUT_FALLBACK 设置为 no 以禁用为 initramfsUKI 自动生成 fallback。
  • 如果您希望使用 UKI 启动,请将 DRACUT_UKI 设置为 yes
提示: UKI 的优势:
  • systemd-bootrEFInd 可以自动加载由该工具生成的 UKI。
  • 如果安装并启用了 sbctl,则该工具可以在更新或安装内核时使用您的安全启动密钥自动签名 UKI。
  • 如果 systemd-boot、rEFInd 或默认 EFI 加载器存在于同一 ESP 中,则将 FIND_BOOTLOADERS 设置为 yes 以检测并将它们添加到 Limine。
  • 2. 运行以下命令以生成 initramfs 或 UKI 并更新 esp/limine.conf

    # limine-update
    

    有关更多配置选项,请参阅 limine-entry-tool 的配置

    mkinitcpio 或其他 initramfs 工具

    limine-entry-tool-gitAUR 不包含用于自动化内核添加和删除的 initramfs 工具和 pacman 钩子

    1. 编辑 /etc/default/limine 以覆盖 /etc/limine-entry-tool.conf 中的任何设置

    • ESP_PATH 设置为您的 ESP 路径。(或者,如果 bootctl 自动检测到 ESP,则不需要配置 ESP_PATH)。
    • 使用您首选的 内核参数 设置 KERNEL_CMDLINE[default]=
    提示
    • 如果未设置 KERNEL_CMDLINE[default]=KERNEL_CMDLINE=,该工具将首先尝试从文件 /etc/kernel/cmdline 中读取。如果不可用,它将回退到从 /proc/cmdline 读取。
    • 可选地,KERNEL_CMDLINE["kernel name"]= 条目对应于启动菜单中的内核条目名称,允许每个内核条目使用唯一的内核 cmdline/参数。

    2. 安装您选择的 initramfs 工具(例如,mkinitcpiodracutbooster 或其他首选工具)。

    3. 编写一个脚本,例如 pacman 钩子,以使用 limine-entry-tool 命令和所需的选项来自动化内核的添加和删除,从而管理 Limine 启动菜单中的启动条目。

    有关更多详细信息,请参阅 limine-entry-tool README

    Snapper 快照与 Btrfs 的集成

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

    • 支持启动到选定的 Snapper 快照。
    • 提供两种不同的方法来还原系统快照:rsyncbtrfs
    • 还原快照后,将在 Limine 启动引导器中添加一个“备份”条目,从而提供了一种在需要时轻松恢复到“备份”的方法。
    • 当创建包含相同可启动文件的新快照时,自动修复 ESP 上旧快照中损坏的可启动文件。
    • 如果 ESP 上同一可启动文件的两个哈希值不匹配,则自动记录有关潜在硬件问题的错误消息。
    • 测试只读快照:使用 overlayfs 在类似不可变系统的系统上测试任何已安装的软件包,而无需修改原始数据。请注意,这并不意味着测试启动分区或单独的 home 子卷/分区。

    配置

    注意: 建议 ESP 的大小超过 1 GiB,具体取决于您希望安装的可启动快照和不同内核版本的数量。

    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
    注意

    仅选择一个关键字

    • //Snapshots 进入 OS 启动条目块内部。(默认,如果未设置)

    • /Snapshots 进入块外部。

    包含来自 /etc/machine-id 的 machine-ID 是可选的,但有助于自动识别。重命名启动条目不会影响该工具。

    2. 编辑 /etc/default/limine,这将覆盖 /etc/limine-snapper-sync.conf

    • ESP_PATH 设置为您的 ESP 路径(或者,如果 bootctl 自动检测到 ESP,则不需要配置 ESP_PATH)。
    • 设置 MAX_SNAPSHOT_ENTRIES 以限制快照条目的数量。默认值为 8。
    • 设置 LIMIT_USAGE_PERCENT 以在超出 ESP 使用限制时停止创建新的快照条目。默认值为 80。
    • 如果使用 自定义 Snapper 布局,请确保配置以下内容
      • 为您的根子卷路径指定 ROOT_SUBVOLUME_PATH。默认情况下在大多数情况下为 /@
      • 为您的根快照路径指定 ROOT_SNAPSHOTS_PATH。默认值为 /@/.snapshots,这是根子卷 /@ 的标准 Snapper 布局。

    3. 运行命令以检查是否成功或显示错误消息

    # limine-snapper-sync
    

    4. 如果它工作正常,则 启用 systemd 服务 limine-snapper-watcher.service,每当您的 Snapper 列表更改时,它会在您的启动菜单中自动生成快照条目。

    提示: 对于 dracut 用户:

    安装 limine-dracut-supportAUR 以自动化在 ESP 上的 limine.conf 中创建启动条目。有关更多详细信息,请参阅 Dracut 支持

    有关更多详细信息,请参阅 limine-snapper-sync README 和更多配置选项

    命令

    • limine-snapper-sync 将 Limine 快照条目与 Snapper 列表同步。
    • limine-snapper-list 显示当前的 Limine 快照条目。
    • limine-snapper-info 提供有关版本、可启动快照总数和验证可启动文件的详细信息。
    • limine-snapper-restore 从选定的可启动快照中还原您的系统,包括匹配的内核版本。

    已知限制

    • 仅支持任何 Snapper 布局,不支持没有 Snapper 的任意 Btrfs 布局。
    • 无法为在该工具安装之前创建的旧快照生成可启动快照条目,因为这些快照通常不再具有其对应的内核版本。

    参见