NAME
bootup - 系 统 启 动 流 程
描 述
在 系 统 启 动 过 程 中 要 涉 及 多 个 不 同 的 组 件 。 按 下 电 源 按 钮 后 , 首 先 BIOS/UEFI做 最 基 本 的 硬 件 自 检 与 初 始 化 , 然 后 加 载 预 设 /手 动 选 择 的 磁 盘 /网 络 上 的 引 导 加 载 器 (例 如 GRUB2), 引 导 加 载 器 进 一 步 从 磁 盘 /网 络 上 加 载 操 作 系 统 内 核 (例 如 Linux)。 对 于 Linux来 说 , 内 核 将 会 (可 选 的 )解 压 一 个 initrd(initial RAM disk)镜 像 (可 以 用 dracut(8) 之 类 的 工 具 生 成 ), 并 执 行 由 "rdinit="内 核 引 导 选 项 指 定 的 init程 序 (例 如 systemd(1)) 以 寻 找 并 挂 载 根 文 件 系 统 。 完 成 根 文 件 系 统 的 挂 载 之 后 , 内 核 启 动 由 "init="内 核 引 导 选 项 指 定 的 init程 序 (例 如 systemd(1)) 以 接 管 系 统 的 控 制 权 。 该 init程 序 将 会 负 责 检 测 所 有 其 他 的 硬 件 设 备 、 挂 载 必 要 的 文 件 系 统 、 启 动 所 有 必 要 的 服 务 , 等 等 。 关 机 时 , init程 序 将 会 停 止 所 有 服 务 、 卸 载 所 有 文 件 系 统 、 (可 选 的 )返 回 initrd环 境 卸 载 根 文 件 系 统 , 最 后 关 闭 电 源 。 其 他 有 关 系 统 启 动 流 程 的 信 息 可 以 参 考 boot(7) 手 册 。
常 规 启 动 流 程
当 成 功 挂 载 了 "root="内 核 引 导 选 项 指 定 的 根 文 件 系 统 之 后 , 内 核 将 启 动 由 "init="内 核 引 导 选 项 指 定 的 init程 序 , 从 这 个 时 间 点 开 始 , 即 进 入 了 "常 规 启 动 流 程 ": 检 测 硬 件 设 备 并 加 载 驱 动 、 挂 载 必 要 的 文 件 系 统 、 启 动 所 有 必 要 的 服 务 , 等 等 。 对 于 systemd(1) 系 统 来 说 , 上 述 "init程 序 "就 是 systemd 进 程 , 而 整 个 "常 规 启 动 流 程 "也 以 几 个 特 殊 的 target 单 元 (详 见 systemd.target(5)) 作 为 节 点 , 被 划 分 为 几 个 阶 段 性 步 骤 。 在 每 个 阶 段 性 步 骤 内 部 , 任 务 是 高 度 并 行 的 , 所 以 无 法 准 确 预 测 同 一 阶 段 内 单 元 的 先 后 顺 序 , 但 是 不 同 阶 段 之 间 的 先 后 顺 序 总 是 固 定 的 。 当 启 动 系 统 时 , systemd 将 会 以 default.target 为 启 动 目 标 , 借 助 单 元 之 间 环 环 相 扣 的 依 赖 关 系 , 即 可 完 成 "常 规 启 动 流 程 "。 default.target 通 常 只 是 一 个 指 向 graphical.target(图 形 界 面 ) 或 multi-user.target(文 本 控 制 台 ) 的 软 连 接 。 为 了 强 制 启 动 流 程 的 规 范 性 以 及 提 高 单 元 的 并 行 性 , 预 先 定 义 了 一 些 具 有 特 定 含 义 的 target 单 元 。 详 见 systemd.special(7) 手 册 。 下 面 的 图 表 解 释 了 这 些 具 有 特 定 含 义 的 target 单 元 之 间 的 依 赖 关 系 以 及 各 自 在 启 动 流 程 中 的 位 置 。 图 中 的 箭 头 表 示 了 单 元 之 间 的 依 赖 关 系 与 先 后 顺 序 , 整 个 图 表 按 照 自 上 而 下 的 时 间 顺 序 执 行 。
local-fs-pre.target
|
v
(各 个 mounts 与 (各 个 swap
(各 个 加 密 块 设
备
fsck services...) devices...) devices...) (各 个
底 层 服 务 : (各 个
底 层 虚 拟
| | | udevd, tmpfiles, 文 件 系 统
mounts:
v v v random seed, mqueue, configfs,
local-fs.target swap.target cryptsetup.target sysctl, ...)
debugfs, ...)
| | | | |
\__________________|_________________ |
___________________|____________________/
\|/
v
sysinit.target
|
____________________________________/|\________________________________________
/ | | | \
| | | | |
v v | v v
(各 个 (各 个 | (各 个
rescue.service
timers...) paths...) | sockets...) |
| | | | v
v v | v rescue.target
timers.target paths.target | sockets.target
. | | |
. \_________________ | ___________________/
.................................... \|/
v
basic.target
|
____________________________________/| emergency.service
/ | | |
| | | v
v v v emergency.target
display- (图 形 界 面 所
必 需 (各 个 系 统
服 务 )
manager.service 的 各 个 系 统
服 务 ) |
| | |
| | v
| | multi-user.target
| | |
\_________________ | _________________/
\|/
v
graphical.target 用 斜 体
标 识 的 目 标 单
元 经 常 被 用 作
启 动 目 标 。 有
两 种 方 法 可 以
指 定 启 动 目 标
: (1)使 用 systemd.unit= 内
核 引 导 选 项 (参
见 systemd(1)); (2)使 用
default.target 软 连 接 。 因
为 timers.target 以 异 步 方
式 包 含 在 basic.target 中
, 所 以 timer 单 元 可
以 依 赖 于 在 basic.target
之 后 才 启 动 的
服 务 。
INITRD(INITIAL RAM DISK) 启 动 流 程
在 initrd内 部 , 也 可 以 将 systemd 用 作 init程 序 (由 "rdinit="内 核 引 导 选 项 指 定 )。 此 时 initrd.target 将 是 默 认 目 标 。 initrd内 部 启 动 流 程 的 上 半 部 分 与 前 一 小 节 basic.target 之 前 的 部 分 完 全 相 同 。 随 后 的 启 动 流 程 将 以 initrd.target 为 目 标 (如 下 图 所 示 )。 当 根 文 件 系 统 设 备 可 用 时 , 将 到 达 initd-root-device.target 目 标 。 如 果 成 功 的 将 根 文 件 系 统 挂 载 到 /sysroot 目 录 , 那 么 sysroot.mount 单 元 将 被 启 动 , 然 后 进 一 步 到 达 initrd-root-fs.target 目 标 。 initrd-parse-etc.service 将 会 分 析 /sysroot/etc/fstab 文 件 以 挂 载 /usr (若 需 要 ) 与 带 有 x-initrd.mount 标 记 的 挂 载 点 。 所 有 这 些 挂 载 点 都 将 被 挂 载 到 /sysroot 之 下 , 然 后 流 程 到 达 initrd-fs.target 目 标 。 再 接 下 来 initrd-cleanup.service 将 会 使 用 systemctl --no-block isolate 命 令 启 动 initrd-switch-root.target 目 标 。 因 为 isolate 表 示 立 即 停 止 所 有 在 新 的 目 标 单 元 中 不 需 要 的 进 程 , 所 以 此 动 作 实 际 上 是 为 接 下 来 切 换 根 目 录 做 预 先 的 准 备 (也 就 是 清 理 环 境 )。 最 后 , 启 动 initrd-switch-root.service 服 务 , 将 系 统 的 根 目 录 切 换 至 /sysroot 目 录 。
(之
前 的 流 程 与 上
一 小 节 完 全 相
同 ) :
v
basic.target
| emergency.service
______________________/| |
/ | v
| initrd-root-device.target emergency.target
| |
| v
| sysroot.mount
| |
| v
| initrd-root-fs.target
| |
| v
v initrd-parse-etc.service
(各 个 自 定 义 的 |
initrd services...) v
| (sysroot-usr.mount 以 及
| fstab 中 带 有 x-initrd.mount
| 标 记 的 各 个 挂
载 点 )
| |
| v
| initrd-fs.target
\______________________ |
\|
v
initrd.target
|
v
initrd-cleanup.service
(使 用 isolates 启 动
initrd-switch-root.target)
|
v
______________________/|
/ v
| initrd-udevadm-cleanup-db.service
v |
(各 个 自 定 义 的 |
initrd services...) |
\______________________ |
\|
v
initrd-switch-root.target
|
v
initrd-switch-root.service
|
v 切 换 到 主 机 上
的 操 作 系 统
关 机 流 程
systemd 系 统 在 关 机 时 同 样 遵 循 固 定 的 流 程 , 具 体 如 下 图 所 示 :
(与
所 有 系 统 服 务
互 斥 ) (与 所 有 文
件 系 统 mounts, swaps, cryptsetup devices
互 斥 )
| |
v v
shutdown.target umount.target
| |
\____________________________________ ______/
\ /
v
(各 个 底 层 services)
|
v
final.target
|
_____________________________________/
\_________________________________
/ | | \
| | | |
v v v v
systemd-reboot.service systemd-poweroff.service
systemd-halt.service systemd-kexec.service
| | | |
v v v v
reboot.target poweroff.target halt.target kexec.target
用 斜 体 标 识 的
目 标 单 元 经 常
被 用 作 关 机 目
标 。
参 见
systemd(1), boot(7), systemd.special(7), systemd.target(5), dracut(8)
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 翻 译 人 员 : 金 步 国 金 步 国 作 品 集 : http://www.jinbuguo.com 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh