Systemd(轉(zhuǎn))

最近在研究Docker的源碼.讀到ApiServer的啟動(dòng)過(guò)程時(shí),發(fā)現(xiàn)其有一個(gè)新的概念,叫做service activation.不理解這是什么東西,就查閱了相關(guān)的資料.找到了IBM的一篇較好的文章,這里分享給大家.

原文鏈接:https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/

Systemd 的簡(jiǎn)介和特點(diǎn)

Systemd 是 Linux 系統(tǒng)中最新的初始化系統(tǒng)(init)栏渺,它主要的設(shè)計(jì)目標(biāo)是克服 sysvinit 固有的缺點(diǎn),提高系統(tǒng)的啟動(dòng)速度棋电。systemd 和 ubuntu 的 upstart 是競(jìng)爭(zhēng)對(duì)手摇锋,預(yù)計(jì)會(huì)取代 UpStart,實(shí)際上在作者寫作本文時(shí)祈争,已經(jīng)有消息稱 Ubuntu 也將采用 systemd 作為其標(biāo)準(zhǔn)的系統(tǒng)初始化系統(tǒng)斤程。

Systemd 的很多概念來(lái)源于蘋果 Mac OS 操作系統(tǒng)上的 launchd,不過(guò) launchd 專用于蘋果系統(tǒng)菩混,因此長(zhǎng)期未能獲得應(yīng)有的廣泛關(guān)注忿墅。Systemd 借鑒了很多 launchd 的思想,它的重要特性如下:

  • 同 SysVinit 和 LSB init scripts 兼容
    Systemd 是一個(gè)"新來(lái)的"沮峡,Linux 上的很多應(yīng)用程序并沒有來(lái)得及為它做相應(yīng)的改變疚脐。和 UpStart 一樣,systemd 引入了新的配置方式邢疙,對(duì)應(yīng)用程序的開發(fā)也有一些新的要求棍弄。如果 systemd 想替代目前正在運(yùn)行的初始化系統(tǒng),就必須和現(xiàn)有程序兼容疟游。任何一個(gè) Linux 發(fā)行版都很難為了采用 systemd 而在短時(shí)間內(nèi)將所有的服務(wù)代碼都修改一遍呼畸。
    Systemd 提供了和 Sysvinit 以及 LSB initscripts 兼容的特性。系統(tǒng)中已經(jīng)存在的服務(wù)和進(jìn)程無(wú)需修改颁虐。這降低了系統(tǒng)向 systemd 遷移的成本蛮原,使得 systemd 替換現(xiàn)有初始化系統(tǒng)成為可能。

  • 更快的啟動(dòng)速度
    Systemd 提供了比 UpStart 更激進(jìn)的并行啟動(dòng)能力另绩,采用了 socket / D-Bus activation 等技術(shù)啟動(dòng)服務(wù)儒陨。一個(gè)顯而易見的結(jié)果就是:更快的啟動(dòng)速度。
    為了減少系統(tǒng)啟動(dòng)時(shí)間笋籽,systemd 的目標(biāo)是:

  • 盡可能啟動(dòng)更少的進(jìn)程

  • 盡可能將更多進(jìn)程并行啟動(dòng)

同樣地蹦漠,UpStart 也試圖實(shí)現(xiàn)這兩個(gè)目標(biāo)。UpStart 采用事件驅(qū)動(dòng)機(jī)制车海,服務(wù)可以暫不啟動(dòng)津辩,當(dāng)需要的時(shí)候才通過(guò)事件觸發(fā)其啟動(dòng),這符合第一個(gè)設(shè)計(jì)目標(biāo);此外喘沿,不相干的服務(wù)可以并行啟動(dòng)闸度,這也實(shí)現(xiàn)了第二個(gè)目標(biāo)。

下面的圖形演示了 UpStart 相對(duì)于 SysVInit 在并發(fā)啟動(dòng)這個(gè)方面的改進(jìn):

UpStart 對(duì) SysVinit 的改進(jìn)
UpStart 對(duì) SysVinit 的改進(jìn)

假設(shè)有 7 個(gè)不同的啟動(dòng)項(xiàng)目蚜印, 比如 JobA莺禁、Job B 等等。在 SysVInit 中窄赋,每一個(gè)啟動(dòng)項(xiàng)目都由一個(gè)獨(dú)立的腳本負(fù)責(zé)哟冬,它們由 sysVinit 順序地,串行地調(diào)用忆绰。因此總的啟動(dòng)時(shí)間為 T1+T2+T3+T4+T5+T6+T7浩峡。其中一些任務(wù)有依賴關(guān)系,比如 A,B,C,D错敢。

而 Job E 和 F 卻和 A,B,C,D 無(wú)關(guān)翰灾。這種情況下,UpStart 能夠并發(fā)地運(yùn)行任務(wù){(diào)E稚茅,F(xiàn)纸淮,(A,B,C,D)},使得總的啟動(dòng)時(shí)間減少為 T1+T2+T3亚享。

這無(wú)疑增加了系統(tǒng)啟動(dòng)的并行性咽块,從而提高了系統(tǒng)啟動(dòng)速度。但是在 UpStart 中欺税,有依賴關(guān)系的服務(wù)還是必須先后啟動(dòng)侈沪。比如任務(wù) A,B,(C,D)因?yàn)榇嬖谝蕾囮P(guān)系,所以在這個(gè)局部晚凿,還是串行執(zhí)行峭竣。

讓我們例舉一些例子, Avahi 服務(wù)需要 D-Bus 提供的功能晃虫,因此 Avahi 的啟動(dòng)依賴于 D-Bus,UpStart 中扣墩,Avahi 必須等到 D-Bus 啟動(dòng)就緒之后才開始啟動(dòng)哲银。類似的,livirtd 和 X11 都需要 HAL 服務(wù)先啟動(dòng)呻惕,而所有這些服務(wù)都需要 syslog 服務(wù)記錄日志荆责,因此它們都必須等待 syslog 服務(wù)先啟動(dòng)起來(lái)。然而 httpd 和他們都沒有關(guān)系亚脆,因此 httpd 可以和 Avahi 等服務(wù)并發(fā)啟動(dòng)做院。

Systemd 能夠更進(jìn)一步提高并發(fā)性,即便對(duì)于那些 UpStart 認(rèn)為存在相互依賴而必須串行的服務(wù),比如 Avahi 和 D-Bus 也可以并發(fā)啟動(dòng)键耕。從而實(shí)現(xiàn)如下圖所示的并發(fā)啟動(dòng)過(guò)程:

systemd 的并發(fā)啟動(dòng)
systemd 的并發(fā)啟動(dòng)

所有的任務(wù)都同時(shí)并發(fā)執(zhí)行寺滚,總的啟動(dòng)時(shí)間被進(jìn)一步降低為 T1。

