systemd-boot (简体中文) - ArchWiki

Jump to content

相关文章

- Arch boot process
- Secure Boot
- Unified Extensible Firmware Interface (简体中文)

翻译状态：本文是 Systemd-boot 的翻译。上次翻译日期：2019-03-16。如果英文版本有所更改，则您可以帮助同步翻译。

systemd-boot，曾用名 gummiboot （德语里“橡皮筏”的意思），是一款可以执行 EFI 镜像文件的简单 UEFI 引导管理器。可以通过配置好的模式（全局）或可用方向键导航的屏幕菜单选择默认条目。Arch 默认安装的 systemd 包含了 systemd-boot。

Systemd-boot 很容易配置，但只能启动 EFI 可执行程序，例如 Linux 内核 EFISTUB, UEFI Shell, GRUB 或者 Windows Boot Manager 等。

注意： 本文用 `$esp` 表示EFI 系统分区，即 ESP 挂载的位置。

## 安装

### 安装 EFI 启动管理器

要安装 systemd-boot EFI 启动管理器，首先确保启动方式是 UEFI 模式，可以访问 UEFI 变量。用 `efivar --list` 命令进行检查，如果没有安装 efivar ，使用 `ls /sys/firmware/efi/efivars` （如果目录存在，系统是以 UEFI 模式启动的）。

systemd-boot 仅可以从ESP 分区加载 EFISTUB 内核。要持续更新内核，建议将 ESP 挂载到 `/boot`. 如果没将 ESP 挂载到 `/boot`,需要手动将内核和 initramfs 复制到 ESP. 详情请参考 EFI system partition#Alternative mount points .

下面的例子中会用 `$esp` 代替 EFI 系统分区的实际位置，例如 `/boot`。

ESP 挂载到 `$esp` 后，使用 bootctl(1) 将 systemd-boot 安装到 EFI 系统分区：

    # bootctl --path=$esp install

在 x64 架构的系统上，两个完全一样的二进制文件 `$esp/EFI/systemd/systemd-bootx64.efi` 和 `$esp/EFI/BOOT/BOOTX64.EFI` 会被复制到 ESP. 然后将 systemd-boot 设置为 EFI 启动管理器的默认 EFI 程序(默认启动项)。

要完成安装，请 配置 systemd-boot。

### 更新 EFI 启动管理器

每当 systemd-boot 有新版本时，用户都需要更新启动管理器。

#### 手动更新

更新 systemd-boot 需要使用 bootctl。如果没指定 `path`，会按顺序检查 `/efi`, `/boot` 和 `/boot/efi`。

    # bootctl update

可以用 `path` 指定具体位置：

    # bootctl --path=$esp update

注意： 这条命令同样用于在移除 gummiboot 之前迁移。但是如果该软件包已被删除，请运行 `bootctl --path=$esp install`。

#### 自动更新

如果你需要自动更新 systemd-boot，你可以尝试使用 systemd 服务 或 Pacman 钩子，下方介绍了这两种方法。

##### systemd 服务

在版本 250 后， systemd 添加了 `systemd-boot-update.service`。 启用 这个服务后将会在下次启动系统时更新 bootloader。

警告： 如果你启用了 安全启动，你需要在更新 bootloader 后为其签名。请查看 #pacman 钩子 后有关于 安全启动 的相关说明。

##### pacman 钩子

软件包 systemd-boot-pacman-hookAUR 提供了一个 Pacman 钩子 以自动化更新过程。 安装 该软件包将添加一个在每次更新 systemd 时执行的 hook。

或者，不安装 systemd-boot-pacman-hook 实现相同功能，在 `/etc/pacman.d/hooks/` 放置以下 Pacman 钩子：

    /etc/pacman.d/hooks/100-systemd-boot.hook

    [Trigger]
    Type = Package
    Operation = Upgrade
    Target = systemd

    [Action]
    Description = Updating systemd-boot
    When = PostTransaction
    Exec = /usr/bin/bootctl update

如果你启用了 安全启动，你需要添加一个 Pacman 钩子 以在更新 内核 和 systemd 后自动为其重签名：

    /etc/pacman.d/hooks/99-secureboot.hook

    [Trigger]
    Operation = Install
    Operation = Upgrade
    Type = Package
    Target = linux
    Target = systemd

    [Action]
    Description = Signing Kernel for Secure Boot
    When = PostTransaction
    Exec = /usr/bin/find /boot -type f ( -name vmlinuz-* -o -name systemd* ) -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key db.key --cert db.crt --output "$1" "$1"; fi' _ {} ;
    Depends = sbsigntools
    Depends = findutils
    Depends = grep

## 配置

### 启动选单配置

配置文件保存于 `$esp/loader/loader.conf`，可指定以下设置：

