Provided by: manpages-zh_1.6.3.3-2_all bug

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