Linux之systemd的工作原理及使用

System的簡(jiǎn)介

Systemd 是 Linux 系統(tǒng)中最新的初始化系統(tǒng)(init)寝贡,它主要的設(shè)計(jì)目標(biāo)是克服 sysvinit 固有的缺點(diǎn)重斑,提高系統(tǒng)的啟動(dòng)速度Systemd 的很多概念來(lái)源于蘋(píng)果 Mac OS 操作系統(tǒng)上的 launchd兵睛。

System的特點(diǎn):

  • 兼容SysVinit和LSB init scripts
  • 更快的啟動(dòng)速度,以并發(fā)啟動(dòng)原理
    • 盡可能啟動(dòng)更少的進(jìn)程
    • 盡可能將更多進(jìn)程并行啟動(dòng)
  • 提供按需啟動(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)行期間都沒(méi)有被使用過(guò)笨鸡。比如 CUPS姜钳,打印服務(wù)在多數(shù)服務(wù)器上很少被真正使用到。您可能沒(méi)有想到形耗,在很多服務(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)它累澡。

  • 采用linux的cgroup特性跟蹤和管理進(jìn)程的生命周期

init 系統(tǒng)的一個(gè)重要職責(zé)就是負(fù)責(zé)跟蹤和管理服務(wù)進(jìn)程的生命周期。它不僅可以啟動(dòng)一個(gè)服務(wù)般贼,也必須也能夠停止服務(wù)愧哟。這看上去沒(méi)有什么特別的,然而在真正用代碼實(shí)現(xiàn)的時(shí)候哼蛆,您或許會(huì)發(fā)現(xiàn)停止服務(wù)比一開(kāi)始想的要困難蕊梧。
服務(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).如果 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)光盤(pá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 中并不完善棒口,似乎開(kāi)發(fā)人員也沒(méi)有特別關(guān)注它寄月,因此有報(bào)告指出它還存在一些使用上的問(wèn)題,使用時(shí)尚需慎重无牵。

  • 日志服務(wù)
    • 簡(jiǎn)單性:代碼少漾肮,依賴少,抽象開(kāi)銷最小
    • 零維護(hù):日志是除錯(cuò)和監(jiān)控系統(tǒng)的核心功能茎毁,因此它自己不能再產(chǎn)生問(wèn)題克懊。舉例說(shuō),自動(dòng)管理磁盤(pán)空間七蜘,避免由于日志的不斷產(chǎn)生而將磁盤(pá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)保存到硬盤(pán)上時(shí)這三者之間的關(guān)系不會(huì)丟失旅挤。Syslog 將不同的信息保存到不同的文件中,分析的時(shí)候很難確定哪些條目是相關(guān)的
    • 擴(kuò)展性:日志的適用范圍很廣伞鲫,從嵌入式設(shè)備到超級(jí)計(jì)算機(jī)集群都可以滿足需求
    • 安全性:日志 文件是可以驗(yàn)證的粘茄,讓無(wú)法檢測(cè)的修改不再可能
  • 能向后SysV的服務(wù)腳本

Systemd的基本概念

System單元的概念

系統(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納為以下一些不同的類型

單元的常見(jiàn)類型
  • service unit : 文件擴(kuò)展名為.service,用于定義系統(tǒng)類服務(wù)
  • target unit : 文件擴(kuò)展為.target,用于實(shí)現(xiàn)模擬"運(yùn)行級(jí)別"
  • device unit : 文件擴(kuò)展為.device,用于定義內(nèi)核識(shí)別的設(shè)備俱诸。
  • mount unit : 文件擴(kuò)展為.mount,定義文件系統(tǒng)掛載點(diǎn)菠劝,利用logind服務(wù),為用戶的會(huì)話進(jìn)程分配CGroup資源
  • socket unit : 文件擴(kuò)展為.socket,用于標(biāo)識(shí)進(jìn)程間通信的socket文件
  • snapshot unit : 文件擴(kuò)展為.snapshot,管理系統(tǒng)快照
  • swap unit : 文件擴(kuò)展為.swap,用于標(biāo)識(shí)swap設(shè)備
  • automount unit : 文件擴(kuò)展為.automount,文件系統(tǒng)自動(dòng)掛載設(shè)備
  • path unit : 文件擴(kuò)展為.path睁搭,用于定義文件系統(tǒng)中的一個(gè)文件或目錄
  • timer unit : 文件擴(kuò)展為.timer,定時(shí)器配置單元赶诊,用來(lái)定時(shí)觸發(fā)用戶定義的操作笼平,這類配置單元取代了atd、crond等傳統(tǒng)的定時(shí)服務(wù)
Target和運(yùn)行級(jí)別的對(duì)應(yīng)關(guān)系
  • sysvinit和systemd目標(biāo)的對(duì)應(yīng)表
sysvinit systemd target 備注
0 poweroff.target 關(guān)閉系統(tǒng)
1,s,single rescue.target 單用戶模式
2,4 multi-user.target 用戶定義/域特定運(yùn)行級(jí)別甫何。默認(rèn)等同于 3
3 multi-user.target 多用戶出吹,非圖形化界面
5 graphical.target 多用戶,圖形化界面
6 reboot.target 重啟
emergency emergency.target 緊急shell

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

  • 并發(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)求涩赢,一切都開(kāi)始正常運(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)程中被打開(kāi)的文件句柄 (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)建的一樣懂缕,沒(méi)有任何區(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)沒(méi)有 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ù)即可惶岭。

  • 解決D-bus依賴

D-Bus 是 desktop-bus 的簡(jiǎn)稱,是一個(gè)低延遲犯眠、低開(kāi)銷按灶、高可用性的進(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 并沒(méi)有運(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)瓦灶。

  • 解決文件系統(tǒng)依賴

系統(tǒng)啟動(dòng)過(guò)程中,文件系統(tǒng)相關(guān)的活動(dòng)是最耗時(shí)的抱完,比如掛載文件系統(tǒng)贼陶,對(duì)文件系統(tǒng)進(jìn)行磁盤(pán)檢查(fsck),磁盤(pán)配額檢查等都是非常耗時(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)用永罚,并正常打開(kāi)文件啤呼。
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)好惕蹄,真正的掛載操作還沒(méi)有執(zhí)行,文件系統(tǒng)檢測(cè)也還沒(méi)有完成治专÷袅辏可是那些依賴該目錄的進(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)卿吐,或者是加密盤(pá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í)間磺樱。

  • 服務(wù)的循環(huán)依賴

Systemd 能保證事務(wù)完整性。Systemd 的事務(wù)概念和數(shù)據(jù)庫(kù)中的有所不同婆咸,主要是為了保證多個(gè)依賴的配置單元之間沒(méi)有環(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)

  • 基于path激活機(jī)制

判斷一個(gè)文件在不在, 如果在可以立即激活一個(gè)進(jìn)程或服務(wù)

SysVinit與systemd管理命令對(duì)比

項(xiàng)目|sysvinit | systemd | 備注|
---------|----------------|----------|
啟動(dòng)|service NAME start | systemctl start NAME.service|
停止|service NAME stop | systemctl stop NAME.service|
重啟|service NAME restart| systemctl restart NAME.service|
狀態(tài)查看|service NAME status|systemctl status NAME.service|
條件式重啟|service NAME condrestart |systemctl condrestart NAME.service|如果服務(wù)運(yùn)行就重啟
重載或重啟服務(wù)|---|systemctl reload-or-restart NAME.service|如果支持reload就reload宏邮,不然就重啟|
重載或條件式重啟服務(wù)|----|systemctl reload-or-restart NAME.service|
查看某服務(wù)當(dāng)前激活與否的狀態(tài)|---|systemctl is-active NAME.service|
查看所有已激活的服務(wù)|chkconfig --list | systemctl list-units -t service|
查看所有服務(wù)(已激活及未激活)|--|systemctl list-units -t service -a|
設(shè)置服務(wù)開(kāi)機(jī)自啟| chkconfig NAME on | systemctl enable NAME.service|
禁止服務(wù)開(kāi)機(jī)自啟| chkconfig NAME off | systemctl disable NAME.service|
查看某服務(wù)是否能開(kāi)機(jī)啟動(dòng)| chkconfig --list NAME | systemctl is-enabled NAME.service|
禁止某服務(wù)設(shè)定為開(kāi)機(jī)自啟|---|systemctl mask NAME.service|
取消禁止某服務(wù)開(kāi)機(jī)自啟|---| systemctl unmask NAME.service|
查看服務(wù)的依賴關(guān)系|---| systemctl list-dependencies NAME.service| |
修改默認(rèn)運(yùn)行級(jí)別|修改/etc/inittab文件| systemctl set-default NAME.target|將/usr/lib/systemd/system/的文件連接至/etc/systemd/system/目錄中|
切換系統(tǒng)運(yùn)行級(jí)別| init RUNLEVEL | systemctl isolate NAME.target|
查看目前的運(yùn)行級(jí)別|runlevel,who -r| systemctl get-default |

systemd電源管理命令

命令 操作
systemctl reboot 重啟機(jī)器
systemctl poweroff 關(guān)機(jī)
systemctl suspend 掛起
systemctl hibernate 休眠
systemctl hybrid 混合休眠模式(快照并掛起)

service unit file的配置說(shuō)明:

文件通常由三部分組成:
  • [Unit] : 定義與unit類型無(wú)關(guān)的通用選項(xiàng)泽示,用于提供當(dāng)前unit的描述信息,unit行為及依賴關(guān)系等
  • [Install] :定義由systemctl enable或systemctl disable命令在實(shí)現(xiàn)服務(wù)啟用或禁用時(shí)用到的選項(xiàng)
    unit段的常用選項(xiàng):
    Description: 描述信息蜜氨;意義性描述
    After : 定義unit的啟動(dòng)次序械筛,表示當(dāng)前unit應(yīng)該晚于那些unit啟動(dòng),其功能與before相反
    Requies : 依賴到的其它units,強(qiáng)依賴记劝,被依賴的units無(wú)法激活時(shí)变姨,當(dāng)前unit即無(wú)法激活
    wants: 指明依賴到的其它units,弱依賴,依賴的不激活厌丑,也能激活自己定欧,
    Conflicts: 定義units間的沖突關(guān)系
    service段的常用選項(xiàng):
    type:用于定義影響execstart及相關(guān)參數(shù)的功能的unit進(jìn)程啟動(dòng)類型
    simple: 由execstart啟動(dòng)的命令為主進(jìn)程
    forking: 由execstart啟動(dòng)的命令,其中一個(gè)子進(jìn)程會(huì)成為主進(jìn)程怒竿,父進(jìn)程會(huì)退出
    onehot: 功能類simple
    dubs
    notify: 類似于simple
    idle : 
    environmentfile:啟動(dòng)時(shí)環(huán)境配置文件,為execstart提供變量
    execstart :指明啟動(dòng)unit要運(yùn)行的命令或腳本,execstartpre ,execstartpost
    execreload
    execstop: 指明停止unit要運(yùn)行的命令或腳本
    restart : 
    Install 段的常用選項(xiàng)
    alias
    requireby: 被哪些units所依賴
    wantsby : 被那些units所依賴
注意:對(duì)于新創(chuàng)建的unit文件或修改了unit文件砍鸠,要通知systemd重載配置文件
  • systemctl daemon-reload

systemd的相關(guān)配置文件路徑

  • /usr/lib/systemd/system
  • /run/systemd/system
  • /etc/systemd/system
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耕驰,隨后出現(xiàn)的幾起案子爷辱,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饭弓,死亡現(xiàn)場(chǎng)離奇詭異双饥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弟断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)咏花,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阀趴,你說(shuō)我怎么就攤上這事昏翰。” “怎么了刘急?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵棚菊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我叔汁,道長(zhǎng)统求,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任据块,我火速辦了婚禮球订,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑰钮。我一直安慰自己,他們只是感情好微驶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布浪谴。 她就那樣靜靜地躺著,像睡著了一般因苹。 火紅的嫁衣襯著肌膚如雪苟耻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天扶檐,我揣著相機(jī)與錄音凶杖,去河邊找鬼。 笑死款筑,一個(gè)胖子當(dāng)著我的面吹牛智蝠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奈梳,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杈湾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了攘须?” 一聲冷哼從身側(cè)響起漆撞,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后浮驳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悍汛,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年至会,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了离咐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奋献,死狀恐怖健霹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓶蚂,我是刑警寧澤糖埋,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站窃这,受9級(jí)特大地震影響瞳别,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杭攻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一祟敛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兆解,春花似錦馆铁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至现拒,卻和暖如春辣垒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背印蔬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工勋桶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侥猬。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓例驹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陵究。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眠饮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 最近在研究Docker的源碼.讀到ApiServer的啟動(dòng)過(guò)程時(shí),發(fā)現(xiàn)其有一個(gè)新的概念,叫做service act...
    AlstonWilliams閱讀 1,124評(píng)論 1 4
  • tl;dr應(yīng)用場(chǎng)景:對(duì)日常系統(tǒng)啟動(dòng)過(guò)程進(jìn)行管理,優(yōu)化啟動(dòng)速度铜邮。 1. systemd原理 1.1 基礎(chǔ)概念-Uni...
    mst7閱讀 5,053評(píng)論 0 8
  • linux資料總章2.1 1.0寫(xiě)的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,135評(píng)論 2 34
  • muahao閱讀 2,066評(píng)論 0 3
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理仪召,服務(wù)發(fā)現(xiàn)寨蹋,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139