- `default` – #增加启动选项 中默认选择的选项，可以使用通配符，例如 `arch-*`；
- `timeout` – 启动默认选项前的超时时间（以秒为单位）。如果未设定，选单仅在启动时按空格键（或大多数其他键）显示；
- `editor` – 是否启用内核参数编辑器。 `yes` （默认）为启用, `no` 为禁用；因为用户可以添加 `init=/bin/bash` 以绕过密码获取 root 权限，如果未经授权的人可以使用这台机器，强烈建议将此选项设置为 `no` ；
- `auto-entries` – 自动为 Windows、EFI Shell 和 Default Loader 添加选项， `1` (默认)启用， `0` 为禁用；
- `auto-firmware` – 显示「重启到 UEFI 固件设置」的选项， `1` (默认)启用， `0` 为禁用；
- `console-mode` – 更改 UEFI 控制台模式: `0` 为 80x25, `1` 为 80x50, `2` and above for non-standard modes provided by the device firmware, if any, `auto` picks a suitable mode automatically, `max` for highest available mode, `keep` (默认) 由固件确定。
- `random-seed-mode` - 控制是否从文件 `$esp/loader/random-seed` 中读取随机种子。如果设为 `with-system-token` （默认），仅在设置了 EFI 变量 `LoaderSystemToken` 的情况下才从文件加载种子；如果设为 `always`，即使未设置 EFI 变量，它也会从文件加载种子；如果设为 `off` 文件将被忽略。

现有设置的详细解释和对应的参数位于 loader.conf(5) 手册。以下是一个简单的示例：

    $esp/loader/loader.conf

    default  arch.conf
    timeout  4
    console-mode max
    editor   no

提示：

- `default` 和 `timeout` 可在启动选单中修改并保存为 EFI 变量，这些选项会被覆盖。
- `bootctl set-default ""` 可用于清除覆盖了 `default` 选项的 EFI 变量。
- 基本配置文件示例位于 `/usr/share/systemd/bootctl/loader.conf`。

### 增加启动选项

注意： 如果存在的话,bootctl 会自动为 "Windows Boot Manager (Windows 启动管理器)" (`\EFI\Microsoft\Boot\Bootmgfw.efi`), "EFI Shell" (`\shellx64.efi`) 和 "EFI Default Loader" (`\EFI\Boot\bootx64.efi`)增加启动选项. 但并不会为其他EFI应用程序创建启动选项,所以需要进行进一步设置. 如果你是和Windows 组成双重启动,建议禁用 Windows 中的"快速启动" 选项.

如果需要 Intel microcode，不要忘了修改 `initrd`。

提示： 你能用 `blkid -s PARTUUID -o value /dev/sdxY` 找到某个分区的PARTUUID, 'x' 和 'Y' 分别是磁盘和分区编号.稍后可能需要这些信息.

bootctl 会在 `$esp/loader/entries/*.conf` 搜索启动选项– 一个文件中只能包含一个启动选项,下面是参数列表:

- `title` – 必须选项. 系统的名称.
- `version` – 内核版本,只在有多个 `title` 时需要.
- `machine-id` – 通过 `/etc/machine-id`用于区分不同设备的名称, 只在有多个`title` 和 `version` 时需要.
- `efi` – 要启动的EFI应用程序的位置,以 (`$esp`) 为相对路径,; 例如 `/vmlinuz-linux`. 需要此选项或是 `linux` (参阅下文) 的一项.
- `options` – 传递给 EFI 应用程序或内核启动的参数,可选.但如果你要启动linux,至少需要 `initrd=efipath` 和 `root=dev`选项.

要启动linux,你还可以指定 `linux path-to-vmlinuz` 和 `initrd path-to-initramfs`;这会自动转换成 `efi path` 和 `options initrd=path` – 这个语法只是为了方便,在功能上并没有区别.

#### 一般的安装选项

这是一个根分区既不在LVM逻辑卷又没有加密时的配置选项:

    $esp/loader/entries/arch.conf

    title          Arch Linux
    linux          /vmlinuz-linux
    initrd         /initramfs-linux.img
    options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw

注意这个例子中用PARTUUID(或是PARTLABEL)来标识一个GPT分区(和UUID/LABEL不同,它标识一个文件系统).使用因为PARTUUID/PARTLABEL是因为它不像UUID/LABEL会在格式化时改变,也不像 /dev/sd* 会在某些时候交换.在某些无文件系统分区(或是不支持卷标的LUKS 加密卷)上也能工作.

提示： `/usr/share/systemd/bootctl` 提供了参考示例文件.

#### 根分区在LVM 逻辑卷上时

警告： 如果没有一个在LVM卷组外的`/boot`分区,不要用 Systemd-boot .

这是一个根分区在LVM逻辑卷上时的样例:

    $esp/loader/entries/arch-lvm.conf

    title          Arch Linux (LVM)
    linux          /vmlinuz-linux
    initrd         /initramfs-linux.img
    options        root=/dev/mapper/<VolumeGroup-LogicalVolume> rw

用实际的逻辑卷组和逻辑卷名替换 `<VolumeGroup-LogicalVolume>` (例如 `root=/dev/mapper/volgroup00-lvolroot`). 也可以使用UUID:

    ....
    options  root=UUID=<UUID identifier> rw

#### 加密的根分区

这是一个加密的根分区 (例如通过DM-Crypt / LUKS)的样例:

    $esp/loader/entries/arch-encrypted.conf

    title Arch Linux Encrypted
    linux /vmlinuz-linux
    initrd /initramfs-linux.img
    options cryptdevice=UUID=<UUID>:<mapped-name> root=/dev/mapper/<mapped-name> quiet rw

这个例子中用了UUID; PARTUUID 应该也可以使用, 如果你愿意,也可以用UUID替换/dev/段. 参阅 Dm-crypt/System configuration#Boot loader[损坏的链接：无效的章节].

如果使用 LVM，cryptdevice 行应该类似于：

    $esp/loader/entries/arch-encrypted-lvm.conf

    title Arch Linux Encrypted LVM
    linux /vmlinuz-linux
    initrd /initramfs-linux.img
    options cryptdevice=UUID=<UUID>:MyVolGroup root=/dev/mapper/MyVolGroup-MyVolRoot quiet rw

你也可以加入类似于 `\EFI\arch\grub.efi`的EFI应用程序.

#### 根分区是btrfs子卷

如果用btrfs子卷作为根分区,记得加入 `rootflags=subvol=<root 子卷名称>`到`options`选项中,在这个例子中,根分区挂载在名称为'ROOT'的btrfs子卷中 (例如 `mount -o subvol=ROOT /dev/sdxY /mnt`):

    $esp/loader/entries/arch-btrfs-subvol.conf

    title          Arch Linux
    linux          /vmlinuz-linux
    initrd         /initramfs-linux.img
    options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw rootflags=subvol=ROOT

如果做不到这一点的话,会出现这样的错误消息: `ERROR: Root device mounted successfully, but /sbin/init does not exist.`

#### EFI Shells 或其他 EFI 应用程序

你可以像这样加载EFI Shell或其他EFI应用程序:

    $esp/loader/entries/uefi-shell-v1-x86_64.conf

    title  UEFI Shell x86_64 v1
    efi    /EFI/shellx64_v1.efi

    $esp/loader/entries/uefi-shell-v2-x86_64.conf

    title  UEFI Shell x86_64 v2
    efi    /EFI/shellx64_v2.efi

This article or section needs expansion.

Reason: 加入如何进入UEFI固件设置的配置. (Discuss in Talk:Systemd-boot (简体中文))

### 对休眠的支持

参阅 Suspend and hibernate.

## 启动选单中的按键操作

启动选单中支持的按键操作有:

- `Up/Down` - 选择选项
- `Enter` - 加载所选的选项
- `d` - 设置默认的启动选项 (会保存在 EFI 变量中)
- `-/T` - 增加超时时间 (会保存在 EFI 变量中)
- `+/t` - 减少超时时间 (会保存在 EFI 变量中)
- `e` - 编辑内核参数,如果 `editor` 选项设置为`0`,则没有任何作用.
- `v` - 显示版本信息
- `Q` - 退出
- `P` - 显示目前的配置
- `h/?` - 帮助

这些热键可以在启动管理器时直接指定启动哪一个选项

- `l` - Linux
- `w` - Windows
- `a` - OS X
- `s` - EFI Shell
- `1-9` -选项的编号

## 排除问题

### 在传统启动下安装

警告： 这不是建议的方法!

如果你以传统方式(MBR)启动电脑,或许能成功安装,不过需要在安装之后像你的固件提供如何启动systemd-boot的相关信息,为此你需要:

- 一个EFI Shell;
- 或是你的UEFI 固件设置中提供了更改启动选项的界面.

注意： 例如某些 Dell Latitude 计算机上,UEFI固件设置界面提供了设置EFI启动所需的工具,而EFI Shell 无法修改那些设置.

如果能这样做的话,进入你的 EFI Shell 或是 UEFI 固件设置,修改你的默认EFI启动加载器为 `$esp/EFI/systemd/systemd-bootx64.efi` (在i686架构上是 `systemd-bootia32.efi`).

### 通过efibootmgr手动添加启动选项

如果运行`bootctl install` 命令失败,你可以通过 efibootmgr手动增加选项:

    # efibootmgr -c -d /dev/sdX -p Y -l /EFI/systemd/systemd-bootx64.efi -L "Linux Boot Manager"

用EFI 系统分区的设备名称替换`/dev/sdXY`.

### 在Windows升级后不能看到启动菜单

参阅Windows 修改了启动顺序。

## 参阅

- https://www.freedesktop.org/wiki/Software/systemd/systemd-boot/

Category:

- Boot loaders (简体中文)

Hidden categories:

- Pages with broken section links
- Pages or sections flagged with Template:Expansion