可見 systemd 比 UpStart 更進(jìn)一步提高了并行啟動(dòng)能力屈雄,極大地加速了系統(tǒng)啟動(dòng)時(shí)間村视。

  • systemd 提供按需啟動(dòng)能力
    當(dāng) sysvinit 系統(tǒng)初始化的時(shí)候,它會(huì)將所有可能用到的后臺(tái)服務(wù)進(jìn)程全部啟動(dòng)運(yùn)行酒奶。并且系統(tǒng)必須等待所有的服務(wù)都啟動(dòng)就緒之后蚁孔,才允許用戶登錄。這種做法有兩個(gè)缺點(diǎn):首先是啟動(dòng)時(shí)間過(guò)長(zhǎng)惋嚎;其次是系統(tǒng)資源浪費(fèi)杠氢。

    某些服務(wù)很可能在很長(zhǎng)一段時(shí)間內(nèi),甚至整個(gè)服務(wù)器運(yùn)行期間都沒有被使用過(guò)另伍。比如 CUPS鼻百,打印服務(wù)在多數(shù)服務(wù)器上很少被真正使用到。您可能沒有想到质况,在很多服務(wù)器上 SSHD 也是很少被真正訪問(wèn)到的愕宋。花費(fèi)在啟動(dòng)這些服務(wù)上的時(shí)間是不必要的结榄;同樣中贝,花費(fèi)在這些服務(wù)上的系統(tǒng)資源也是一種浪費(fèi)。

    Systemd 可以提供按需啟動(dòng)的能力臼朗,只有在某個(gè)服務(wù)被真正請(qǐng)求的時(shí)候才啟動(dòng)它邻寿。當(dāng)該服務(wù)結(jié)束,systemd 可以關(guān)閉它视哑,等待下次需要時(shí)再次啟動(dòng)它绣否。

  • Systemd 采用 Linux 的 Cgroup 特性跟蹤和管理進(jìn)程的生命周期
    init 系統(tǒng)的一個(gè)重要職責(zé)就是負(fù)責(zé)跟蹤和管理服務(wù)進(jìn)程的生命周期。它不僅可以啟動(dòng)一個(gè)服務(wù)挡毅,也必須也能夠停止服務(wù)蒜撮。這看上去沒有什么特別的,然而在真正用代碼實(shí)現(xiàn)的時(shí)候跪呈,您或許會(huì)發(fā)現(xiàn)停止服務(wù)比一開始想的要困難段磨。
    服務(wù)進(jìn)程一般都會(huì)作為精靈進(jìn)程(daemon)在后臺(tái)運(yùn)行耗绿,為此服務(wù)程序有時(shí)候會(huì)派生(fork)兩次。在 UpStart 中,需要在配置文件中正確地配置 expect 小節(jié)唐含。這樣 UpStart 通過(guò)對(duì) fork 系統(tǒng)調(diào)用進(jìn)行計(jì)數(shù),從而獲知真正的精靈進(jìn)程的 PID 號(hào)案站。比如圖 3 所示的例子:

    找到正確 pid
    找到正確 pid

    如果 UpStart 找錯(cuò)了倘零,將 p1作為服務(wù)進(jìn)程的 Pid飒箭,那么停止服務(wù)的時(shí)候脑漫,UpStart 會(huì)試圖殺死 p1進(jìn)程队秩,而真正的 p1``進(jìn)程則繼續(xù)執(zhí)行火诸。換句話說(shuō)該服務(wù)就失去控制了奈搜。

    還有更加特殊的情況。比如繁莹,一個(gè) CGI 程序會(huì)派生兩次,從而脫離了和 Apache 的父子關(guān)系敬辣。當(dāng) Apache 進(jìn)程被停止后雪标,該 CGI 程序還在繼續(xù)運(yùn)行。而我們希望服務(wù)停止后溉跃,所有由它所啟動(dòng)的相關(guān)進(jìn)程也被停止村刨。

    為了處理這類問(wèn)題,UpStart 通過(guò) strace 來(lái)跟蹤 fork撰茎、exit 等系統(tǒng)調(diào)用嵌牺,但是這種方法很笨拙,且缺乏可擴(kuò)展性龄糊。systemd 則利用了 Linux 內(nèi)核的特性即 CGroup 來(lái)完成跟蹤的任務(wù)逆粹。當(dāng)停止服務(wù)時(shí),通過(guò)查詢 CGroup炫惩,systemd 可以確保找到所有的相關(guān)進(jìn)程僻弹,從而干凈地停止服務(wù)。

    CGroup 已經(jīng)出現(xiàn)了很久他嚷,它主要用來(lái)實(shí)現(xiàn)系統(tǒng)資源配額管理蹋绽。CGroup 提供了類似文件系統(tǒng)的接口,使用方便筋蓖。當(dāng)進(jìn)程創(chuàng)建子進(jìn)程時(shí)卸耘,子進(jìn)程會(huì)繼承父進(jìn)程的 CGroup。因此無(wú)論服務(wù)如何啟動(dòng)新的子進(jìn)程粘咖,所有的這些相關(guān)進(jìn)程都會(huì)屬于同一個(gè) CGroup蚣抗,systemd 只需要簡(jiǎn)單地遍歷指定的 CGroup 即可正確地找到所有的相關(guān)進(jìn)程,將它們一一停止即可瓮下。

  • 啟動(dòng)掛載點(diǎn)和自動(dòng)掛載的管理

    傳統(tǒng)的 Linux 系統(tǒng)中翰铡,用戶可以用/etc/fstab 文件來(lái)維護(hù)固定的文件系統(tǒng)掛載點(diǎn)设哗。這些掛載點(diǎn)在系統(tǒng)啟動(dòng)過(guò)程中被自動(dòng)掛載,一旦啟動(dòng)過(guò)程結(jié)束两蟀,這些掛載點(diǎn)就會(huì)確保存在。這些掛載點(diǎn)都是對(duì)系統(tǒng)運(yùn)行至關(guān)重要的文件系統(tǒng)震缭,比如 HOME 目錄赂毯。和 sysvinit 一樣,Systemd 管理這些掛載點(diǎn)拣宰,以便能夠在系統(tǒng)啟動(dòng)時(shí)自動(dòng)掛載它們党涕。Systemd 還兼容/etc/fstab 文件,您可以繼續(xù)使用該文件管理掛載點(diǎn)巡社。

    有時(shí)候用戶還需要?jiǎng)討B(tài)掛載點(diǎn)膛堤,比如打算訪問(wèn) DVD 內(nèi)容時(shí)晌该,才臨時(shí)執(zhí)行掛載以便訪問(wèn)其中的內(nèi)容,而不訪問(wèn)光盤時(shí)該掛載點(diǎn)被取消(umount)朝群,以便節(jié)約資源。傳統(tǒng)地姜胖,人們依賴 autofs 服務(wù)來(lái)實(shí)現(xiàn)這種功能。

    Systemd 內(nèi)建了自動(dòng)掛載服務(wù)右莱,無(wú)需另外安裝 autofs 服務(wù),可以直接使用 systemd 提供的自動(dòng)掛載管理能力來(lái)實(shí)現(xiàn) autofs 的功能亚再。

  • 實(shí)現(xiàn)事務(wù)性依賴關(guān)系管理

    系統(tǒng)啟動(dòng)過(guò)程是由很多的獨(dú)立工作共同組成的,這些工作之間可能存在依賴關(guān)系针余,比如掛載一個(gè) NFS 文件系統(tǒng)必須依賴網(wǎng)絡(luò)能夠正常工作。

    Systemd 雖然能夠最大限度地并發(fā)執(zhí)行很多有依賴關(guān)系的工作凄诞,但是類似"掛載 NFS"和"啟動(dòng)網(wǎng)絡(luò)"這樣的工作還是存在天生的先后依賴關(guān)系圆雁,無(wú)法并發(fā)執(zhí)行。對(duì)于這些任務(wù)帆谍,systemd 維護(hù)一個(gè)"事務(wù)一致性"的概念伪朽,保證所有相關(guān)的服務(wù)都可以正常啟動(dòng)而不會(huì)出現(xiàn)互相依賴,以至于死鎖的情況汛蝙。

  • 能夠?qū)ο到y(tǒng)進(jìn)行快照和恢復(fù)

    systemd 支持按需啟動(dòng)烈涮,因此系統(tǒng)的運(yùn)行狀態(tài)是動(dòng)態(tài)變化的朴肺,人們無(wú)法準(zhǔn)確地知道系統(tǒng)當(dāng)前運(yùn)行了哪些服務(wù)。Systemd 快照提供了一種將當(dāng)前系統(tǒng)運(yùn)行狀態(tài)保存并恢復(fù)的能力坚洽。

    比如系統(tǒng)當(dāng)前正運(yùn)行服務(wù) A 和 B戈稿,可以用 systemd 命令行對(duì)當(dāng)前系統(tǒng)運(yùn)行狀況創(chuàng)建快照。然后將進(jìn)程 A 停止讶舰,或者做其他的任意的對(duì)系統(tǒng)的改變鞍盗,比如啟動(dòng)新的進(jìn)程 C。在這些改變之后跳昼,運(yùn)行 systemd 的快照恢復(fù)命令般甲,就可立即將系統(tǒng)恢復(fù)到快照時(shí)刻的狀態(tài),即只有服務(wù) A鹅颊,B 在運(yùn)行敷存。一個(gè)可能的應(yīng)用場(chǎng)景是調(diào)試:比如服務(wù)器出現(xiàn)一些異常堪伍,為了調(diào)試用戶將當(dāng)前狀態(tài)保存為快照,然后可以進(jìn)行任意的操作挽牢,比如停止服務(wù)等等摊求。等調(diào)試結(jié)束室叉,恢復(fù)快照即可。

    這個(gè)快照功能目前在 systemd 中并不完善野来,似乎開發(fā)人員也沒有特別關(guān)注它踪旷,因此有報(bào)告指出它還存在一些使用上的問(wèn)題令野,使用時(shí)尚需慎重。

  • 日志服務(wù)
    systemd 自帶日志服務(wù) journald聊浅,該日志服務(wù)的設(shè)計(jì)初衷是克服現(xiàn)有的 syslog 服務(wù)的缺點(diǎn)。比如:

    • syslog 不安全旷痕,消息的內(nèi)容無(wú)法驗(yàn)證顽冶。每一個(gè)本地進(jìn)程都可以聲稱自己是 Apache PID 4711,而 syslog 也就相信并保存到磁盤上佩迟。
    • 數(shù)據(jù)沒有嚴(yán)格的格式,非常隨意灸姊。自動(dòng)化的日志分析器需要分析人類語(yǔ)言字符串來(lái)識(shí)別消息。一方面此類分析困難低效碗誉;此外日志格式的變化會(huì)導(dǎo)致分析代碼需要更新甚至重寫哮缺。

    Systemd Journal 用二進(jìn)制格式保存所有日志信息甲喝,用戶使用 journalctl 命令來(lái)查看日志信息。無(wú)需自己編寫復(fù)雜脆弱的字符串分析處理程序糠溜。

    Systemd Journal 的優(yōu)點(diǎn)如下:

    • 簡(jiǎn)單性:代碼少直撤,依賴少谋竖,抽象開銷最小。
    • 零維護(hù):日志是除錯(cuò)和監(jiān)控系統(tǒng)的核心功能锤悄,因此它自己不能再產(chǎn)生問(wèn)題嘉抒。舉例說(shuō),自動(dòng)管理磁盤空間握牧,避免由于日志的不斷產(chǎn)生而將磁盤空間耗盡。
    • 移植性:日志 文件應(yīng)該在所有類型的 Linux 系統(tǒng)上可用览徒,無(wú)論它使用的何種 CPU 或者字節(jié)序颂龙。
    • 性能:添加和瀏覽 日志 非常快躲叼。
    • 最小資源占用:日志 數(shù)據(jù)文件需要較小枫慷。
    • 統(tǒng)一化:各種不同的日志存儲(chǔ)技術(shù)應(yīng)該統(tǒng)一起來(lái)浪规,將所有的可記錄事件保存在同一個(gè)數(shù)據(jù)存儲(chǔ)中。所以日志內(nèi)容的全局上下文都會(huì)被保存并且可供日后查詢誉裆。例如一條固件記錄后通常會(huì)跟隨一條內(nèi)核記錄足丢,最終還會(huì)有一條用戶態(tài)記錄庇配。重要的是當(dāng)保存到硬盤上時(shí)這三者之間的關(guān)系不會(huì)丟失。Syslog 將不同的信息保存到不同的文件中滔驶,分析的時(shí)候很難確定哪些條目是相關(guān)的卿闹。
    • 擴(kuò)展性:日志的適用范圍很廣,從嵌入式設(shè)備到超級(jí)計(jì)算機(jī)集群都可以滿足需求著角。
    • 安全性:日志 文件是可以驗(yàn)證的吏口,讓無(wú)法檢測(cè)的修改不再可能。

