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