本文主要是學(xué)習(xí)筆記的第一篇饲齐,介紹的是systemd的起源和基本的概念灭将。
供自己日后復(fù)習(xí)而整理的嫂沉,因此將參考文獻(xiàn)放在最前面了蹬屹。
參考文獻(xiàn)
- 關(guān)于 systemd 的初步理解:這篇適合入門(mén)理解
- linux systemd 主要語(yǔ)法:結(jié)合系統(tǒng)上的service,可以理解每行內(nèi)容的意義驾锰。
- 最簡(jiǎn)明扼要的 Systemd 教程卸留,只需十分鐘:這份適合作為常用命令指導(dǎo)
- 初識(shí)systemd-使用篇:這篇很適合當(dāng)成常用命令集合
systemd簡(jiǎn)單介紹
systemd是主流的linux初始化工具,可以參考1文獻(xiàn)了解其前世今生椭豫。
一耻瑟、init的發(fā)展歷程
linux系統(tǒng)的啟動(dòng)首先從BIOS開(kāi)始,接下來(lái)進(jìn)入 boot loader捻悯,由 bootloader 載入內(nèi)核匆赃,進(jìn)行內(nèi)核初始化。內(nèi)核初始化的最后一步就是啟動(dòng) PID 為 1 的 init 進(jìn)程今缚。這個(gè)進(jìn)程是系統(tǒng)的第一個(gè)進(jìn)程算柳。它負(fù)責(zé)產(chǎn)生其他所有的用戶進(jìn)程。init進(jìn)程以守護(hù)進(jìn)程(也就是服務(wù))的方式存在姓言,是所有其他進(jìn)程的祖先瞬项。init 進(jìn)程非常獨(dú)特,能夠完成其他進(jìn)程無(wú)法完成的任務(wù)何荚。init 系統(tǒng)能夠定義囱淋、管理和控制 init進(jìn)程的行為。它負(fù)責(zé)組織和運(yùn)行許多獨(dú)立的或相關(guān)的初始化工作(因此被稱為 init 系統(tǒng))餐塘,從而讓計(jì)算機(jī)系統(tǒng)進(jìn)入某種用戶預(yù)定義的運(yùn)行模式妥衣,比如命令行模式或圖形界面模式 。對(duì)于一個(gè)操作系統(tǒng)而言戒傻,僅僅將內(nèi)核運(yùn)行起來(lái)是毫無(wú)實(shí)際用途的税手,必須由 init 系統(tǒng)將操作系統(tǒng)初始化為可操作的狀態(tài)。比如啟動(dòng) shell 后需纳,便有了人機(jī)交互芦倒,這樣就可以讓計(jì)算機(jī)執(zhí)行一些程序完成有實(shí)際意義的任務(wù)。隨著計(jì)算機(jī)系統(tǒng)軟硬件的發(fā)展不翩,init 系統(tǒng)也在不斷的發(fā)展變化之中兵扬。大體上的演進(jìn)路線為 sysvinit -> upstart -> systemd。
二口蝠、進(jìn)化歷程
- sysvinit: System V 風(fēng)格的 init 系統(tǒng).按部就班的完成初始化任務(wù)和關(guān)閉系統(tǒng)任務(wù)器钟。優(yōu)點(diǎn)是概念簡(jiǎn)單。特別是服務(wù)(service)的配置妙蔗,只需要把啟動(dòng)/停止服務(wù)的腳本鏈接接到合適的目錄就可以了俱箱。另一個(gè)重要優(yōu)點(diǎn)是確定的執(zhí)行順序,腳本嚴(yán)格按照順序執(zhí)行(sysvinit 靠腳本來(lái)初始化系統(tǒng))灭必,一個(gè)執(zhí)行完畢再執(zhí)行下一個(gè)狞谱,這非常有益于錯(cuò)誤排查乃摹。缺點(diǎn)也是完全順序執(zhí)行任務(wù),啟動(dòng)慢跟衅。不能很好的處理即插即用的設(shè)備孵睬,對(duì)網(wǎng)絡(luò)共享磁盤(pán)的掛載也存在一定的問(wèn)題。
- upstart: 基于事件機(jī)制伶跷,完美地解決了即插即用設(shè)備帶來(lái)的新問(wèn)題掰读。加快了系統(tǒng)啟動(dòng)時(shí)間,很多不相關(guān)的應(yīng)用可以并行啟動(dòng)叭莫。
-
systemd: systemd 和 ubuntu 的 upstart 是競(jìng)爭(zhēng)對(duì)手蹈集,但是時(shí)至今日 ubuntu 也采用了 systemd,所以 systemd 在競(jìng)爭(zhēng)中勝出雇初,大有一統(tǒng)天下的趨勢(shì).systemd 的很多概念都來(lái)源于蘋(píng)果 Mac OS 操作系統(tǒng)上的 launchd拢肆。systemd 的優(yōu)點(diǎn)是功能強(qiáng)大,使用方便.啟動(dòng)速度非尘甘快郭怪,會(huì)盡可能啟動(dòng)跟梢的進(jìn)程,盡可能將更多的進(jìn)程并行執(zhí)行刊橘。缺點(diǎn)是體系龐大鄙才,非常復(fù)雜.
image
三、systemd的功能
- 提供按需啟動(dòng)能力:只有在某個(gè)服務(wù)被真正請(qǐng)求的時(shí)候才啟動(dòng)它促绵。當(dāng)該服務(wù)結(jié)束攒庵,systemd 可以關(guān)閉它,等待下次需要時(shí)再次啟動(dòng)它败晴。
- 采用 linux 的 cgroups 跟蹤和管理進(jìn)程的生命周期:當(dāng)進(jìn)程創(chuàng)建子進(jìn)程時(shí)叙甸,子進(jìn)程會(huì)繼承父進(jìn)程的 cgroups 。因此無(wú)論服務(wù)如何啟動(dòng)新的子進(jìn)程位衩,所有的這些相關(guān)進(jìn)程都會(huì)屬于同一個(gè) cgroups ,當(dāng)停止服務(wù)時(shí)熔萧,通過(guò)查詢 cgroups 糖驴,systemd 可以確保找到所有的相關(guān)進(jìn)程,從而干凈地停止服務(wù)佛致。
- 啟動(dòng)掛載點(diǎn)和自動(dòng)掛載的管理:這些掛載點(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 目錄。Systemd 管理這些掛載點(diǎn)罐脊,以便能夠在系統(tǒng)啟動(dòng)時(shí)自動(dòng)掛載它們定嗓。有時(shí)候用戶還需要?jiǎng)討B(tài)掛載點(diǎn)蜕琴,比如打算訪問(wèn) DVD 或者 NFS 共享的內(nèi)容時(shí),才臨時(shí)執(zhí)行掛載以便訪問(wèn)其中的內(nèi)容宵溅,而不訪問(wèn)光盤(pán)時(shí)該掛載點(diǎn)被取消(umount)凌简,以便節(jié)約資源。systemd 內(nèi)建的自動(dòng)掛載服務(wù)可以實(shí)現(xiàn)自動(dòng)掛載能力恃逻。
- 實(shí)現(xiàn)事務(wù)性依賴關(guān)系管理:系統(tǒng)啟動(dòng)過(guò)程是由很多的獨(dú)立工作共同組成的雏搂,這些工作之間可能存在依賴關(guān)系,比如掛載一個(gè) NFS 文件系統(tǒng)必須依賴網(wǎng)絡(luò)能夠正常工作寇损。對(duì)于這些任務(wù)凸郑,systemd 維護(hù)一個(gè)"事務(wù)一致性"的概念,保證所有相關(guān)的服務(wù)都可以正常啟動(dòng)而不會(huì)出現(xiàn)互相依賴矛市,以至于死鎖的情況芙沥。
- 日志服務(wù):systemd 自帶日志服務(wù) journald, 用二進(jìn)制格式保存所有日志信息尘盼,用戶使用 journalctl 命令來(lái)查看日志信息憨愉。無(wú)需自己編寫(xiě)復(fù)雜脆弱的字符串分析處理程序。
四卿捎、systemd中的基本概念
Unit(配置單元):系統(tǒng)初始化需要做的事情非常多配紫。需要啟動(dòng)后臺(tái)服務(wù),比如啟動(dòng) ssh 服務(wù)午阵;需要做配置工作躺孝,比如掛載文件系統(tǒng)。這個(gè)過(guò)程中的每一步都被 systemd 抽象為一個(gè)配置單元底桂,即 unit植袍。配置單元可以理解成一個(gè)服務(wù)、一個(gè)掛載點(diǎn)籽懦、一個(gè)交換分區(qū)的配置等等于个,systemd 將配置單元?dú)w納為以下一些不同的類型。然而暮顺,systemd 正在快速發(fā)展厅篓,新功能不斷增加。所以配置單元類型可能在不久的將來(lái)繼續(xù)增加捶码。下面是一些常見(jiàn)的 unit 類型見(jiàn)附錄A羽氮。每個(gè)配置單元都有一個(gè)對(duì)應(yīng)的配置文件,系統(tǒng)管理員的任務(wù)就是編寫(xiě)和維護(hù)這些不同的配置文件惫恼,比如一個(gè) MySQL 服務(wù)對(duì)應(yīng)一個(gè) mysql.service 文件档押。這種配置文件的語(yǔ)法非常簡(jiǎn)單,用戶不需要再編寫(xiě)和維護(hù)復(fù)雜的系統(tǒng)腳本了。
依賴關(guān)系:雖然 systemd 將大量的啟動(dòng)工作解除了依賴令宿,使得它們可以并發(fā)啟動(dòng)叼耙。但還是存在有些任務(wù),它們之間存在天生的依賴掀淘,為了解決這類依賴問(wèn)題旬蟋,systemd 的配置單元之間可以彼此定義依賴關(guān)系。Systemd 用配置單元定義文件中的關(guān)鍵字來(lái)描述配置單元之間的依賴關(guān)系革娄。比如:unit B 依賴 unit A倾贰,可以在 unit B 的定義中用"require A"來(lái)表示。這樣 systemd 就會(huì)保證先啟動(dòng) A 再啟動(dòng) B拦惋。
事務(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)。
target 和運(yùn)行級(jí)別:systemd 用目標(biāo)(target)替代了運(yùn)行級(jí)別的概念抄沮,提供了更大的靈活性跋核,如您可以繼承一個(gè)已有的目標(biāo),并添加其它服務(wù)叛买,來(lái)創(chuàng)建自己的目標(biāo)砂代。下表列舉了 systemd 中的 target 和 sysvinit 中常見(jiàn)的 runlevel 的對(duì)應(yīng)關(guān)系:
sysvinit runlevel | 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 | 多用戶椒功,非圖形化捶箱。用戶可以通過(guò)多個(gè)控制臺(tái)或網(wǎng)絡(luò)登錄。 |
5 | graphical.target | 多用戶蛾茉,圖形化。通常為所有運(yùn)行級(jí)別 3 的服務(wù)外加圖形化登錄撩鹿。 |
6 | reboot.target | 重啟谦炬。 |
emergency | emergency.target | 緊急 Shell两踏。 |
附錄A:常見(jiàn)的配置單元
- 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ù)中的設(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)香罐,并在開(kāi)機(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)肚豺。
- path:文件系統(tǒng)中的一個(gè)文件或目錄。
- scope:用于 cgroups界拦,表示從 systemd 外部創(chuàng)建的進(jìn)程吸申。
- slice:用于 cgroups,表示一組按層級(jí)排列的單位享甸。slice 并不包含進(jìn)程截碴,但會(huì)組建一個(gè)層級(jí),并將 scope 和 service 都放置其中枪萄。