Systemd 的基本概念

單元的概念

系統(tǒng)初始化需要做的事情非常多昂勒。需要啟動(dòng)后臺(tái)服務(wù)戈盈,比如啟動(dòng) SSHD 服務(wù)谆刨;需要做配置工作,比如掛載文件系統(tǒng)刁岸。這個(gè)過(guò)程中的每一步都被 systemd 抽象為一個(gè)配置單元虹曙,即 unit鸦难『媳危可以認(rèn)為一個(gè)服務(wù)是一個(gè)配置單元介返;一個(gè)掛載點(diǎn)是一個(gè)配置單元圣蝎;一個(gè)交換分區(qū)的配置是一個(gè)配置單元;等等牲证。systemd 將配置單元?dú)w納為以下一些不同的類型坦袍。然而等太,systemd 正在快速發(fā)展,新功能不斷增加奠宜。所以配置單元類型可能在不久的將來(lái)繼續(xù)增加压真。

  • service :代表一個(gè)后臺(tái)服務(wù)進(jìn)程,比如 mysqld待锈。這是最常用的一類竿音。
  • socket :此類配置單元封裝系統(tǒng)和互聯(lián)網(wǎng)中的一個(gè) 套接字 拴驮。當(dāng)下套啤,systemd 支持流式、數(shù)據(jù)報(bào)和連續(xù)包的 AF_INET萄涯、AF_INET6涝影、AF_UNIX socket 争占。每一個(gè)套接字配置單元都有一個(gè)相應(yīng)的服務(wù)配置單元 。相應(yīng)的服務(wù)在第一個(gè)"連接"進(jìn)入套接字時(shí)就會(huì)啟動(dòng)(例如:nscd.socket 在有新連接后便啟動(dòng) nscd.service)伯襟。
  • device :此類配置單元封裝一個(gè)存在于 Linux 設(shè)備樹中的設(shè)備姆怪。每一個(gè)使用 udev 規(guī)則標(biāo)記的設(shè)備都將會(huì)在 systemd 中作為一個(gè)設(shè)備配置單元出現(xiàn)片效。
  • mount :此類配置單元封裝文件系統(tǒng)結(jié)構(gòu)層次中的一個(gè)掛載點(diǎn)英古。Systemd 將對(duì)這個(gè)掛載點(diǎn)進(jìn)行監(jiān)控和管理。比如可以在啟動(dòng)時(shí)自動(dòng)將其掛載膨桥;可以在某些條件下自動(dòng)卸載。Systemd 會(huì)將/etc/fstab 中的條目都轉(zhuǎn)換為掛載點(diǎn)沮稚,并在開機(jī)時(shí)處理蕴掏。
  • automount :此類配置單元封裝系統(tǒng)結(jié)構(gòu)層次中的一個(gè)自掛載點(diǎn)调鲸。每一個(gè)自掛載配置單元對(duì)應(yīng)一個(gè)掛載配置單元 ,當(dāng)該自動(dòng)掛載點(diǎn)被訪問(wèn)時(shí)即供,systemd 執(zhí)行掛載點(diǎn)中定義的掛載行為逗嫡。
  • swap: 和掛載配置單元類似株依,交換配置單元用來(lái)管理交換分區(qū)恋腕。用戶可以用交換配置單元來(lái)定義系統(tǒng)中的交換分區(qū),可以讓這些交換分區(qū)在啟動(dòng)時(shí)被激活祈远。
  • target :此類配置單元為其他配置單元進(jìn)行邏輯分組商源。它們本身實(shí)際上并不做什么牡彻,只是引用其他配置單元而已出爹。這樣便可以對(duì)配置單元做一個(gè)統(tǒng)一的控制严就。這樣就可以實(shí)現(xiàn)大家都已經(jīng)非常熟悉的運(yùn)行級(jí)別概念。比如想讓系統(tǒng)進(jìn)入圖形化模式渐行,需要運(yùn)行許多服務(wù)和配置命令,這些操作都由一個(gè)個(gè)的配置單元表示肴沫,將所有這些配置單元組合為一個(gè)目標(biāo)(target)蕴忆,就表示需要將這些配置單元全部執(zhí)行一遍以便進(jìn)入目標(biāo)所代表的系統(tǒng)運(yùn)行狀態(tài)。 (例如:multi-user.target 相當(dāng)于在傳統(tǒng)使用 SysV 的系統(tǒng)中運(yùn)行級(jí)別 5)
  • timer:定時(shí)器配置單元用來(lái)定時(shí)觸發(fā)用戶定義的操作站蝠,這類配置單元取代了 atd沉衣、crond 等傳統(tǒng)的定時(shí)服務(wù)减牺。
  • snapshot :與 target 配置單元相似,快照是一組配置單元肥隆。它保存了系統(tǒng)當(dāng)前的運(yùn)行狀態(tài)栋艳。

