Manpages

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