# systemd-boot (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

相关文章

- 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-pacman-hookAUR 提供了一个 Pacman hook 以自动化更新过程。 安装 该软件包将添加一个在每次更新 systemd 时执行的 hook。

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

    /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

## 配置

### 启动选单配置

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

- `default` – #增加启动选项 中默认选择的选项；不带 .conf 后缀，可以使用通配符，例如 `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` – changes UEFI console mode: `0` for 80x25, `1` for 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` (default) for the firmware selected mode.
- `random-seed-mode` - 控制是否从文件 `$esp/loader/random-seed` 中读取随机种子。如果设为 `with-system-token` （默认），仅在设置了 EFI 变量 `LoaderSystemToken` 的情况下才从文件加载种子；如果设为 `always`，即使未设置 EFI 变量，它也会从文件加载种子；如果设为 `off` 文件将被忽略。

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

    $esp/loader/loader.conf

    default  arch
    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 category:

- Pages or sections flagged with Template:Expansion