每個(gè)配置單元都有一個(gè)對(duì)應(yīng)的配置文件吸占,系統(tǒng)管理員的任務(wù)就是編寫和維護(hù)這些不同的配置文件凿宾,比如一個(gè) MySQL 服務(wù)對(duì)應(yīng)一個(gè) mysql.service 文件。這種配置文件的語(yǔ)法非常簡(jiǎn)單件蚕,用戶不需要再編寫和維護(hù)復(fù)雜的系統(tǒng) 5 腳本了排作。

依賴關(guān)系

雖然 systemd 將大量的啟動(dòng)工作解除了依賴亚情,使得它們可以并發(fā)啟動(dòng)。但還是存在有些任務(wù)衫生,它們之間存在天生的依賴,不能用"套接字激活"(socket activation)盹愚、D-Bus activation 和 autofs 三大方法來(lái)解除依賴(三大方法詳情見后續(xù)描述)皆怕。比如:掛載必須等待掛載點(diǎn)在文件系統(tǒng)中被創(chuàng)建西篓;掛載也必須等待相應(yīng)的物理設(shè)備就緒岂津。為了解決這類依賴問(wèn)題,systemd 的配置單元之間可以彼此定義依賴關(guān)系橱乱。

Systemd 用配置單元定義文件中的關(guān)鍵字來(lái)描述配置單元之間的依賴關(guān)系泳叠。比如:unit A 依賴 unit B茶宵,可以在 unit B 的定義中用"require A"來(lái)表示。這樣 systemd 就會(huì)保證先啟動(dòng) A 再啟動(dòng) B种蝶。

Systemd 事務(wù)

Systemd 能保證事務(wù)完整性螃征。Systemd 的事務(wù)概念和數(shù)據(jù)庫(kù)中的有所不同糠赦,主要是為了保證多個(gè)依賴的配置單元之間沒有環(huán)形引用拙泽。比如 unit A钉寝、B攻旦、C蕴纳,假如它們的依賴關(guān)系為:

圖 4, Unit 的循環(huán)依賴
圖 4, Unit 的循環(huán)依賴

存在循環(huán)依賴塞椎,那么 systemd 將無(wú)法啟動(dòng)任意一個(gè)服務(wù)从铲。此時(shí) systemd 將會(huì)嘗試解決這個(gè)問(wèn)題窃蹋,因?yàn)榕渲脝卧g的依賴關(guān)系有兩種:required 是強(qiáng)依賴浅碾;want 則是弱依賴,systemd 將去掉 wants 關(guān)鍵字指定的依賴看看是否能打破循環(huán)。如果無(wú)法修復(fù),systemd 會(huì)報(bào)錯(cuò)简肴。

Systemd 能夠自動(dòng)檢測(cè)和修復(fù)這類配置錯(cuò)誤灵迫,極大地減輕了管理員的排錯(cuò)負(fù)擔(dān)舟肉。

Target 和運(yùn)行級(jí)別

systemd 用目標(biāo)(target)替代了運(yùn)行級(jí)別的概念整慎,提供了更大的靈活性蓖墅,如您可以繼承一個(gè)已有的目標(biāo)贪壳,并添加其它服務(wù),來(lái)創(chuàng)建自己的目標(biāo)彪笼。下表列舉了 systemd 下的目標(biāo)和常見 runlevel 的對(duì)應(yīng)關(guān)系:

