學(xué)會(huì)愛上systemd
systemd 是所有進(jìn)程之母,負(fù)責(zé)將 Linux 主機(jī)啟動(dòng)到可以做生產(chǎn)性任務(wù)的狀態(tài)。
systemd(是的,全小寫,即使在句子開頭也是小寫),是初始化程序(init)和 SystemV 初始化腳本的現(xiàn)代替代者。此外,它還有更多功能。
當(dāng)我想到 init 和 SystemV 初始化時(shí),像大多數(shù)系統(tǒng)管理員一樣,我想到的是 Linux 的啟動(dòng)和關(guān)閉,而不是真正意義上的管理服務(wù),例如在服務(wù)啟動(dòng)和運(yùn)行后對(duì)其進(jìn)行管理。像 init 一樣,systemd 是所有進(jìn)程之母,它負(fù)責(zé)使 Linux 主機(jī)啟動(dòng)到可以做生產(chǎn)性任務(wù)的狀態(tài)。systemd 設(shè)定的一些功能比老的初始化程序要廣泛得多,它要管理正在運(yùn)行的 Linux 主機(jī)的許多方面,包括掛載文件系統(tǒng)、管理硬件、處理定時(shí)器以及啟動(dòng)和管理生產(chǎn)性主機(jī)所需的系統(tǒng)服務(wù)。
本系列文章是基于我的三期 Linux 培訓(xùn)課程《使用和管理 Linux:從零開始進(jìn)行學(xué)習(xí)系統(tǒng)管理》部分內(nèi)容的摘錄,探討了 systemd 在啟動(dòng)和啟動(dòng)完成后的功能。
Linux 引導(dǎo)
Linux 主機(jī)從關(guān)機(jī)狀態(tài)到運(yùn)行狀態(tài)的完整啟動(dòng)過程很復(fù)雜,但它是開放的并且是可知的。在詳細(xì)介紹之前,我將簡要介紹一下從主機(jī)硬件被上電到系統(tǒng)準(zhǔn)備好用戶登錄的過程。大多數(shù)時(shí)候,“引導(dǎo)過程”被作為一個(gè)整體來討論,但這是不準(zhǔn)確的。實(shí)際上,完整的引導(dǎo)和啟動(dòng)過程包含三個(gè)主要部分:
- 硬件引導(dǎo):初始化系統(tǒng)硬件
- Linux 引導(dǎo):加載 Linux 內(nèi)核和 systemd
- Linux 啟動(dòng):systemd 為主機(jī)的生產(chǎn)性工作做準(zhǔn)備
Linux 啟動(dòng)階段始于內(nèi)核加載了 init 或 systemd(取決于具體發(fā)行版使用的是舊的方式還是還是新的方式)之后。init 和 systemd 程序啟動(dòng)并管理所有其它進(jìn)程,它們?cè)诟髯缘南到y(tǒng)上都被稱為“所有進(jìn)程之母”。
將硬件引導(dǎo)與 Linux 引導(dǎo)及 Linux 啟動(dòng)區(qū)分開,并明確定義它們之間的分界點(diǎn)是很重要的。理解它們的差異以及它們每一個(gè)在使 Linux 系統(tǒng)進(jìn)入生產(chǎn)狀態(tài)所起的作用,才能夠管理這些進(jìn)程,并更好地確定大部分人所謂的“啟動(dòng)”問題出在哪里。
啟動(dòng)過程按照三步引導(dǎo)流程,使 Linux 計(jì)算機(jī)進(jìn)入可進(jìn)行生產(chǎn)工作的狀態(tài)。當(dāng)內(nèi)核將主機(jī)的控制權(quán)轉(zhuǎn)移到 systemd 時(shí),啟動(dòng)環(huán)節(jié)開始。
systemd 之爭
systemd 引起了系統(tǒng)管理員和其它負(fù)責(zé)維護(hù) Linux 系統(tǒng)正常運(yùn)行人員的廣泛爭議。在許多 Linux 系統(tǒng)中,systemd 接管了大量任務(wù),這在某些開發(fā)者和sysadmins群體中引起了反對(duì)和不和諧。
SystemV 和 systemd 是執(zhí)行 Linux 啟動(dòng)環(huán)節(jié)的兩種不同的方法。SystemV 啟動(dòng)腳本和 init 程序是老的方法,而使用目標(biāo)的 systemd 是新方法。盡管大多數(shù)現(xiàn)代 Linux 發(fā)行版都使用較新的 systemd 進(jìn)行啟動(dòng)、關(guān)機(jī)和進(jìn)程管理,但仍有一些發(fā)行版未采用。原因之一是某些發(fā)行版維護(hù)者和系統(tǒng)管理員喜歡老的 SystemV 方法,而不是新的 systemd。
我認(rèn)為兩者都有其優(yōu)勢。
為何我更喜歡 SystemV
我更喜歡 SystemV,因?yàn)樗_放。使用 Bash 腳本來完成啟動(dòng)。內(nèi)核啟動(dòng) init 程序(這是一個(gè)編譯后的二進(jìn)制)后,init 啟動(dòng) rc.sysinit 腳本,該腳本執(zhí)行許多系統(tǒng)初始化任務(wù)。rc.sysinit 執(zhí)行完后,init 啟動(dòng) /etc/rc.d/rc 腳本,該腳本依次啟動(dòng) /etc/rc.d/rcX.d 中由 SystemV 啟動(dòng)腳本定義的各種服務(wù)。其中 X 是待啟動(dòng)的運(yùn)行級(jí)別號(hào)。
除了 init 程序本身之外,所有這些程序都是開放且易于理解的腳本。可以通讀這些腳本并確切了解整個(gè)啟動(dòng)過程中發(fā)生的事情,但是我不認(rèn)為有太多系統(tǒng)管理員真正做到這一點(diǎn)。每個(gè)啟動(dòng)腳本都被編了號(hào),以便按特定順序啟動(dòng)預(yù)期的服務(wù)。服務(wù)是串行啟動(dòng)的,一次只能啟動(dòng)一個(gè)服務(wù)。
systemd 是由 Red Hat 的 Lennart Poettering 和 Kay Sievers 開發(fā)的,它是一個(gè)由大型的、編譯的二進(jìn)制可執(zhí)行文件構(gòu)成的復(fù)雜系統(tǒng),不訪問其源碼就無法理解。它是開源的,因此“訪問其源代碼”并不難,只是不太方便。systemd 似乎表現(xiàn)出對(duì) Linux 哲學(xué)多個(gè)原則的重大駁斥。作為二進(jìn)制文件,systemd 無法被直接打開供系統(tǒng)管理員查看或進(jìn)行簡單更改。systemd 試圖做所有事情,例如管理正在運(yùn)行的服務(wù),同時(shí)提供明顯比 SystemV 更多的狀態(tài)信息。它還管理硬件、進(jìn)程、進(jìn)程組、文件系統(tǒng)掛載等。systemd 幾乎涉足于現(xiàn)代 Linux 主機(jī)的每個(gè)方面,使它成為系統(tǒng)管理的一站式工具。所有這些都明顯違反了“程序應(yīng)該小,且每個(gè)程序都應(yīng)該只做一件事并做好”的原則。
為何我更喜歡 systemd
我更喜歡用 systemd 作為啟動(dòng)機(jī)制,因?yàn)樗鼤?huì)根據(jù)啟動(dòng)階段并行地啟動(dòng)盡可能多的服務(wù)。這樣可以加快整個(gè)的啟動(dòng)速度,使得主機(jī)系統(tǒng)比 SystemV 更快地到達(dá)登錄屏幕。
systemd 幾乎可以管理正在運(yùn)行的 Linux 系統(tǒng)的各個(gè)方面。它可以管理正在運(yùn)行的服務(wù),同時(shí)提供比SystemV 多得多的狀態(tài)信息。它還管理硬件、進(jìn)程和進(jìn)程組、文件系統(tǒng)掛載等。systemd 幾乎涉足于現(xiàn)代 Linux 操作系統(tǒng)的每方面,使其成為系統(tǒng)管理的一站式工具。(聽起來熟悉吧?)
systemd 工具是編譯后的二進(jìn)制文件,但該工具包是開放的,因?yàn)樗信渲梦募际?ASCII 文本文件。可以通過各種 GUI 和命令行工具來修改啟動(dòng)配置,也可以添加或修改各種配置文件來滿足特定的本地計(jì)算環(huán)境的需求。
真正的問題
你認(rèn)為我不能喜歡兩種啟動(dòng)系統(tǒng)嗎?我能,我會(huì)用它們中的任何一個(gè)。
我認(rèn)為,SystemV 和 systemd 之間大多數(shù)爭議的真正問題和根本原因在于,在系統(tǒng)管理層面沒有選擇權(quán)。使用 SystemV 還是 systemd 已經(jīng)由各種發(fā)行版的開發(fā)人員、維護(hù)人員和打包人員選擇了(但有充分的理由)。由于 init 極端的侵入性,挖出并替換 init 系統(tǒng)會(huì)帶來很多影響,會(huì)帶來很多在發(fā)行版設(shè)計(jì)過程之外難以解決的后果。
盡管該選擇實(shí)際上是為我而選的,但我的Linux主機(jī)能不能開機(jī)、能不能工作,這是我平時(shí)最關(guān)心的。作為最終用戶,甚至是系統(tǒng)管理員,我主要關(guān)心的是我是否可以完成我的工作,例如寫我的書和這篇文章,安裝更新以及編寫腳本來自動(dòng)化所有事情。只要我能做我的工作,我就不會(huì)真正在意發(fā)行版中使用的啟動(dòng)系統(tǒng)。
在啟動(dòng)或服務(wù)管理出現(xiàn)問題時(shí),我會(huì)在意。無論主機(jī)上使用哪種啟動(dòng)系統(tǒng),我都足夠了解如何沿著事件順序來查找故障并進(jìn)行修復(fù)。
替換SystemV
以前曾有過用更現(xiàn)代的東西替代 SystemV 的嘗試。大約在兩個(gè)版本中,F(xiàn)edora 使用了一個(gè)叫作 Upstart 的東西來替換老化的 SystemV,但是它沒有取代 init,也沒有提供我所注意到的任何變化。由于 Upstart 并未對(duì) SystemV 的問題進(jìn)行任何顯著的改變,所以在這個(gè)方向上的努力很快就被放棄了,轉(zhuǎn)而使用 systemd。
盡管大部分 Linux 開發(fā)人員都認(rèn)可替換舊的 SystemV 啟動(dòng)系統(tǒng)是個(gè)好主意,但許多開發(fā)人員和系統(tǒng)管理員并不喜歡 systemd。與其重新討論人們?cè)?systemd 中遇到的或曾經(jīng)遇到過的所有所謂的問題,不如帶你去看兩篇好文章,盡管有些陳舊,但它們涵蓋了大多數(shù)內(nèi)容。Linux 內(nèi)核的創(chuàng)建者 Linus Torvalds 對(duì) systemd 似乎不感興趣。在 2014 年 ZDNet 的一篇文章《Linus Torvalds 和其他人對(duì) Linux 上的 systemd 的看法》中,Linus 清楚地表達(dá)了他的感受。
“實(shí)際上我對(duì) systemd 本身沒有任何特別強(qiáng)烈的意見。我對(duì)一些核心開發(fā)人員有一些問題,我認(rèn)為他們?cè)趯?duì)待錯(cuò)誤和兼容性方面過于輕率,而且我認(rèn)為某些設(shè)計(jì)細(xì)節(jié)是瘋狂的(例如,我不喜歡二進(jìn)制日志),但這只是細(xì)節(jié),不是大問題。”
如果你對(duì) Linus 不太了解的話,我可以告訴你,如果他不喜歡某事,他是非常直言不諱的,很明確,而且相當(dāng)明確的表示不喜歡。他解決自己對(duì)事物不滿的方式已經(jīng)被社會(huì)更好地接受了。
2013 年,Poettering 寫了一篇很長的博客,他在文章駁斥了關(guān)于 systemd 的迷思,同時(shí)對(duì)創(chuàng)建 systemd 的一些原因進(jìn)行了深入的剖析。這是一分很好的讀物,我強(qiáng)烈建議你閱讀。
systemd 任務(wù)
根據(jù)編譯過程中使用的選項(xiàng)(不在本系列中介紹),systemd 可以有多達(dá) 69 個(gè)二進(jìn)制可執(zhí)行文件執(zhí)行以下任務(wù),其中包括:
systemd程序以 1 號(hào)進(jìn)程(PID 1)運(yùn)行,并提供使盡可能多服務(wù)并行啟動(dòng)的系統(tǒng)啟動(dòng)能力,它額外加快了總體啟動(dòng)時(shí)間。它還管理關(guān)機(jī)順序。systemctl程序提供了服務(wù)管理的用戶接口。- 支持 SystemV 和 LSB 啟動(dòng)腳本,以便向后兼容。
- 服務(wù)管理和報(bào)告提供了比 SystemV 更多的服務(wù)狀態(tài)數(shù)據(jù)。
- 提供基本的系統(tǒng)配置工具,例如主機(jī)名、日期、語言環(huán)境、已登錄用戶的列表,正在運(yùn)行的容器和虛擬機(jī)、系統(tǒng)帳戶、運(yùn)行時(shí)目錄及設(shè)置,用于簡易網(wǎng)絡(luò)配置、網(wǎng)絡(luò)時(shí)間同步、日志轉(zhuǎn)發(fā)和名稱解析的守護(hù)進(jìn)程。
- 提供套接字管理。
- systemd 定時(shí)器提供類似 cron 的高級(jí)功能,包括在相對(duì)于系統(tǒng)啟動(dòng)、systemd 啟動(dòng)時(shí)間、定時(shí)器上次啟動(dòng)時(shí)間的某個(gè)時(shí)間點(diǎn)運(yùn)行腳本。
- 它提供了一個(gè)工具來分析定時(shí)器規(guī)范中使用的日期和時(shí)間。
- 能感知分層的文件系統(tǒng)掛載和卸載功能可以更安全地級(jí)聯(lián)掛載的文件系統(tǒng)。
- 允許主動(dòng)的創(chuàng)建和管理臨時(shí)文件,包括刪除。
- D-Bus 的接口提供了在插入或移除設(shè)備時(shí)運(yùn)行腳本的能力。這允許將所有設(shè)備(無論是否可插拔)都被視為即插即用,從而大大簡化了設(shè)備的處理。
- 分析啟動(dòng)環(huán)節(jié)的工具可用于查找耗時(shí)最多的服務(wù)。
- 它包括用于存儲(chǔ)系統(tǒng)消息的日志以及管理日志的工具。
架構(gòu)
這些以及更多的任務(wù)通過許多守護(hù)程序、控制程序和配置文件來支持。圖 1 顯示了許多屬于 systemd 的組件。這是一個(gè)簡化的圖,旨在提供概要描述,因此它并不包括所有獨(dú)立的程序或文件。它也不提供數(shù)據(jù)流的視角,數(shù)據(jù)流是如此復(fù)雜,因此在本系列文章的背景下沒用。
圖 1:systemd 的架構(gòu),作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0)
如果要完整地講解 systemd 就需要一本書。你不需要了解圖 1 中的 systemd 組件是如何組合在一起的細(xì)節(jié)。只需了解支持各種 Linux 服務(wù)管理以及日志文件和日志處理的程序和組件就夠了。但是很明顯, systemd 并不是某些批評(píng)者所宣稱的那樣,它是一個(gè)單一的怪物。
作為 1 號(hào)進(jìn)程的 systemd
systemd 是 1 號(hào)進(jìn)程(PID 1)。它的一些功能,比老的 SystemV3 init 要廣泛得多,用于管理正在運(yùn)行的 Linux 主機(jī)的許多方面,包括掛載文件系統(tǒng)以及啟動(dòng)和管理 Linux 生產(chǎn)主機(jī)所需的系統(tǒng)服務(wù)。與啟動(dòng)環(huán)節(jié)無關(guān)的任何 systemd 任務(wù)都不在本文討論范圍之內(nèi)(但本系列后面的一些文章將探討其中的一些任務(wù))。
首先,systemd 掛載 /etc/fstab 所定義的文件系統(tǒng),包括所有交換文件或分區(qū)。此時(shí),它可以訪問位于 /etc 中的配置文件,包括它自己的配置文件。它使用其配置鏈接 /etc/systemd/system/default.target 來確定將主機(jī)引導(dǎo)至哪個(gè)狀態(tài)或目標(biāo)。default.target 文件是指向真實(shí)目標(biāo)文件的符號(hào)鏈接。對(duì)于桌面工作站,通常是 graphical.target,它相當(dāng)于 SystemV 中的運(yùn)行級(jí)別 5。對(duì)于服務(wù)器,默認(rèn)值更可能是 multi-user.target,相當(dāng)于 SystemV 中的運(yùn)行級(jí)別 3。emergency.target 類似于單用戶模式。目標(biāo)和服務(wù)是 systemd 的單元。
下表(圖 2)將 systemd 目標(biāo)與老的 SystemV 啟動(dòng)運(yùn)行級(jí)別進(jìn)行了比較。systemd 提供 systemd 目標(biāo)別名以便向后兼容。目標(biāo)別名允許腳本(以及許多系統(tǒng)管理員)使用 SystemV 命令(如 init 3)更改運(yùn)行級(jí)別。當(dāng)然,SystemV 命令被轉(zhuǎn)發(fā)給 systemd 進(jìn)行解釋和執(zhí)行。
systemd 目標(biāo)
SystemV 運(yùn)行級(jí)別
目標(biāo)別名
描述
default.target
此目標(biāo)總是通過符號(hào)連接的方式成為
multi-user.target 或 graphical.target 的別名。systemd 始終使用 default.target 來啟動(dòng)系統(tǒng)。default.target 絕不應(yīng)該設(shè)為 halt.target,poweroff.target 或 reboot.target 的別名。
graphic.target5
runlevel5.target帶有 GUI 的
multi-user.target。
4
runlevel4.target未用。在 SystemV 中運(yùn)行級(jí)別 4 與運(yùn)行級(jí)別 3 相同。可以創(chuàng)建并自定義此目標(biāo)以啟動(dòng)本地服務(wù),而無需更改默認(rèn)的
multi-user.target。
multi-user.target3
runlevel3.target所有服務(wù)在運(yùn)行,但僅有命令行界面(CLI)。
2
runlevel2.target多用戶,沒有 NFS,其它所有非 GUI 服務(wù)在運(yùn)行。
rescue.target1
runlevel1.target基本系統(tǒng),包括掛載文件系統(tǒng),運(yùn)行最基本的服務(wù)和主控制臺(tái)的恢復(fù) shell。
emergency.targetS
單用戶模式:沒有服務(wù)運(yùn)行;不掛載文件系統(tǒng)。這是最基本的工作級(jí)別,只有主控制臺(tái)上運(yùn)行的一個(gè)緊急 Shell 供用戶與系統(tǒng)交互。
halt.target
停止系統(tǒng)而不關(guān)閉電源。
reboot.target6
runlevel6.target重啟。
poweroff.target0
runlevel0.target停止系統(tǒng)并關(guān)閉電源。
圖 2:SystemV 運(yùn)行級(jí)別與 systemd 目標(biāo)和一些目標(biāo)別名的比較
每個(gè)目標(biāo)在其配置文件中都描述了一個(gè)依賴集。systemd 啟動(dòng)必須的依賴項(xiàng),這些依賴項(xiàng)是運(yùn)行 Linux 主機(jī)到特定功能級(jí)別所需的服務(wù)。當(dāng)目標(biāo)配置文件中列出的所有依賴項(xiàng)被加載并運(yùn)行后,系統(tǒng)就在該目標(biāo)級(jí)別運(yùn)行了。在圖 2 中,功能最多的目標(biāo)位于表的頂部,從頂向下,功能逐步遞減。
systemd 還會(huì)檢查老的 SystemV init 目錄,以確認(rèn)是否存在任何啟動(dòng)文件。如果有,systemd 會(huì)將它們作為配置文件以啟動(dòng)它們描述的服務(wù)。網(wǎng)絡(luò)服務(wù)是一個(gè)很好的例子,在 Fedora 中它仍然使用 SystemV 啟動(dòng)文件。
圖 3(如下)是直接從啟動(dòng)手冊(cè)頁復(fù)制來的。它顯示了 systemd 啟動(dòng)期間一般的事件環(huán)節(jié)以及確保成功啟動(dòng)的基本順序要求。
cryptsetup-pre.target|(various low-level vAPI VFS mounts: (various cryptsetup devices...)mqueue, configfs, | |debugfs, ...) v || cryptsetup.target || (various swap | | remote-fs-pre.target| devices...) | | | || | | | | v| v local-fs-pre.target | | | (network file systems)| swap.target | | v v || | v | remote-cryptsetup.target || | (various low-level (various mounts and | | || | services: udevd, fsck services...) | | remote-fs.target| | tmpfiles, random | | | /| | seed, sysctl, ...) v | | /| | | local-fs.target | | /| | | | | | /\____|______|_______________ ______|___________/ | /\ / | /v | /sysinit.target | /| | /______________________/|\_____________________ | // | | | \ | /| | | | | | /v v | v | | /(various (various | (various | |/timers...) paths...) | sockets...) | || | | | | |v v | v | |timers.target paths.target | sockets.target | || | | | v |v \_______ | _____/ rescue.service |\|/ | |v v |basic.target rescue.target || |________v____________________ |/ | \ || | | |v v v |display- (various system (various system |manager.service services services) || required for | || graphical UIs) v v| | multi-user.targetemergency.service | | || \_____________ | _____________/v \|/emergency.target vgraphical.target
圖 3: systemd 啟動(dòng)圖
sysinit.target 和 basic.target 目標(biāo)可以看作啟動(dòng)過程中的檢查點(diǎn)。盡管 systemd 的設(shè)計(jì)目標(biāo)之一是并行啟動(dòng)系統(tǒng)服務(wù),但是某些服務(wù)和功能目標(biāo)必須先啟動(dòng),然后才能啟動(dòng)其它服務(wù)和目標(biāo)。直到該檢查點(diǎn)所需的所有服務(wù)和目標(biāo)被滿足后才能通過這些檢查點(diǎn)。
當(dāng) sysinit.target 所依賴的所有單元都完成時(shí),就會(huì)到達(dá) sysinit.target。所有這些單元,包括掛載文件系統(tǒng)、設(shè)置交換文件、啟動(dòng) Udev、設(shè)置隨機(jī)數(shù)生成器種子、啟動(dòng)低層服務(wù)以及配置安全服務(wù)(如果一個(gè)或多個(gè)文件系統(tǒng)是加密的)都必須被完成,但在 sysinit.target 中,這些任務(wù)可以并行執(zhí)行。
sysinit.target 啟動(dòng)了系統(tǒng)接近正常運(yùn)行所需的所有低層服務(wù)和單元,它們也是進(jìn)入 basic.target 所需的。
在完成 sysinit.target 之后,systemd 會(huì)啟動(dòng)實(shí)現(xiàn)下一個(gè)目標(biāo)所需的所有單元。basic.target 通過啟動(dòng)所有下一目標(biāo)所需的單元來提供一些額外功能。包括設(shè)置為各種可執(zhí)行程序目錄的路徑、設(shè)置通信套接字和計(jì)時(shí)器之類。
最后,用戶級(jí)目標(biāo) multi-user.target 或 graphical.target 被初始化。要滿足 graphical.target 的依賴必須先達(dá)到 multi-user.target。圖 3 中帶下劃線的目標(biāo)是通常的啟動(dòng)目標(biāo)。當(dāng)達(dá)到這些目標(biāo)之一時(shí),啟動(dòng)就完成了。如果 multi-user.target 是默認(rèn)設(shè)置,那么你應(yīng)該在控制臺(tái)上看到文本模式的登錄界面。如果 graphical.target 是默認(rèn)設(shè)置,那么你應(yīng)該看到圖形的登錄界面。你看到的具體的 GUI 登錄界面取決于你的默認(rèn)顯示管理器。
引導(dǎo)手冊(cè)頁還描述并提供了引導(dǎo)到初始化 RAM 磁盤和 systemd 關(guān)機(jī)過程的圖。
systemd 還提供了一個(gè)工具,該工具列出了完整的啟動(dòng)過程或指定單元的依賴項(xiàng)。單元是一個(gè)可控的 systemd 資源實(shí)體,其范圍可以從特定服務(wù)(例如 httpd 或 sshd)到計(jì)時(shí)器、掛載、套接字等。嘗試以下命令并滾動(dòng)查看結(jié)果。
systemctl list-dependencies graphical.target
注意,這會(huì)完全展開使系統(tǒng)進(jìn)入 graphical.target 運(yùn)行模式所需的頂層目標(biāo)單元列表。也可以使用 --all 選項(xiàng)來展開所有其它單元。
systemctl list-dependencies --all graphical.target
你可以使用 less 命令來搜索諸如 target、slice 和 socket 之類的字符串。
現(xiàn)在嘗試下面的方法。
systemctl list-dependencies multi-user.target
和
systemctl list-dependencies rescue.target
和
systemctl list-dependencies local-fs.target
和
systemctl list-dependencies dbus.service
這個(gè)工具幫助我可視化我正用的主機(jī)的啟動(dòng)依賴細(xì)節(jié)。繼續(xù)花一些時(shí)間探索一個(gè)或多個(gè) Linux 主機(jī)的啟動(dòng)樹。但是要小心,因?yàn)?systemctl 手冊(cè)頁包含以下注釋:
“請(qǐng)注意,此命令僅列出當(dāng)前被服務(wù)管理器加載到內(nèi)存的單元。尤其是,此命令根本不適合用于獲取特定單元的全部反向依賴關(guān)系列表,因?yàn)樗粫?huì)列出被單元聲明了但是未加載的依賴項(xiàng)。”
結(jié)尾語
即使在沒有深入研究 systemd 之前,很明顯能看出它既強(qiáng)大又復(fù)雜。顯然,systemd 不是單一、龐大、獨(dú)體且不可知的二進(jìn)制文件。相反,它是由許多較小的組件和旨在執(zhí)行特定任務(wù)的子命令組成。
本系列的下一篇文章將更詳細(xì)地探討 systemd 的啟動(dòng),以及 systemd 的配置文件,更改默認(rèn)的目標(biāo)以及如何創(chuàng)建簡單服務(wù)單元。






















