Difference between revisions of "Systemd-boot (简体中文)"

From ArchWiki
Jump to navigation Jump to search
(update interlanguage links)
Tag: wiki-scripts
(Update translation.)
 
Line 8: Line 8:
 
{{Related articles start (简体中文)}}
 
{{Related articles start (简体中文)}}
 
{{Related|Arch boot process}}
 
{{Related|Arch boot process}}
{{Related|Boot loaders (简体中文)}}
 
 
{{Related|Secure Boot}}
 
{{Related|Secure Boot}}
 
{{Related|Unified Extensible Firmware Interface (简体中文)}}
 
{{Related|Unified Extensible Firmware Interface (简体中文)}}
 
{{Related articles end}}
 
{{Related articles end}}
{{TranslationStatus (简体中文)|Systemd-boot|2016-08-04|443307}}
+
{{TranslationStatus (简体中文)|Systemd-boot|2019-03-16|567880}}
 
'''systemd-boot''' (以前被称为'''gummiboot''') 是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 {{Pkg|systemd}} 提供了这个功能。
 
'''systemd-boot''' (以前被称为'''gummiboot''') 是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 {{Pkg|systemd}} 提供了这个功能。
  
 
配置很简单,但是只能启动 EFI 可执行程序,例如 Linux 内核 [[EFISTUB]], UEFI Shell, GRUB, Windows Boot Manager等。
 
配置很简单,但是只能启动 EFI 可执行程序,例如 Linux 内核 [[EFISTUB]], UEFI Shell, GRUB, Windows Boot Manager等。
 
