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