Provided by: manpages-zh_1.6.3.2-1_all
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