Sysvinit 運(yùn)行級(jí)別和 systemd 目標(biāo)的對(duì)應(yīng)表

Systemd 的并發(fā)啟動(dòng)原理

如前所述,在 Systemd 中幅恋,所有的服務(wù)都并發(fā)啟動(dòng)捆交,比如 Avahi品追、D-Bus冯丙、livirtd银还、X11、HAL 可以同時(shí)啟動(dòng)戒财。乍一看捺弦,這似乎有點(diǎn)兒?jiǎn)栴}列吼,比如 Avahi 需要 syslog 的服務(wù),Avahi 和 syslog 同時(shí)啟動(dòng)慌申,假設(shè) Avahi 的啟動(dòng)比較快蹄溉,所以 syslog 還沒有準(zhǔn)備好您炉,可是 Avahi 又需要記錄日志赚爵,這豈不是會(huì)出現(xiàn)問(wèn)題法瑟?

Systemd 的開發(fā)人員仔細(xì)研究了服務(wù)之間相互依賴的本質(zhì)問(wèn)題霎挟,發(fā)現(xiàn)所謂依賴可以分為三個(gè)具體的類型氓扛,而每一個(gè)類型實(shí)際上都可以通過(guò)相應(yīng)的技術(shù)解除依賴關(guān)系论笔。

并發(fā)啟動(dòng)原理之一:解決 socket 依賴

絕大多數(shù)的服務(wù)依賴是套接字依賴狂魔。比如服務(wù) A 通過(guò)一個(gè)套接字端口 S1 提供自己的服務(wù)最楷,其他的服務(wù)如果需要服務(wù) A待错,則需要連接 S1火俄。因此如果服務(wù) A 尚未啟動(dòng),S1 就不存在适瓦,其他的服務(wù)就會(huì)得到啟動(dòng)錯(cuò)誤玻熙。所以傳統(tǒng)地疯攒,人們需要先啟動(dòng)服務(wù) A敬尺,等待它進(jìn)入就緒狀態(tài),再啟動(dòng)其他需要它的服務(wù)姑原。Systemd 認(rèn)為呜舒,只要我們預(yù)先把 S1 建立好,那么其他所有的服務(wù)就可以同時(shí)啟動(dòng)而無(wú)需等待服務(wù) A 來(lái)創(chuàng)建 S1 了般婆。如果服務(wù) A 尚未啟動(dòng)蔚袍,那么其他進(jìn)程向 S1 發(fā)送的服務(wù)請(qǐng)求實(shí)際上會(huì)被 Linux 操作系統(tǒng)緩存配名,其他進(jìn)程會(huì)在這個(gè)請(qǐng)求的地方等待。一旦服務(wù) A 啟動(dòng)就緒宇整,就可以立即處理緩存的請(qǐng)求鳞青,一切都開始正常運(yùn)行臂拓。

那么服務(wù)如何使用由 init 進(jìn)程創(chuàng)建的套接字呢习寸?

Linux 操作系統(tǒng)有一個(gè)特性,當(dāng)進(jìn)程調(diào)用 fork 或者 exec 創(chuàng)建子進(jìn)程之后童番,所有在父進(jìn)程中被打開的文件句柄 (file descriptor) 都被子進(jìn)程所繼承剃斧。套接字也是一種文件句柄忽你,進(jìn)程 A 可以創(chuàng)建一個(gè)套接字科雳,此后當(dāng)進(jìn)程 A 調(diào)用 exec 啟動(dòng)一個(gè)新的子進(jìn)程時(shí),只要確保該套接字的 close_on_exec 標(biāo)志位被清空简逮,那么新的子進(jìn)程就可以繼承這個(gè)套接字散庶。子進(jìn)程看到的套接字和父進(jìn)程創(chuàng)建的套接字是同一個(gè)系統(tǒng)套接字,就仿佛這個(gè)套接字是子進(jìn)程自己創(chuàng)建的一樣屋讶,沒有任何區(qū)別须教。

這個(gè)特性以前被一個(gè)叫做 inetd 的系統(tǒng)服務(wù)所利用。Inetd 進(jìn)程會(huì)負(fù)責(zé)監(jiān)控一些常用套接字端口乐疆,比如 Telnet诀拭,當(dāng)該端口有連接請(qǐng)求時(shí)煤蚌,inetd 才啟動(dòng) telnetd 進(jìn)程尉桩,并把有連接的套接字傳遞給新的 telnetd 進(jìn)程進(jìn)行處理贪庙。這樣,當(dāng)系統(tǒng)沒有 telnet 客戶端連接時(shí)这橙,就不需要啟動(dòng) telnetd 進(jìn)程屈扎。Inetd 可以代理很多的網(wǎng)絡(luò)服務(wù)鹰晨,這樣就可以節(jié)約很多的系統(tǒng)負(fù)載和內(nèi)存資源止毕,只有當(dāng)有真正的連接請(qǐng)求時(shí)才啟動(dòng)相應(yīng)服務(wù)扁凛,并把套接字傳遞給相應(yīng)的服務(wù)進(jìn)程谨朝。

和 inetd 類似丸边,systemd 是所有其他進(jìn)程的父進(jìn)程妹窖,它可以先建立所有需要的套接字骄呼,然后在調(diào)用 exec 的時(shí)候?qū)⒃撎捉幼謧鬟f給新的服務(wù)進(jìn)程蜓萄,而新進(jìn)程直接使用該套接字進(jìn)行服務(wù)即可澄峰。

并發(fā)啟動(dòng)原理之二:解決 D-Bus 依賴

D-Bus 是 desktop-bus 的簡(jiǎn)稱俏竞,是一個(gè)低延遲、低開銷玻佩、高可用性的進(jìn)程間通信機(jī)制咬崔。它越來(lái)越多地用于應(yīng)用程序之間通信垮斯,也用于應(yīng)用程序和操作系統(tǒng)內(nèi)核之間的通信只祠。很多現(xiàn)代的服務(wù)進(jìn)程都使用D-Bus 取代套接字作為進(jìn)程間通信機(jī)制铆农,對(duì)外提供服務(wù)。比如簡(jiǎn)化 Linux 網(wǎng)絡(luò)配置的 NetworkManager 服務(wù)就使用 D-Bus 和其他的應(yīng)用程序或者服務(wù)進(jìn)行交互:郵件客戶端軟件 evolution 可以通過(guò) D-Bus 從 NetworkManager 服務(wù)獲取網(wǎng)絡(luò)狀態(tài)的改變猴凹,以便做出相應(yīng)的處理郊霎。

D-Bus 支持所謂"bus activation"功能书劝。如果服務(wù) A 需要使用服務(wù) B 的 D-Bus 服務(wù),而服務(wù) B 并沒有運(yùn)行猾昆,則 D-Bus 可以在服務(wù) A 請(qǐng)求服務(wù) B 的 D-Bus 時(shí)自動(dòng)啟動(dòng)服務(wù) B骡苞。而服務(wù) A 發(fā)出的請(qǐng)求會(huì)被 D-Bus 緩存解幽,服務(wù) A 會(huì)等待服務(wù) B 啟動(dòng)就緒。利用這個(gè)特性片部,依賴 D-Bus 的服務(wù)就可以實(shí)現(xiàn)并行啟動(dòng)档悠。

并發(fā)啟動(dòng)原理之三:解決文件系統(tǒng)依賴

系統(tǒng)啟動(dòng)過(guò)程中站粟,文件系統(tǒng)相關(guān)的活動(dòng)是最耗時(shí)的曾雕,比如掛載文件系統(tǒng)剖张,對(duì)文件系統(tǒng)進(jìn)行磁盤檢查(fsck)搔弄,磁盤配額檢查等都是非常耗時(shí)的操作丰滑。在等待這些工作完成的同時(shí)褒墨,系統(tǒng)處于空閑狀態(tài)郁妈。那些想使用文件系統(tǒng)的服務(wù)似乎必須等待文件系統(tǒng)初始化完成才可以啟動(dòng)噩咪。但是 systemd 發(fā)現(xiàn)這種依賴也是可以避免的。

Systemd 參考了 autofs 的設(shè)計(jì)思路涨享,使得依賴文件系統(tǒng)的服務(wù)和文件系統(tǒng)本身初始化兩者可以并發(fā)工作厕隧。autofs 可以監(jiān)測(cè)到某個(gè)文件系統(tǒng)掛載點(diǎn)真正被訪問(wèn)到的時(shí)候才觸發(fā)掛載操作栏账,這是通過(guò)內(nèi)核 automounter 模塊的支持而實(shí)現(xiàn)的挡爵。比如一個(gè) open()系統(tǒng)調(diào)用作用在"/misc/cd/file1"的時(shí)候,/misc/cd 尚未執(zhí)行掛載操作涣雕,此時(shí) open()調(diào)用被掛起等待挣郭,Linux 內(nèi)核通知 autofs疗韵,autofs 執(zhí)行掛載蕉汪。這時(shí)候者疤,控制權(quán)返回給 open()系統(tǒng)調(diào)用驹马,并正常打開文件。

Systemd 集成了 autofs 的實(shí)現(xiàn)算利,對(duì)于系統(tǒng)中的掛載點(diǎn)笔时,比如/home允耿,當(dāng)系統(tǒng)啟動(dòng)的時(shí)候,systemd 為其創(chuàng)建一個(gè)臨時(shí)的自動(dòng)掛載點(diǎn)业稼。在這個(gè)時(shí)刻/home 真正的掛載設(shè)備尚未啟動(dòng)好,真正的掛載操作還沒有執(zhí)行蚂蕴,文件系統(tǒng)檢測(cè)也還沒有完成低散。可是那些依賴該目錄的進(jìn)程已經(jīng)可以并發(fā)啟動(dòng)骡楼,他們的 open()操作被內(nèi)建在 systemd 中的 autofs 捕獲熔号,將該 open()調(diào)用掛起(可中斷睡眠狀態(tài))。然后等待真正的掛載操作完成鸟整,文件系統(tǒng)檢測(cè)也完成后,systemd 將該自動(dòng)掛載點(diǎn)替換為真正的掛載點(diǎn)弟头,并讓 open()調(diào)用返回。由此伦连,實(shí)現(xiàn)了那些依賴于文件系統(tǒng)的服務(wù)和文件系統(tǒng)本身同時(shí)并發(fā)啟動(dòng)除师。

當(dāng)然對(duì)于"/"根目錄的依賴實(shí)際上一定還是要串行執(zhí)行锹安,因?yàn)?systemd
自己也存放在/之下忍宋,必須等待系統(tǒng)根目錄掛載檢查好。

不過(guò)對(duì)于類似/home 等掛載點(diǎn)入宦,這種并發(fā)可以提高系統(tǒng)的啟動(dòng)速度落追,尤其是當(dāng)/home 是遠(yuǎn)程的 NFS 節(jié)點(diǎn)轿钠,或者是加密盤等,需要耗費(fèi)較長(zhǎng)的時(shí)間才可以準(zhǔn)備就緒的情況下继谚,因?yàn)椴l(fā)啟動(dòng),這段時(shí)間內(nèi)诡壁,系統(tǒng)并不是完全無(wú)事可做,而是可以利用這段空余時(shí)間做更多的啟動(dòng)進(jìn)程的事情夺克,總的來(lái)說(shuō)就縮短了系統(tǒng)啟動(dòng)時(shí)間。

Systemd 的使用

下面針對(duì)技術(shù)人員的不同角色來(lái)簡(jiǎn)單地介紹一下 systemd 的使用狡门。本文只打算給出簡(jiǎn)單的描述,讓您對(duì) systemd 的使用有一個(gè)大概的理解叛复。具體的細(xì)節(jié)內(nèi)容太多咖耘,即無(wú)法在一篇短文內(nèi)寫全鲤看,本人也沒有那么強(qiáng)大的能力。還需要讀者自己去進(jìn)一步查閱 systemd 的文檔慷吊。

系統(tǒng)軟件開發(fā)人員

開發(fā)人員需要了解 systemd 的更多細(xì)節(jié)。比如您打算開發(fā)一個(gè)新的系統(tǒng)服務(wù),就必須了解如何讓這個(gè)服務(wù)能夠被 systemd 管理触创。這需要您注意以下這些要點(diǎn):

  • 后臺(tái)服務(wù)進(jìn)程代碼不需要執(zhí)行兩次派生來(lái)實(shí)現(xiàn)后臺(tái)精靈進(jìn)程,只需要實(shí)現(xiàn)服務(wù)本身的主循環(huán)即可抖韩。
  • 不要調(diào)用 setsid(),交給 systemd 處理
  • 不再需要維護(hù) pid 文件励稳。
  • Systemd 提供了日志功能趣避,服務(wù)進(jìn)程只需要輸出到 stderr 即可地啰,無(wú)需使用 syslog。
  • 處理信號(hào) SIGTERM蔚鸥,這個(gè)信號(hào)的唯一正確作用就是停止當(dāng)前服務(wù),不要做其他的事情弹谁。
  • SIGHUP 信號(hào)的作用是重啟服務(wù)。
  • 需要套接字的服務(wù)植康,不要自己創(chuàng)建套接字,讓 systemd 傳入套接字榄攀。
  • 使用 sd_notify()函數(shù)通知 systemd 服務(wù)自己的狀態(tài)改變。一般地贞瞒,當(dāng)服務(wù)初始化結(jié)束,進(jìn)入服務(wù)就緒狀態(tài)時(shí)乒融,可以調(diào)用它愧捕。

Unit 文件的編寫

對(duì)于開發(fā)者來(lái)說(shuō),工作量最大的部分應(yīng)該是編寫配置單元文件,定義所需要的單元钢猛。

