
一、systemd的簡介
systemd是linux的初始化啟動系統(tǒng),從當年的sysv init到upstart再到現(xiàn)在的systemd,可以說啟動系統(tǒng)在不斷的優(yōu)化啟動效率。當年的sysvint在啟動系統(tǒng)的時候,使用的是串行啟動的方式,也就是每個服務(wù)必須在等待前面的服務(wù)系統(tǒng)啟動完畢再進行啟動。這樣就大大增加了啟動時間。upstart使用的是半并行的事件觸發(fā)機制,也就是說只要不需要依賴的都獨立出來并行啟動,這種方式比之前的sysvinit的方式快了很多,但是在某種程度上來說,還是局部串行的,也就是存在依賴的處理程序還需要一個接一個的進行啟動。有沒有辦法將需要依賴的程序也并行起來獨立啟動呢?這個時候就誕生了systemd。
二、linux系統(tǒng)的啟動過程
既然是初始化啟動程序,必須先從開機說起,開機后首先是進行post上電自檢,也就是檢測cpu,磁盤,內(nèi)存條,主板等有沒有壞掉,然后是bios讀取設(shè)備的設(shè)置并把系統(tǒng)管理控制權(quán)交給MBR,MBR讀取Bootloader管理器(我們一般使用Grub)引導(dǎo)程序的相關(guān)信息,然后進行初始化內(nèi)核,并進行第二次硬件自檢,當內(nèi)核文件
而Grub作為引導(dǎo)程序,會在配置文件里面說明引導(dǎo)管理程序,這里我們用的是systemd,在systemd啟動管理里面會去啟動相應(yīng)的系統(tǒng)掛載和服務(wù)。在upstart系統(tǒng)系統(tǒng)中會依次啟動/etc/rc[0-6].d的文件,而在systemd系統(tǒng)中執(zhí)行的是.target文件,這兩種方式的區(qū)別是第一種的runlevel是串行依次執(zhí)行的,第二種是可以并行執(zhí)行的。這里的target代表的是一個包含多個unit組,也就是含有不同資源的包。
unit一共分成12種:
Service unit:系統(tǒng)服務(wù)
Target unit:多個 Unit 構(gòu)成的一個組
Device Unit:硬件設(shè)備
Mount Unit:文件系統(tǒng)的掛載點
Automount Unit:自動掛載點
Path Unit:文件或路徑
Scope Unit:不是由 Systemd 啟動的外部進程
Slice Unit:進程組
Snapshot Unit:Systemd 快照,可以切回某個快照
Socket Unit:進程間通信的 socket
Swap Unit:swap 文件
Timer Unit:定時器
傳統(tǒng)的runlevel和target的對照表
Traditional runlevel ? ? ?New target name ? ? Symbolically linked to...
Runlevel 0 ? ? ? ? ? | ? ?runlevel0.target -> poweroff.target
Runlevel 1 ? ? ? ? ? | ? ?runlevel1.target -> rescue.target
Runlevel 2 ? ? ? ? ? | ? ?runlevel2.target -> multi-user.target
Runlevel 3 ? ? ? ? ? | ? ?runlevel3.target -> multi-user.target
Runlevel 4 ? ? ? ? ? | ? ?runlevel4.target -> multi-user.target
Runlevel 5 ? ? ? ? ? | ? ?runlevel5.target -> graphical.target
Runlevel 6 ? ? ? ? ? | ? ?runlevel6.target -> reboot.target
三、systemd的優(yōu)化
優(yōu)化啟動方式的三個方向:socket通信依賴,文件系統(tǒng)依賴,D-bus依賴
socker通信依賴:
因為絕大多數(shù)的服務(wù)依賴是socket依賴,可能某一個通信服務(wù)需要另一個服務(wù)開啟才能通信,這樣一來假如這個需要通信依賴沒有開啟就去通信的話就會報錯。那么有沒有辦法同時開啟這些服務(wù),在這些服務(wù)完全開啟后再進行通信。這里systemd的辦法是將請求服務(wù)先存放到linux系統(tǒng)的緩存里面,當真正完全開啟后再去請求緩存進行通信。這樣就避免了不同服務(wù)同時開啟后帶來的請求失敗的錯誤,從而可以讓有socket依賴的服務(wù)也能夠并行開啟
文件系統(tǒng)依賴:
在系統(tǒng)的啟動過程中,有很大部分時間是在進行文件系統(tǒng)檢測,這些活動執(zhí)行時系統(tǒng)是處于空閑狀態(tài)的,因為有些服務(wù)必須要掛載了才能使用。所以有沒有可能在這個時候同時啟動這些需要文件系統(tǒng)掛載后才能執(zhí)行的服務(wù)?systemd里面的設(shè)計就是創(chuàng)建一個臨時的掛載點,按需掛載,服務(wù)要什么掛載,就掛載什么。等到文件系統(tǒng)的檢測和掛載全部完成后再切換到真正的掛載點。這樣就實現(xiàn)了有依賴文件系統(tǒng)的服務(wù)也能在文件系統(tǒng)檢測掛載時同時啟動
D-bus依賴:
D-bus是一個高效的進程間通信機制,也用于應(yīng)用程序和內(nèi)核通信。當我們A,B要進行通信時,A啟動了,B沒有啟動,那么這個時候”bus activation“功能就開啟了,A會去拉起服務(wù)B,并且請求會被D-bus緩存。服務(wù)A等待服務(wù)B就緒。這樣也就解決了進程通信依賴造成的無法同步的問題