{{Warning|systemd-boot 提供了引导EFISTUB内核的简单接口,如果你在启动EFISTUB内核时遇到了困难(例如{{Bug|33745}}), 你应该使用像[[GRUB]], [[Syslinux]] 或 [[Boot loader#ELILO|ELILO]]{{Broken section link}}这样的不使用EFISTUB的启动管理器.}}
 
  
 
{{Note|本文用 {{ic|$esp}} 表示[[EFI system partition|EFI 系统分区]],也就是 ESP 的挂载位置。}}
 
{{Note|本文用 {{ic|$esp}} 表示[[EFI system partition|EFI 系统分区]],也就是 ESP 的挂载位置。}}
Line 23: Line 20:
 
== 安装 ==
 
== 安装 ==
  
=== 在UEFI 引导下安装 ===
+
=== 安装 EFI 启动管理器 ===
# 确认启动方式是 UEFI 模式
+
要安装 ''systemd-boot'' EFI 启动管理器,首先确保启动方式是 UEFI 模式,可以访问 [[Unified Extensible Firmware Interface#UEFI variables|UEFI 变量]]。用 {{ic|efivar --list}} 命令进行检查。
# 验证[[Unified_Extensible_Firmware_Interface#Requirements_for_UEFI_variable_support|可以正确访问 EFI 变量]]
+
 
# 挂载 [[EFI system partition|EFI 系统分区]](ESP),下面的例子中会用 {{ic|$esp}} 代替 EFI 系统分区的实际位置。
+
''systemd-boot'' 仅可以从[[EFI system partition|ESP]] 分区加载 [[EFISTUB]] 内核。要持续更新内核,建议将 ESP 挂载到 {{ic|/boot}}. 如果没将 ESP 挂载到 {{ic|/boot}},需要手动将内核和 initramfs 复制到 ESP. 详情请参考 [[EFI system partition#Alternative mount points]] .
{{Note|systemd-boot 无法从其它分区加载 EFI 程序。 建议将 ESP 挂载到 {{ic|/boot}}. 如果希望 ESP /boot 分离,请查看后面的 [[#更新]]部分。}}
+
 
# 如果 EFI 系统分区没挂载在 /boot 上的话,复制内核和 initramfs 到 ESP。
+
下面的例子中会用 {{ic|$esp}} 代替 EFI 系统分区的实际位置,例如 {{ic|/boot}}
<!-- 自己作死就麻烦点 -->
 
{{Note|For a way to automatically keep the kernel updated on the ESP, have a look at the [[EFISTUB#Using_systemd|EFISTUB article]]{{Broken section link}} for some systemd units that can be adapted. If your efi partition is using automount, you may need to add {{ic|vfat}} to a file in {{ic|/etc/modules-load.d/}} to ensure the current running kernel has the {{ic|vfat}} module loaded at boot, before any kernel update happens that could replace the module for the currently running version making the mounting of {{ic|/boot/efi}} impossible until reboot.}}
 
# 执行下面命令将 systemd-boot 程序复制到 EFI 系统分区并将 systemd-boot 安装成EFI启动管理器的默认的 EFI 程序。
 
  
# bootctl --path=''$esp'' install
+
ESP 挂载到 {{ic|''esp''}} 后,使用 {{man|1|bootctl}} 将 ''systemd-boot'' 安装到 EFI 系统分区:
  
=== 在传统启动下安装===
+
# bootctl --path=''esp'' install
{{Warning|这不是建议的方法!}}
+
 
如果你以传统方式(MBR)启动电脑,或许能成功安装,不过需要在安装之后像你的固件提供如何启动systemd-boot的相关信息,为此你需要:
+
在 x64 架构的系统上,两个完全一样的二进制文件 {{ic|''esp''/EFI/systemd/systemd-bootx64.efi}} {{ic|''esp''/EFI/BOOT/BOOTX64.EFI}} 会被复制到 ESP. 然后将 ''systemd-boot'' 设置为 EFI 启动管理器的默认 EFI 程序(默认启动项)
* 一个EFI Shell;
+
 
* 或是你的UEFI 固件设置中提供了更改启动选项的界面.
+
=== 更新 EFI 启动管理器 ===
{{Note|例如某些 Dell  Latitude 计算机上,UEFI固件设置界面提供了设置EFI启动所需的工具,而EFI Shell 无法修改那些设置.}}
+
 
如果能这样做的话,进入你的 EFI Shell 或是 UEFI 固件设置,修改你的默认EFI启动加载器为 {{ic|$esp/EFI/systemd/systemd-bootx64.efi}} (在i686架构上是 {{ic|systemd-bootia32.efi}}).
+
每当 ''systemd-boot'' 有新版本时,用户都需要更新启动管理器。
  
=== 更新 ===
+
==== 手动更新 ====
  
systemd-boot (bootctl(1), systemd-efi-boot-generator(8)) 假定你的 EFI 系统分区 挂载在 {{ic|/boot}}. 和 ''gummiboot'' 不同,Systemd-boot的升级需要用户手动进行:
+
更新 ''systemd-boot'' 需要使用 ''bootctl''。如果没指定 {{ic|path}},会按顺序检查 {{ic|/efi}}, {{ic|/boot}} 和 {{ic|/boot/efi}}
  
  # bootctl update
+
  # bootctl update
  
如果 EFI 系统分区不在 {{ic|/boot}}, 需要加入 {{ic|1=--path=}} 参数来指定. 例如:
+
可以用 {{ic|path}} 指定具体位置:
  
  # bootctl --path=''esp'' update
+
# bootctl --path=''esp'' update
  
 
{{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 {{ic|1=bootctl --path=''esp'' install}}.}}
 
{{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 {{ic|1=bootctl --path=''esp'' install}}.}}
 +
 +
==== 自动更新 ====
 +
 +
The package {{AUR|systemd-boot-pacman-hook}} provides a [[Pacman hook]] to automate the update process. [[Install|Installing]] the package will add a hook which will be executed every time the {{Pkg|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 {{ic|/etc/pacman.d/hooks/}} directory:
 +
 +
{{hc|/etc/pacman.d/hooks/100-systemd-boot.hook|2=
 +
[Trigger]
 +
Type = Package
 +
Operation = Upgrade
 +
Target = systemd
 +
 +
[Action]
 +
Description = Updating systemd-boot
 +
When = PostTransaction
 +
Exec = /usr/bin/bootctl update
 +
}}
  
 
== 配置 ==
 
== 配置 ==
Line 70: Line 81:
 
下面是一个样例:
 
下面是一个样例:
  
{{hc|$esp/loader/loader.conf|
+
{{hc|esp/loader/loader.conf|
 
default  arch
 
default  arch
 
timeout  4
 
timeout  4
editor  0
+
console-mode max
 +
editor  no
 
}}
 
}}
  
Line 214: Line 226:
  
 
==排除问题 ==
 
==排除问题 ==
 +
 +
 +
=== 在传统启动下安装===
 +
 +
{{Warning|这不是建议的方法!}}
 +
 +
如果你以传统方式(MBR)启动电脑,或许能成功安装,不过需要在安装之后像你的固件提供如何启动systemd-boot的相关信息,为此你需要:
 +
 +
* 一个EFI Shell;
 +
* 或是你的UEFI 固件设置中提供了更改启动选项的界面.
 +
 +
{{Note|例如某些 Dell  Latitude 计算机上,UEFI固件设置界面提供了设置EFI启动所需的工具,而EFI Shell 无法修改那些设置.}}
 +
 +
如果能这样做的话,进入你的 EFI Shell 或是 UEFI 固件设置,修改你的默认EFI启动加载器为 {{ic|$esp/EFI/systemd/systemd-bootx64.efi}} (在i686架构上是 {{ic|systemd-bootia32.efi}}).
  
 
=== 通过efibootmgr手动添加启动选项 ===
 
=== 通过efibootmgr手动添加启动选项 ===

Latest revision as of 06:24, 16 March 2019

翻译状态: 本文是英文页面 Systemd-boot翻译,最后翻译时间:2019-03-16,点击这里可以查看翻译后英文页面的改动。

systemd-boot (以前被称为gummiboot) 是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 systemd 提供了这个功能。

配置很简单,但是只能启动 EFI 可执行程序,例如 Linux 内核 EFISTUB, UEFI Shell, GRUB, Windows Boot Manager等。

Note: 本文用 $esp 表示EFI 系统分区,也就是 ESP 的挂载位置。

安装

安装 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 系统分区:

# bootctl --path=esp install

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

更新 EFI 启动管理器

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

手动更新

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

# bootctl update

可以用 path 指定具体位置:

# bootctl --path=esp update
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:

/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,有三个选项: 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
console-mode max
editor   no

你也可以在启动选单中改变默认值和超时时间,所做的改动会保存到efivars中.

Tip: /usr/share/systemd/bootctl包含参考示例文件.

增加启动选项

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

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

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

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

要启动linux,你还可以指定 linux path-to-vmlinuzinitrd path-to-initramfs;这会自动转换成 efi pathoptions 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 加密卷)上也能工作.

Tip: /usr/share/systemd/bootctl 提供了参考示例文件.

根分区在LVM 逻辑卷上时

Warning: 如果没有一个在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

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

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 -选项的编号

排除问题

在传统启动下安装

Warning: 这不是建议的方法!

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

  • 一个EFI Shell;
  • 或是你的UEFI 固件设置中提供了更改启动选项的界面.
Note: 例如某些 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 系统分区[broken link: invalid section]的设备名称替换/dev/sdXY.

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

参阅Windows 修改了启动顺序

参阅