本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
systemd-boot, sd-boot — 一个简单的 UEFI 引导管理器
systemd-boot(简称 sd-boot) 是一个简单的 UEFI 引导管理器。 它提供了一个选择启动项的图形菜单、一个修改内核命令行的编辑器。 注意,此引导管理器仅支持 UEFI 固件。
systemd-boot 从ESP(EFI系统分区)加载启动组件,该分区一般挂载到
/boot
, /efi
, /boot/efi
目录之一。
配置文件、操作系统内核、initrd 、EFI镜像 之类的启动组件通常必须位于 ESP 上。
Linux 内核必须开启 CONFIG_EFI_STUB
编译选项以确保可以直接作为EFI镜像执行。
systemd-boot 将会
自动获取下列启动项:
按照 Boot Loader
Specification 规范编写的启动项描述文件(位于 ESP 的 /loader/entries/
目录中)。
这些启动项通常用于定义发行版 Linux 内核及其对应的 initrd ,
不过也可以用于定义其他 EFI 镜像。
符合 Boot Loader
Specification 规范的规范化 Linux 内核(位于 ESP 的 /EFI/Linux/
目录中,必须是可执行的 EFI 二进制镜像)。
Microsoft Windows EFI boot manager (若有)
Apple MacOS X boot manager (若有)
EFI Shell (若有)
重启进入 UEFI 固件设置 (若固件支持)
kernel-install(8) 可以用来向 ESP 安装内核以及符合规范的启动项描述文件。 bootctl(1) 可以用于定位 ESP 、列出可用启动项、安装 systemd-boot 等功能。
通过使用 Boot Loader Interface 接口,systemd-boot 可以向 systemd-analyze(1) 提供 UEFI 固件启动所花费的时间。
在启动菜单中可以使用下列按键
下面的快捷键可以用于 直接启动特定的启动项:
在编辑器中绝大多数键都用于输入字符, 而下面这些键可以用于额外的动作:
注意,除非在 UEFI 固件中经过了特别的设置,否则 systemd-boot 将会默认使用 US(美式英语) 键盘布局, 因此不可以使用例如 +/- 之类的特殊键作为键标签(key label)。
systemd-boot 读取的文件位于 UEFI ESP (通常挂载到
/boot/
, /efi/
, /boot/efi
目录之一)。
systemd-boot 从 EFI 变量以及位于 ESP 的
/loader/loader.conf
文件中读取例如默认启动项以及超时秒数之类的运行时配置(详见
loader.conf(5) 手册)。
启动项描述文件的内容必须遵守 Boot Loader
Specification 规范,并且必须位于 ESP 的 /loader/entries/
目录中。
规范化 Linux 内核必须遵守 Boot
Loader Specification 规范,并且必须位于 ESP 的 /EFI/Linux/
目录中。
下面列出的 EFI 变量由 systemd-boot 定义在 vendor
UUID "4a67b082-0a4c-41cf-b6c7-440b29bb8c4
" 之下,
用于在引导管理器和操作系统之间进行通信:
LoaderBootCountPath
¶如果开启了启动计数,那么将包含在文件名中编码了启动计数的启动项描述文件的路径。
由引导管理器设置。
systemd-bless-boot.service(8)
使用此信息将本次启动标记为成功,而这取决于
boot-complete.target
单元的成功启动。
LoaderConfigTimeout
, LoaderConfigTimeoutOneShot
¶启动菜单的超时秒数。由引导管理器读取。LoaderConfigTimeout
永久存储,而 LoaderConfigTimeoutOneShot
则是用完即删的一次性临时变量(优先级高于 LoaderConfigTimeout
)。
LoaderConfigTimeout
可以使用
t/T 键修改(见上文)。
LoaderDevicePartUUID
¶引导管理器所在的 ESP 的 UUID 值。 由引导管理器设置。 systemd-gpt-auto-generator(8) 使用此信息自动确定启动设备, 进而自动发现启动设备上的其他分区。
LoaderEntries
¶所有已发现的启动项列表。 由引导管理器设置。
LoaderEntryDefault
, LoaderEntryOneShot
¶默认启动项。主要由操作系统设置、引导管理器读取。
LoaderEntryOneShot
临时设置下一次启动的默认启动项(优先级更高),
LoaderEntryDefault
永久设置每一次启动的默认启动项。
bootctl(1) 的
set-default
与 set-oneshot
命令将会分别使用这两个变量。
在引导管理器中可以使用 d 键(详见前文)修改 LoaderEntryDefault
的值。
LoaderEntrySelected
¶本次启动的启动项。 由引导管理器设置。
LoaderFeatures
¶一组引导管理器支持的特性标记。由引导管理器设置。可以使用 bootctl(1) 来查看其内容。
LoaderFirmwareInfo
, LoaderFirmwareType
¶简要的固件信息。由引导管理器设置。可以使用 bootctl(1) 来查看其内容。
LoaderImageIdentifier
¶本次启动所使用的引导管理器的可执行文件的路径(相对于 ESP 根目录)。 由引导管理器设置。可以使用 bootctl(1) 来查看其内容。
LoaderInfo
¶简要的引导管理器信息。由引导管理器设置。可以使用 bootctl(1) 来查看其内容。
LoaderTimeExecUSec
, LoaderTimeInitUSec
, LoaderTimeMenuUsec
¶在引导管理器的不同阶段花费的秒数。由引导管理器设置。 可以使用 systemd-analyze(1) 来查看其内容。这些变量的定义参见 Boot Loader Interface
systemd-boot 基于 Boot Loader Specification 规范实现了一个简单的启动计数机制,
用来实现在特定启动项启动失败的时候可以无人值守的自动回退到旧的内核版本/启动项。
对于任何启动项描述文件与规范化内核镜像文件,如果在 .conf
或 .efi
后缀之前的文件名带有一个 "+N
" 或 "+N-M
" 格式的尾巴(N,M 是数字),
那么就表示开启了启动计数机制:每尝试启动一次,表示剩余尝试次数的"N"会减一、表示已经尝试次数的"M"会加一。
如果"M"不存在,那么相当于其值为零。
取决于这两个计数器的数值,
启动项将处于下列三个状态之一:
如果剩余尝试次数"N"大于零, 那么启动项处于"不确定"状态。 含义是该启动项尚未完全启动成功但是也没有被认定为启动失败。
如果剩余尝试次数"N"等于零,那么启动项处于"失败"状态。 含义是该启动项已被认定为启动失败(因为经过数次尝试,都没有能够完全启动成功), 除非所有其他启动项也全部处于"失败"状态,否则不会再尝试启动它。
如果剩余尝试次数"N"和已经尝试次数"M"两个计数器都不存在,那么启动项处于"成功"状态。 含义是经过尝试,至少有一次完全启动成功,之后的启动过程中就会关闭对此启动项的启动计数机制。 当某次启动尝试完全成功之后, systemd-bless-boot.service(8) 服务将会把本次启动项 从"不确定"状态修改为"成功"状态。
通常,新增启动项的初始状态为"不确定", 也就是剩余尝试次数"N"大于零。 这种"不确定"状态会一直保持到要么至少完全成功启动一次(转变为"成功"状态)、 要么剩余尝试次数降到零(转变为"失败"状态)。
例如将启动项描述文件 foo.conf
安装为3次启动尝试,
那么将会创建名为 foo+3.conf
的启动项描述文件。
第一次启动尝试,引导管理器会自动将启动项描述文件重命名为 foo+2-1.conf
、
第二次启动尝试,引导管理器会自动将启动项描述文件重命名为 foo+1-2.conf
、
第三次启动尝试,引导管理器会自动将启动项描述文件重命名为 foo+0-3.conf
。
第三次之后"N"等于零了,引导管理器就会认为该启动项已经是"失败"状态。如果在上述尝试过程中有某一次完全启动成功,
那么进入操作系统之后,该启动项描述文件将被操作系统重命名为 foo.conf
,之后引导管理器就会认为该启动项已经是"成功"状态。
引导管理器会自动将处于"失败"状态的启动项排列在启动菜单列表的末尾, 而将处于"不确定"与"成功"状态的启动项排列在启动菜单列表的前面。 用户可以自由选择任意启动项(包括处于"失败"状态的启动项)。 如果由引导管理器自动选择启动项,那么将会自动优先选择处于"不确定"与"成功"状态的启动项(实际是列表第一项), 仅在所有启动项都处于"失败"状态的情况下, 才可能自动启动处于"失败"状态的启动项。
kernel-install(8)
内核安装框架可以在创建一个新的启动项时根据
/etc/kernel/tries
的指示设置剩余尝试次数初始值。