天天看點

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

<a target="_blank"></a>

在我們打開linux電腦的電源後第一個啟動的程序就是init。配置設定給init程序的pid是1。它是系統其他所有程序的父程序。當一台linux電腦啟動後,處理器會先在系統存儲中查找bios,之後bios會檢測系統資源然後找到第一個引導裝置,通常為硬碟,然後會查找硬碟的主引導記錄(mbr),然後加載到記憶體中并把控制權交給它,以後的啟動過程就由mbr控制。

主引導記錄會初始化引導程式(linux上有兩個著名的引導程式,grub和lilo,80%的linux系統在用grub引導程式),這個時候grub或lilo會加載核心子產品。核心會馬上查找/sbin下的“init”程式并執行它。從這裡開始init成為了linux系統的父程序。init讀取的第一個檔案是/etc/inittab,通過它init會确定我們linux作業系統的運作級别。它會從檔案/etc/fstab裡查找分區表資訊然後做相應的挂載。然後init會啟動/etc/init.d裡指定的預設啟動級别的所有服務/腳本。所有服務在這裡通過init一個一個被初始化。在這個過程裡,init每次隻啟動一個服務,所有服務/守護程序都在背景執行并由init來管理。

關機過程差不多是相反的過程,首先init停止所有服務,最後階段會解除安裝檔案系統。

以上提到的啟動過程有一些不足的地方。而用一種更好的方式來替代傳統init的需求已經存在很長時間了。也産生了許多替代方案。其中比較著名的有upstart,epoch,muda和systemd。而systemd獲得最多關注并被認為是目前最佳的方案。

開發systemd的主要目的就是減少系統引導時間和計算開銷。systemd(系統管理守護程序),最開始以gnu gpl協定授權開發,現在已轉為使用gnu lgpl協定,它是如今讨論最熱烈的引導和服務管理程式。如果你的linux系統配置為使用systemd引導程式,它取替傳統的sysv init,啟動過程将交給systemd處理。systemd的一個核心功能是它同時支援sysv init的後開機啟動腳本。

和init比起來引導過程簡化了很多

systemd支援并發引導過程進而可以更快啟動

通過控制組來追蹤程序,而不是pid

優化了處理引導過程和服務之間依賴的方式

支援系統快照和恢複

監控已啟動的服務;也支援重新開機已崩潰服務

包含了systemd-login子產品用于控制使用者登入

支援加載和解除安裝元件

低記憶體使用痕迹以及任務排程能力

記錄事件的journald子產品和記錄系統日志的syslogd子產品

systemd同時也清晰地處理了系統關機過程。它在/usr/lib/systemd/目錄下有三個腳本,分别叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。這幾個腳本會在使用者選擇關機,重新開機或待機時執行。在接收到關機事件時,systemd首先解除安裝所有檔案系統并停止所有記憶體交換裝置,斷開儲存設備,之後停止所有剩下的程序。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

讓我們看一下linux系統在使用systemd作為引導程式時的開機啟動過程的結構性細節。為了簡單,我們将在下面按步驟列出來這個過程:

1. 當你打開電源後電腦所做的第一件事情就是bios初始化。bios會讀取引導裝置設定,定位并傳遞系統控制權給mbr(假設硬碟是第一引導裝置)。

2. mbr從grub或lilo引導程式讀取相關資訊并初始化核心。接下來将由grub或lilo繼續引導系統。如果你在grub配置檔案裡指定了systemd作為引導管理程式,之後的引導過程将由systemd完成。systemd使用“target”來處理引導和服務管理過程。這些systemd裡的“target”檔案被用于分組不同的引導單元以及啟動同步程序。

3. systemd執行的第一個目标是default.target。但實際上default.target是指向graphical.target的軟連結。linux裡的軟連結用起來和windows下的快捷方式一樣。檔案graphical.target的實際位置是/usr/lib/systemd/system/graphical.target。在下面的截圖裡顯示了graphical.target檔案的内容。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

4. 在這個階段,會啟動multi-user.target而這個target将自己的子單元放在目錄“/etc/systemd/system/multi-user.target.wants”裡。這個target為多使用者支援設定系統環境。非root使用者會在這個階段的引導過程中啟用。防火牆相關的服務也會在這個階段啟動。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

"multi-user.target"會将控制權交給另一層“basic.target”。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

5. "basic.target"單元用于啟動普通服務特别是圖形管理服務。它通過/etc/systemd/system/basic.target.wants目錄來決定哪些服務會被啟動,basic.target之後将控制權交給sysinit.target.

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