舉例來(lái)說(shuō),開發(fā)人員開發(fā)了一個(gè)新的服務(wù)程序壶愤,比如 httpd湃累,就需要為其編寫一個(gè)配置單元文件以便該服務(wù)可以被 systemd 管理蒙秒,類似 UpStart 的工作配置文件马澈。在該文件中定義服務(wù)啟動(dòng)的命令行語(yǔ)法,以及和其他服務(wù)的依賴關(guān)系等涤伐。

此外我們之前已經(jīng)了解到国章,systemd 的功能繁多液兽,不僅用來(lái)管理服務(wù)粗恢,還可以管理掛載點(diǎn)匙赞,定義定時(shí)任務(wù)等。這些工作都是由編輯相應(yīng)的配置單元文件完成的坐榆。我在這里給出幾個(gè)配置單元文件的例子豪诲。

下面是 SSH 服務(wù)的配置單元文件,服務(wù)配置單元文件以.service 為文件名后綴芳室。

文件分為三個(gè)小節(jié)荔仁。第一個(gè)是[Unit]部分关贵,這里僅僅有一個(gè)描述信息炭剪。第二部分是 Service 定義错妖,其中濒旦,ExecStartPre 定義啟動(dòng)服務(wù)之前應(yīng)該運(yùn)行的命令;ExecStart 定義啟動(dòng)服務(wù)的具體命令行語(yǔ)法。第三部分是[Install],WangtedBy 表明這個(gè)服務(wù)是在多用戶模式下所需要的。

那我們就來(lái)看下 multi-user.target 吧:

第一部分中的 Requires 定義表明 multi-user.target 啟動(dòng)的時(shí)候 basic.target 也必須被啟動(dòng)亿遂;另外 basic.target 停止的時(shí)候,multi-user.target 也必須停止英妓。如果您接著查看 basic.target 文件,會(huì)發(fā)現(xiàn)它又指定了 sysinit.target 等其他的單元必須隨之啟動(dòng)。同樣 sysinit.target 也會(huì)包含其他的單元。采用這樣的層層鏈接的結(jié)構(gòu),最終所有需要支持多用戶模式的組件服務(wù)都會(huì)被初始化啟動(dòng)好。

在[Install]小節(jié)中有 Alias 定義,即定義本單元的別名,這樣在運(yùn)行 systemctl 的時(shí)候就可以使用這個(gè)別名來(lái)引用本單元。這里的別名是 default.target,比 multi-user.target 要簡(jiǎn)單一些荣堰。。。

此外在/etc/systemd/system 目錄下還可以看到諸如*.wants 的目錄屎鳍,放在該目錄下的配置單元文件等同于在[Unit]小節(jié)中的 wants 關(guān)鍵字窥淆,即本單元啟動(dòng)時(shí)黍判,還需要啟動(dòng)這些單元。比如您可以簡(jiǎn)單地把您自己寫的 foo.service 文件放入 multi-user.target.wants 目錄下漂问,這樣每次都會(huì)被默認(rèn)啟動(dòng)了磷仰。

最后,讓我們來(lái)看看 sys-kernel-debug.mout 文件,這個(gè)文件定義了一個(gè)文件掛載點(diǎn):

這個(gè)配置單元文件定義了一個(gè)掛載點(diǎn)航罗。掛載配置單元文件有一個(gè)[Mount]配置小節(jié),里面配置了 What,Where 和 Type 三個(gè)數(shù)據(jù)項(xiàng)饶氏。這都是掛載命令所必須的,例子中的配置等同于下面這個(gè)掛載命令:

mount –t debugfs /sys/kernel/debug debugfs

配置單元文件的編寫需要很多的學(xué)習(xí)荤懂,必須參考 systemd 附帶的 man 等文檔進(jìn)行深入學(xué)習(xí)。希望通過(guò)上面幾個(gè)小例子女轿,大家已經(jīng)了解配置單元文件的作用和一般寫法了戈泼。

系統(tǒng)管理員

systemd 的主要命令行工具是 systemctl。

多數(shù)管理員應(yīng)該都已經(jīng)非常熟悉系統(tǒng)服務(wù)和 init 系統(tǒng)的管理模聋,比如 service割卖、chkconfig 以及 telinit 命令的使用。systemd 也完成同樣的管理任務(wù),只是命令工具 systemctl 的語(yǔ)法有所不同而已,因此用表格來(lái)對(duì)比 systemctl 和傳統(tǒng)的系統(tǒng)管理命令會(huì)非常清晰。

Systemd 命令和 sysvinit 命令的對(duì)照表

除了表 2 列出的常見用法,系統(tǒng)管理員還需要了解其他一些系統(tǒng)配置和管理任務(wù)的改變铃剔。

首先我們了解 systemd 如何處理電源管理穗泵,命令如下表所示:

systemd 電源管理命令

關(guān)機(jī)不是每個(gè)登錄用戶在任何情況下都可以執(zhí)行的榆浓,一般只有管理員才可以關(guān)機(jī)擦俐。正常情況下系統(tǒng)不應(yīng)該允許 SSH 遠(yuǎn)程登錄的用戶執(zhí)行關(guān)機(jī)命令。否則其他用戶正在工作,一個(gè)用戶把系統(tǒng)關(guān)了就不好了答朋。為了解決這個(gè)問(wèn)題,傳統(tǒng)的 Linux 系統(tǒng)使用 ConsoleKit 跟蹤用戶登錄情況斩例,并決定是否賦予其關(guān)機(jī)的權(quán)限〔任現(xiàn)在 ConsoleKit 已經(jīng)被 systemd
的 logind 所替代。

logind 不是 pid-1 的 init 進(jìn)程。它的作用和 UpStart 的 session init 類似霞扬,但功能要豐富很多糕韧,它能夠管理幾乎所有用戶會(huì)話(session)相關(guān)的事情。logind 不僅是 ConsoleKit 的替代喻圃,它可以:

  • 維護(hù)萤彩,跟蹤會(huì)話和用戶登錄情況。如上所述斧拍,為了決定關(guān)機(jī)命令是否可行雀扶,系統(tǒng)需要了解當(dāng)前用戶登錄情況,如果用戶從 SSH 登錄肆汹,不允許其執(zhí)行關(guān)機(jī)命令愚墓;如果普通用戶從本地登錄,且該用戶是系統(tǒng)中的唯一會(huì)話昂勉,則允許其執(zhí)行關(guān)機(jī)命令转绷;這些判斷都需要 logind 維護(hù)所有的用戶會(huì)話和登錄情況。
  • Logind 也負(fù)責(zé)統(tǒng)計(jì)用戶會(huì)話是否長(zhǎng)時(shí)間沒有操作硼啤,可以執(zhí)行休眠/關(guān)機(jī)等相應(yīng)操作。
  • 為用戶會(huì)話的所有進(jìn)程創(chuàng)建 CGroup斧账。這不僅方便統(tǒng)計(jì)所有用戶會(huì)話的相關(guān)進(jìn)程谴返,也可以實(shí)現(xiàn)會(huì)話級(jí)別的系統(tǒng)資源控制。
  • 負(fù)責(zé)電源管理的組合鍵處理咧织,比如用戶按下電源鍵嗓袱,將系統(tǒng)切換至睡眠狀態(tài)。
  • 多席位(multi-seat) 管理习绢。如今的電腦渠抹,即便一臺(tái)筆記本電腦蝙昙,也完全可以提供多人同時(shí)使用的計(jì)算能力。多席位就是一臺(tái)電腦主機(jī)管理多個(gè)外設(shè)梧却,比如兩個(gè)屏幕和兩個(gè)鼠標(biāo)/鍵盤奇颠。席位一使用屏幕 1 和鍵盤 1;席位二使用屏幕 2 和鍵盤 2放航,但他們都共享一臺(tái)主機(jī)烈拒。用戶會(huì)話可以自由在多個(gè)席位之間切換」泖ⅲ或者當(dāng)插入新的鍵盤荆几,屏幕等物理外設(shè)時(shí),自動(dòng)啟動(dòng) gdm 用戶登錄界面等赊时。所有這些都是多席位管理的內(nèi)容吨铸。ConsoleKit 始終沒有實(shí)現(xiàn)這個(gè)功能,systemd 的 logind 能夠支持多席位祖秒。

