2019-07-10 15:43:34 +08:00
# [Systemd-boot(简体中文)](https://wiki.archlinux.org/index.php/Systemd-boot)
```blk
翻译状态: 本文是英文页面 Systemd-boot 的翻译, 最后翻译时间: 2019-03-16, 点击这里可以查看翻译后英文页面的改动。
```
systemd-boot (以前被称为gummiboot) 是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 systemd 提供了这个功能。
配置很简单,但是只能启动 EFI 可执行程序,例如 Linux 内核 EFISTUB, UEFI Shell, GRUB, Windows Boot Manager等。
```blk
Note: 本文用 $esp 表示EFI 系统分区,也就是 ESP 的挂载位置。
```
```contents
Contents
1 安装
1.1 安装 EFI 启动管理器
1.2 更新 EFI 启动管理器
1.2.1 手动更新
1.2.2 自动更新
2 配置
2.1 基本配置
2.2 增加启动选项
2.2.1 一般的安装选项
2.2.2 根分区在LVM 逻辑卷上时
2.2.3 加密的根分区
2.2.4 根分区是btrfs子卷
2.2.5 EFI Shells 或其他 EFI 应用程序
2.3 对休眠的支持
3 启动选单中的按键操作
4 排除问题
4.1 在传统启动下安装
4.2 通过efibootmgr手动添加启动选项
4.3 在Windows升级后不能看到启动菜单
5 参阅
```
## 安装
### 安装 EFI 启动管理器
要安装 systemd-boot EFI 启动管理器,首先确保启动方式是 UEFI 模式,可以访问 UEFI 变量。用 efivar --list 命令进行检查。
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 系统分区:
2020-05-20 16:18:39 +08:00
```bash
bootctl --path=esp install
2019-07-10 15:43:34 +08:00
```
在 x64 架构的系统上,两个完全一样的二进制文件 esp/EFI/systemd/systemd-bootx64.efi 和 esp/EFI/BOOT/BOOTX64.EFI 会被复制到 ESP. 然后将 systemd-boot 设置为 EFI 启动管理器的默认 EFI 程序(默认启动项)。
### 更新 EFI 启动管理器
每当 systemd-boot 有新版本时,用户都需要更新启动管理器。
#### 手动更新
更新 systemd-boot 需要使用 bootctl。如果没指定 path, 会按顺序检查 /efi, /boot 和 /boot/efi。
2020-05-20 16:18:39 +08:00
```bash
bootctl update
2019-07-10 15:43:34 +08:00
```
可以用 path 指定具体位置:
2020-05-20 16:18:39 +08:00
```bash
bootctl --path=esp update
2019-07-10 15:43:34 +08:00
```
```blk
Note: This is also the command to use when migrating from gummiboot, before removing that package. If that package has already been removed, however, run bootctl --path=esp install.
```
#### 自动更新
The package systemd-boot-pacman-hookAUR provides a Pacman hook to automate the update process. Installing the package will add a hook which will be executed every time the systemd package is upgraded. Alternatively, to replicate what the systemd-boot-pacman-hook package does without installing it, place the following pacman hook in the /etc/pacman.d/hooks/ directory:
2020-05-20 16:18:39 +08:00
```ini
2019-07-10 15:43:34 +08:00
# /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
```
## 配置
### 基本配置
2020-05-20 16:18:39 +08:00
基本设置保存在 $esp/loader/loader.conf,有三个选项: The basic configuration is kept in $esp/loader/loader.conf, with three possible configuration options:
2019-07-10 15:43:34 +08:00
* default –默认加载的配置文件 (不含 .conf 后缀); 可以使用通配符 arch-*
* timeout –启动选单的超时时间,如果不设置的话,启动选单只有在按键时才显示.
2020-05-20 16:18:39 +08:00
* editor -是否允许用户编辑内核参数. 1 (默认值) 是允许, 0 是阻止. 因为用户可以通过 init=/bin/bash 来绕过 root 密码并获得 root 权限,建议设置成 0.
2019-07-10 15:43:34 +08:00
下面是一个样例:
2020-05-20 16:18:39 +08:00
```ini
# $esp/loader/loader.conf
2019-07-10 15:43:34 +08:00
default arch
timeout 4
console-mode max
editor no
```
2020-05-20 16:18:39 +08:00
你也可以在启动选单中改变默认值和超时时间,所做的改动会保存到 efivars 中.
2019-07-10 15:43:34 +08:00
```blk
Tip: /usr/share/systemd/bootctl包含参考示例文件.
```
### 增加启动选项
```blk
Note: 如果存在的话,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。
```blk
Tip: 你能用 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选项.
2020-05-20 16:18:39 +08:00
要启动 linux,你还可以指定 linux path-to-vmlinuz 和 initrd path-to-initramfs 这会自动转换成 efi path 和 options initrd=path – 这个语法只是为了方便,在功能上并没有区别.
2019-07-10 15:43:34 +08:00
#### 一般的安装选项
2020-05-20 16:18:39 +08:00
这是一个根分区既不在 LVM 逻辑卷又没有加密时的配置选项:
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
```ini
2019-07-10 15:43:34 +08:00
# $esp/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw
```
2020-05-20 16:18:39 +08:00
注意这个例子中用 PARTUUID(或是 PARTLABEL)来标识一个 GPT 分区(和 UUID/LABEL 不同,它标识一个文件系统).使用因为 PARTUUID/PARTLABEL 是因为它不像 UUID/LABEL 会在格式化时改变,也不像 /dev/sd* 会在某些时候交换.在某些无文件系统分区(或是不支持卷标的 LUKS 加密卷)上也能工作.
2019-07-10 15:43:34 +08:00
```blk
Tip: /usr/share/systemd/bootctl 提供了参考示例文件.
```
#### 根分区在LVM 逻辑卷上时
```blk
2020-05-20 16:18:39 +08:00
Warning: 如果没有一个在 LVM 卷组外的 /boot 分区,不要用 Systemd-boot .
2019-07-10 15:43:34 +08:00
```
2020-05-20 16:18:39 +08:00
这是一个根分区在 LVM 逻辑卷上时的样例:
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
```ini
2019-07-10 15:43:34 +08:00
# $esp/loader/entries/arch-lvm.conf
title Arch Linux (LVM)
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=/dev/mapper/< VolumeGroup-LogicalVolume > rw
```
2020-05-20 16:18:39 +08:00
用实际的逻辑卷组和逻辑卷名替换 \<VolumeGroup-LogicalVolume\> (例如 root=/dev/mapper/volgroup00-lvolroot). 也可以使用 UUID:
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
```ini
2019-07-10 15:43:34 +08:00
....
options root=UUID=< UUID identifier > rw
```
#### 加密的根分区
2020-05-20 16:18:39 +08:00
这是一个加密的根分区 (例如通过 DM-Crypt/LUKS)的样例:
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
```ini
# $esp/loader/entries/arch-encrypted.conf
2019-07-10 15:43:34 +08:00
title Arch Linux Encrypted
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=< UUID > :< mapped-name > root=/dev/mapper/< mapped-name > quiet rw
```
2020-05-20 16:18:39 +08:00
这个例子中用了 UUID; PARTUUID 应该也可以使用, 如果你愿意,也可以用 UUID 替换 /dev/ 段. 参阅 Dm-crypt/System configuration#Boot loader.
2019-07-10 15:43:34 +08:00
如果使用 LVM, cryptdevice 行应该类似于:
2020-05-20 16:18:39 +08:00
```ini
# $esp/loader/entries/arch-encrypted-lvm.conf
2019-07-10 15:43:34 +08:00
title Arch Linux Encrypted LVM
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=< UUID > :MyVolGroup root=/dev/mapper/MyVolGroup-MyVolRoot quiet rw
```
#### 根分区是btrfs子卷
2020-05-20 16:18:39 +08:00
如果用btrfs子卷作为根分区,记得加入 rootflags=subvol=\<root 子卷名称\> 到 options 选项中,在这个例子中,根分区挂载在名称为'ROOT'的 btrfs 子卷中 (例如 mount -o subvol=ROOT /dev/sdxY /mnt):
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
```ini
2019-07-10 15:43:34 +08:00
# $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.
2020-05-20 16:18:39 +08:00
你也可以加入类似于 \EFI\arch\grub.efi 的 EFI 应用程序.
2019-07-10 15:43:34 +08:00
#### EFI Shells 或其他 EFI 应用程序
你可以像这样加载EFI Shell或其他EFI应用程序:
2020-05-20 16:18:39 +08:00
```ini
2019-07-10 15:43:34 +08:00
# $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
```
### 对休眠的支持
参阅 [Suspend and hibernate ](https://wiki.archlinux.org/index.php/Power_management/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 -选项的编号
## 排除问题
### 在传统启动下安装
```blk
Warning: 这不是建议的方法!
```
2020-05-20 16:18:39 +08:00
如果你以传统方式(MBR)启动电脑,或许能成功安装,不过需要在安装之后像你的固件提供如何启动 systemd-boot 的相关信息,为此你需要:
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
* 一个 EFI Shell;
2019-07-10 15:43:34 +08:00
* 或是你的UEFI 固件设置中提供了更改启动选项的界面.
```blk
Note: 例如某些 Dell Latitude 计算机上,UEFI固件设置界面提供了设置EFI启动所需的工具,而EFI Shell 无法修改那些设置.
```
2020-05-20 16:18:39 +08:00
如果能这样做的话,进入你的 EFI Shell 或是 UEFI 固件设置,修改你的默认 EFI 启动加载器为 $esp/EFI/systemd/systemd-bootx64.efi (在i686架构上是 systemd-bootia32.efi).
2019-07-10 15:43:34 +08:00
### 通过efibootmgr手动添加启动选项
2020-05-20 16:18:39 +08:00
如果运行 bootctl install 命令失败,你可以通过 efibootmgr 手动增加选项:
2019-07-10 15:43:34 +08:00
2020-05-20 16:18:39 +08:00
```bash
efibootmgr -c -d /dev/sdX -p Y -l /EFI/systemd/systemd-bootx64.efi -L "Linux Boot Manager"
2019-07-10 15:43:34 +08:00
```
2020-05-20 16:18:39 +08:00
用 EFI 系统分区[broken link: invalid section]的设备名称替换 /dev/sdXY.
2019-07-10 15:43:34 +08:00
### 在Windows升级后不能看到启动菜单
## 参阅
参阅[Windows 修改了启动顺序](https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))。