6. "sysinit.target"會啟動重要的系統服務例如系統挂載,記憶體交換空間和裝置,核心補充選項等等。sysinit.target在啟動過程中會傳遞給local-fs.target。這個target單元的内容如下面截圖裡所展示。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

7. local-fs.target,這個target單元不會啟動使用者相關的服務,它隻處理底層核心服務。這個target會根據/etc/fstab和/etc/inittab來執行相關操作。

systemd提供了工具用于識别和定位引導相關的問題或性能影響。systemd-analyze是一個内建的指令,可以用來檢測引導過程。你可以找出在啟動過程中出錯的單元,然後跟蹤并改正引導元件的問題。在下面列出一些常用的systemd-analyze指令。

systemd-analyze time 用于顯示核心和普通使用者空間啟動時所花的時間。

<code>$ systemd-analyze time</code>

<code></code>

<code>startup finished in 1440ms (kernel) + 3444ms (userspace)</code>

systemd-analyze blame 會列出所有正在運作的單元,按從初始化開始到目前所花的時間排序,通過這種方式你就知道哪些服務在引導過程中要花較長時間來啟動。

<code>$ systemd-analyze blame</code>

<code>2001ms mysqld.service</code>

<code>234ms httpd.service</code>

<code>191ms vmms.service</code>

systemd-analyze verify 顯示在所有系統單元中是否有文法錯誤。

systemd-analyze plot 可以用來把整個引導過程寫入一個svg格式檔案裡。整個引導過程非常長不友善閱讀,是以通過這個指令我們可以把輸出寫入一個檔案,之後再檢視和分析。下面這個指令就是做這個。

<code>systemd-analyze plot &gt; boot.svg</code>

systemd并沒有幸運地獲得所有人的青睐,一些專家和管理者對于它的工作方式和開發有不同意見。根據對于systemd的批評,它不是“類unix”方式因為它試着替換一些系統服務。一些專家也不喜歡使用二進制配置檔案的想法。據說編輯systemd配置非常困難而且沒有一個可用的圖形工具。

本來,ubuntu決定從ubuntu 16.04 lts開始使用systemd來替換目前的引導過程。ubuntu 16.04預計在2016年4月釋出,但是考慮到systemd的流行和需求,剛剛釋出的ubuntu 15.04采用它作為預設引導程式。另外,ubuntu 14.04 trusty tahr和ubuntu 12.04 precise pangolin的使用者可以在他們的機器上測試systemd。測試過程并不複雜,你所要做的隻是把相關的ppa包含到系統中,更新倉庫并更新系統。

聲明:請注意它仍然處于ubuntu的測試和開發階段。更新測試包可能會帶來一些未知錯誤,最壞的情況下有可能損壞你的系統配置。請確定在嘗試更新前已經備份好重要資料。

在終端裡運作下面的指令來添加ppa到你的ubuntu系統裡:

<code>sudo add-apt-repository ppa:pitti/systemd</code>

你将會看到警告資訊因為我們嘗試使用臨時/測試ppa,而它們是不建議用于實際工作機器上的。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

然後運作下面的指令更新apt包管理倉庫。

<code>sudo apt-get update</code>

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

運作下面的指令更新系統。

<code>sudo apt-get dist-upgrade</code>

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

就這些,你應該已經可以在你的ubuntu系統裡看到systemd配置檔案了,打開/lib/systemd/目錄可以看到這些檔案。

好吧,現在讓我們編輯一下grub配置檔案指定systemd作為預設引導程式。可以使用gedit文字編輯器編輯grub配置檔案。

<code>sudo gedit /etc/default/grub</code>

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

在檔案裡修改grubcmdlinelinux_default項,設定它的參數為:“init=/lib/systemd/systemd”

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

就這樣,你的ubuntu系統已經不再使用傳統的引導程式了,改為使用systemd管理器。重新開機你的機器然後檢視systemd引導過程吧。

走進Linux之systemd啟動過程走進Linux之systemd啟動過程

systemd毫無疑問為改進linux引導過程前進了一大步;它包含了一套漂亮的庫和守護程序配合工作來優化系統引導和關閉過程。許多linux發行版正準備将它作為自己的正式引導程式。在以後的linux發行版中,我們将有望看到systemd開機。但是另一方面,為了獲得成功并廣泛應用,systemd仍需要認真處理批評意見。

原文釋出時間:2015-05-17

本文來自雲栖合作夥伴“linux中國”

繼續閱讀