以上描述的這些管理功能僅僅是 systemd 的部分功能诞吱,除此之外,systemd 還負(fù)責(zé)系統(tǒng)其他的管理配置狈涮,比如配置網(wǎng)絡(luò)狐胎,Locale 管理,管理系統(tǒng)內(nèi)核模塊加載等歌馍,完整地描述它們已經(jīng)超出了本人的能力握巢。

systemd 小結(jié)

在不才作者看來(lái),作為系統(tǒng)初始化系統(tǒng)松却,systemd 的最大特點(diǎn)有兩個(gè):

  • 令人驚奇的激進(jìn)的并發(fā)啟動(dòng)能力暴浦,極大地提高了系統(tǒng)啟動(dòng)速度;
  • 用 CGroup 統(tǒng)計(jì)跟蹤子進(jìn)程晓锻,干凈可靠歌焦。

此外,和其前任不同的地方在于砚哆,systemd 已經(jīng)不僅僅是一個(gè)初始化系統(tǒng)了独撇。

Systemd 出色地替代了 sysvinit 的所有功能,但它并未就此自滿躁锁。因?yàn)?init 進(jìn)程是系統(tǒng)所有進(jìn)程的父進(jìn)程這樣的特殊性纷铣,systemd 非常適合提供曾經(jīng)由其他服務(wù)提供的功能,比如定時(shí)任務(wù) (以前由 crond 完成) 战转;會(huì)話管理 (以前由 ConsoleKit/PolKit 等管理) 搜立。僅僅從本文皮毛一樣的介紹來(lái)看,Systemd 已經(jīng)管得很多了槐秧,可它還在不斷發(fā)展啄踊。它將逐漸成為一個(gè)多功能的系統(tǒng)環(huán)境忧设,能夠處理非常多的系統(tǒng)管理任務(wù),有人甚至將它看作一個(gè)操作系統(tǒng)颠通。

好的一點(diǎn)是址晕,這非常有助于標(biāo)準(zhǔn)化 Linux 的管理!從前蒜哀,不同的 Linux 發(fā)行版各行其事斩箫,使用不同方法管理系統(tǒng),從來(lái)也不會(huì)互相妥協(xié)撵儿。比如如何將系統(tǒng)進(jìn)入休眠狀態(tài)乘客,不同的系統(tǒng)有不同的解決方案,即便是同一個(gè) Linux 系統(tǒng)淀歇,也存在不同的方法易核,比如一個(gè)有趣的討論:如何讓 ubuntu 系統(tǒng)休眠,可以使用底層的/sys/power/state 接口浪默,也可以使用諸如 pm-utility 等高層接口牡直。存在這么多種不同的方法做一件事情對(duì)像我這樣的普通用戶而言可不是件有趣的事情。systemd 提供統(tǒng)一的電源管理命令接口纳决,這件事情的意義就類似全世界的人都說(shuō)統(tǒng)一的語(yǔ)言碰逸,我們?cè)僖膊恍枰獙W(xué)習(xí)外語(yǔ)了,多么美好阔加!

如果所有的 Linux 發(fā)行版都采納了 systemd饵史,那么系統(tǒng)管理任務(wù)便可以很大程度上實(shí)現(xiàn)標(biāo)準(zhǔn)化。此外 systemd 有個(gè)很棒的承諾:接口保持穩(wěn)定胜榔,不會(huì)再輕易改動(dòng)胳喷。對(duì)于軟件開發(fā)人員來(lái)說(shuō),這是多么體貼又讓人感動(dòng)的承諾柏仓吭露!

結(jié)束語(yǔ)

本系列文章從古老卻簡(jiǎn)明穩(wěn)定的 sysvinit 說(shuō)起,接著簡(jiǎn)要描述了 UpStart 帶來(lái)的清新改變尊惰,最后看到了充滿野心和活力的新生代 systemd 系統(tǒng)逐漸統(tǒng)治 Linux 的各個(gè)版本讲竿。就好像在看我們這個(gè)世界,一代人老去弄屡,新的一代帶著橫掃一切的氣概登上舞臺(tái)戴卜,還沒有喊出他們最有力的口號(hào),更猛的一代已經(jīng)把聚光燈和所有的目光帶走琢岩。Systemd 之后也許還有更新的 init 系統(tǒng)出現(xiàn)吧,讓我們繼續(xù)期待师脂。担孔。江锨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市糕篇,隨后出現(xiàn)的幾起案子啄育,更是在濱河造成了極大的恐慌,老刑警劉巖拌消,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑豌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡墩崩,警方通過(guò)查閱死者的電腦和手機(jī)氓英,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鹦筹,“玉大人铝阐,你說(shuō)我怎么就攤上這事☆砉眨” “怎么了徘键?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)遍蟋。 經(jīng)常有香客問(wèn)我吹害,道長(zhǎng),這世上最難降的妖魔是什么虚青? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任它呀,我火速辦了婚禮,結(jié)果婚禮上挟憔,老公的妹妹穿的比我還像新娘钟些。我一直安慰自己,他們只是感情好绊谭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布政恍。 她就那樣靜靜地躺著,像睡著了一般达传。 火紅的嫁衣襯著肌膚如雪篙耗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天宪赶,我揣著相機(jī)與錄音宗弯,去河邊找鬼。 笑死搂妻,一個(gè)胖子當(dāng)著我的面吹牛蒙保,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欲主,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼邓厕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逝嚎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起详恼,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤补君,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昧互,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挽铁,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年敞掘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叽掘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渐逃,死狀恐怖够掠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茄菊,我是刑警寧澤疯潭,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站面殖,受9級(jí)特大地震影響竖哩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脊僚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一相叁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辽幌,春花似錦增淹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至加酵,卻和暖如春拳喻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猪腕。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工冗澈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陋葡。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓亚亲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捌归,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容