systemd-boot (简体中文)
systemd-boot (以前被称为gummiboot) 是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 systemd 提供了这个功能。
配置很简单,但是只能启动 EFI 可执行程序,例如 Linux 内核 EFISTUB, UEFI Shell, GRUB, Windows Boot Manager等。
$esp
表示EFI 系统分区,也就是 ESP 的挂载位置。Contents
安装
在UEFI 引导下安装
- 确认启动方式是 UEFI 模式
- 验证可以正确访问 EFI 变量
- 挂载 EFI 系统分区(ESP),下面的例子中会用
$esp
代替 EFI 系统分区的实际位置。
/boot
. 如果希望 ESP 和 /boot 分离,请查看后面的 #更新部分。- 如果 EFI 系统分区没挂载在 /boot 上的话,复制内核和 initramfs 到 ESP。
vfat
to a file in /etc/modules-load.d/
to ensure the current running kernel has the vfat
module loaded at boot, before any kernel update happens that could replace the module for the currently running version making the mounting of /boot/efi
impossible until reboot.- 执行下面命令将 systemd-boot 程序复制到 EFI 系统分区并将 systemd-boot 安装成EFI启动管理器的默认的 EFI 程序。
# bootctl --path=$esp install
在传统启动下安装
如果你以传统方式(MBR)启动电脑,或许能成功安装,不过需要在安装之后像你的固件提供如何启动systemd-boot的相关信息,为此你需要:
- 一个EFI Shell;
- 或是你的UEFI 固件设置中提供了更改启动选项的界面.
如果能这样做的话,进入你的 EFI Shell 或是 UEFI 固件设置,修改你的默认EFI启动加载器为 $esp/EFI/systemd/systemd-bootx64.efi
(在i686架构上是 systemd-bootia32.efi
).
更新
systemd-boot (bootctl(1), systemd-efi-boot-generator(8)) 假定你的 EFI 系统分区 挂载在 /boot
. 和 gummiboot 不同,Systemd-boot的升级需要用户手动进行:
# bootctl update
如果 EFI 系统分区不在 /boot
, 需要加入 --path=
参数来指定. 例如:
# bootctl --path=esp update
bootctl --path=esp install
.配置
基本配置
基本设置保存在$esp/loader/loader.conf
,有三个选项:
The basic configuration is kept in $esp/loader/loader.conf
, with three possible configuration options:
-
default
–默认加载的配置文件 (不含.conf
后缀); 可以使用通配符arch-*
-
timeout
–启动选单的超时时间,如果不设置的话,启动选单只有在按键时才显示.
-
editor
-是否允许用户编辑内核参数.1
(默认值) 是允许,0
是阻止. 因为用户可以通过init=/bin/bash
来绕过root密码并获得root权限,建议设置成0
.
下面是一个样例:
$esp/loader/loader.conf
default arch timeout 4 editor 0
你也可以在启动选单中改变默认值和超时时间,所做的改动会保存到efivars中.
/usr/share/systemd/bootctl
包含参考示例文件.增加启动选项
\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 逻辑卷上时
/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
对休眠的支持
启动选单中的按键操作
启动选单中支持的按键操作有:
-
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
-选项的编号
排除问题
通过efibootmgr手动添加启动选项
如果运行bootctl install
命令失败,你可以通过 efibootmgr手动增加选项:
# efibootmgr -c -d /dev/sdX -p Y -l /EFI/systemd/systemd-bootx64.efi -L "Linux Boot Manager"
用EFI 系统分区[broken link: invalid section]的设备名称替换/dev/sdXY
.