走進Linux之systemd啟動過程
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文件的內容。
4. 在這個階段,會啟動multi-user.target而這個target將自己的子單元放在目錄「/etc/systemd/system/multi-user.target.wants」里。這個target為多用戶支持設定系統環境。非root用戶會在這個階段的引導過程中啟用。防火牆相關的服務也會在這個階段啟動。
"multi-user.target"會將控制權交給另一層「basic.target」。
5. "basic.target"單元用於啟動普通服務特別是圖形管理服務。它通過/etc/systemd/system/basic.target.wants目錄來決定哪些服務會被啟動,basic.target之後將控制權交給sysinit.target.
6. "sysinit.target"會啟動重要的系統服務例如系統掛載,內存交換空間和設備,內核補充選項等等。sysinit.target在啟動過程中會傳遞給local-fs.target。這個target單元的內容如下面截圖裡所展示。
7. local-fs.target,這個target單元不會啟動用戶相關的服務,它只處理底層核心服務。這個target會根據/etc/fstab和/etc/inittab來執行相關操作。
系統引導性能分析
Systemd提供了工具用於識別和定位引導相關的問題或性能影響。Systemd-analyze是一個內建的命令,可以用來檢測引導過程。你可以找出在啟動過程中出錯的單元,然後跟蹤並改正引導組件的問題。在下面列出一些常用的systemd-analyze命令。
systemd-analyze time 用於顯示內核和普通用戶空間啟動時所花的時間。
$ systemd-analyze time
Startup finished in 1440ms (kernel) + 3444ms (userspace)
systemd-analyze blame 會列出所有正在運行的單元,按從初始化開始到當前所花的時間排序,通過這種方式你就知道哪些服務在引導過程中要花較長時間來啟動。
$ systemd-analyze blame
2001ms mysqld.service
234ms httpd.service
191ms vmms.service
systemd-analyze verify 顯示在所有系統單元中是否有語法錯誤。
systemd-analyze plot 可以用來把整個引導過程寫入一個SVG格式文件里。整個引導過程非常長不方便閱讀,所以通過這個命令我們可以把輸出寫入一個文件,之後再查看和分析。下面這個命令就是做這個。
systemd-analyze plot > boot.svg
Systemd的爭議
Systemd並沒有幸運地獲得所有人的青睞,一些專家和管理員對於它的工作方式和開發有不同意見。根據對於Systemd的批評,它不是「類Unix」方式因為它試著替換一些系統服務。一些專家也不喜歡使用二進位配置文件的想法。據說編輯systemd配置非常困難而且沒有一個可用的圖形工具。
如何在Ubuntu 14.04和12.04上測試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系統里:
sudo add-apt-repository ppa:pitti/systemd
你將會看到警告信息因為我們嘗試使用臨時/測試PPA,而它們是不建議用於實際工作機器上的。
然後運行下面的命令更新APT包管理倉庫。
sudo apt-get update
運行下面的命令升級系統。
sudo apt-get dist-upgrade
就這些,你應該已經可以在你的Ubuntu系統里看到Systemd配置文件了,打開/lib/systemd/目錄可以看到這些文件。
好吧,現在讓我們編輯一下grub配置文件指定systemd作為默認引導程序。可以使用Gedit文字編輯器編輯grub配置文件。
sudo gedit /etc/default/grub
在文件里修改GRUBCMDLINELINUX_DEFAULT項,設定它的參數為:「init=/lib/systemd/systemd」
就這樣,你的Ubuntu系統已經不再使用傳統的引導程序了,改為使用Systemd管理器。重啟你的機器然後查看systemd引導過程吧。
結論
Systemd毫無疑問為改進Linux引導過程前進了一大步;它包含了一套漂亮的庫和守護進程配合工作來優化系統引導和關閉過程。許多Linux發行版正準備將它作為自己的正式引導程序。在以後的Linux發行版中,我們將有望看到systemd開機。但是另一方面,為了獲得成功並廣泛應用,systemd仍需要認真處理批評意見。
via: http://linoxide.com/linux-how-to/systemd-boot-process/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive