佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 詳解Linux系統(tǒng)的systemd啟動過程

詳解Linux系統(tǒng)的systemd啟動過程

熱門標(biāo)簽:家政服務(wù)網(wǎng)絡(luò) 服務(wù)器配置 外呼系統(tǒng) 解決方案 電話機器人搭建 硅谷的囚徒呼叫中心 百度競價點擊價格的計算公式 美團

Linux系統(tǒng)的啟動方式有點復(fù)雜,而且總是有需要優(yōu)化的地方。傳統(tǒng)的Linux系統(tǒng)啟動過程主要由著名的init進程(也被稱為SysV init啟動系統(tǒng))處理,而基于init的啟動系統(tǒng)被認(rèn)為有效率不足的問題,systemd是Linux系統(tǒng)機器的另一種啟動方式,宣稱彌補了以傳統(tǒng)Linux SysV init為基礎(chǔ)的系統(tǒng)的缺點。在這里我們將著重討論systemd的特性和爭議,但是為了更好地理解它,也會看一下通過傳統(tǒng)的以SysV init為基礎(chǔ)的系統(tǒng)的Linux啟動過程是什么樣的。友情提醒一下,systemd仍然處在測試階段,而未來發(fā)布的Linux操作系統(tǒng)也正準(zhǔn)備用systemd啟動管理程序替代當(dāng)前的啟動過程(LCTT 譯注:截止到本文發(fā)表,主流的Linux發(fā)行版已經(jīng)有很多采用了 systemd)。
理解Linux啟動過程

在我們打開Linux電腦的電源后第一個啟動的進程就是init。分配給init進程的PID是1。它是系統(tǒng)其他所有進程的父進程。當(dāng)一臺Linux電腦啟動后,處理器會先在系統(tǒng)存儲中查找BIOS,之后BIOS會檢測系統(tǒng)資源然后找到第一個引導(dǎo)設(shè)備,通常為硬盤,然后會查找硬盤的主引導(dǎo)記錄(MBR),然后加載到內(nèi)存中并把控制權(quán)交給它,以后的啟動過程就由MBR控制。

主引導(dǎo)記錄會初始化引導(dǎo)程序(Linux上有兩個著名的引導(dǎo)程序,GRUB和LILO,80%的Linux系統(tǒng)在用GRUB引導(dǎo)程序),這個時候GRUB或LILO會加載內(nèi)核模塊。內(nèi)核會馬上查找/sbin下的“init”程序并執(zhí)行它。從這里開始init成為了Linux系統(tǒng)的父進程。init讀取的第一個文件是/etc/inittab,通過它init會確定我們Linux操作系統(tǒng)的運行級別。它會從文件/etc/fstab里查找分區(qū)表信息然后做相應(yīng)的掛載。然后init會啟動/etc/init.d里指定的默認(rèn)啟動級別的所有服務(wù)/腳本。所有服務(wù)在這里通過init一個一個被初始化。在這個過程里,init每次只啟動一個服務(wù),所有服務(wù)/守護進程都在后臺執(zhí)行并由init來管理。

關(guān)機過程差不多是相反的過程,首先init停止所有服務(wù),最后階段會卸載文件系統(tǒng)。

以上提到的啟動過程有一些不足的地方。而用一種更好的方式來替代傳統(tǒng)init的需求已經(jīng)存在很長時間了。也產(chǎn)生了許多替代方案。其中比較著名的有Upstart,Epoch,Muda和Systemd。而Systemd獲得最多關(guān)注并被認(rèn)為是目前最佳的方案。
理解Systemd

開發(fā)Systemd的主要目的就是減少系統(tǒng)引導(dǎo)時間和計算開銷。Systemd(系統(tǒng)管理守護進程),最開始以GNU GPL協(xié)議授權(quán)開發(fā),現(xiàn)在已轉(zhuǎn)為使用GNU LGPL協(xié)議,它是如今討論最熱烈的引導(dǎo)和服務(wù)管理程序。如果你的Linux系統(tǒng)配置為使用Systemd引導(dǎo)程序,它取替?zhèn)鹘y(tǒng)的SysV init,啟動過程將交給systemd處理。Systemd的一個核心功能是它同時支持SysV init的后開機啟動腳本。

Systemd引入了并行啟動的概念,它會為每個需要啟動的守護進程建立一個套接字,這些套接字對于使用它們的進程來說是抽象的,這樣它們可以允許不同守護進程之間進行交互。Systemd會創(chuàng)建新進程并為每個進程分配一個控制組(cgroup)。處于不同控制組的進程之間可以通過內(nèi)核來互相通信。systemd處理開機啟動進程的方式非常漂亮,和傳統(tǒng)基于init的系統(tǒng)比起來優(yōu)化了太多。讓我們看下Systemd的一些核心功能。

  •     和init比起來引導(dǎo)過程簡化了很多
        Systemd支持并發(fā)引導(dǎo)過程從而可以更快啟動
        通過控制組來追蹤進程,而不是PID
        優(yōu)化了處理引導(dǎo)過程和服務(wù)之間依賴的方式
        支持系統(tǒng)快照和恢復(fù)
        監(jiān)控已啟動的服務(wù);也支持重啟已崩潰服務(wù)
        包含了systemd-login模塊用于控制用戶登錄
        支持加載和卸載組件
        低內(nèi)存使用痕跡以及任務(wù)調(diào)度能力
        記錄事件的Journald模塊和記錄系統(tǒng)日志的syslogd模塊

Systemd同時也清晰地處理了系統(tǒng)關(guān)機過程。它在/usr/lib/systemd/目錄下有三個腳本,分別叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。這幾個腳本會在用戶選擇關(guān)機,重啟或待機時執(zhí)行。在接收到關(guān)機事件時,systemd首先卸載所有文件系統(tǒng)并停止所有內(nèi)存交換設(shè)備,斷開存儲設(shè)備,之后停止所有剩下的進程。

Systemd結(jié)構(gòu)概覽

讓我們看一下Linux系統(tǒng)在使用systemd作為引導(dǎo)程序時的開機啟動過程的結(jié)構(gòu)性細(xì)節(jié)。為了簡單,我們將在下面按步驟列出來這個過程:

1. 當(dāng)你打開電源后電腦所做的第一件事情就是BIOS初始化。BIOS會讀取引導(dǎo)設(shè)備設(shè)定,定位并傳遞系統(tǒng)控制權(quán)給MBR(假設(shè)硬盤是第一引導(dǎo)設(shè)備)。

2. MBR從Grub或LILO引導(dǎo)程序讀取相關(guān)信息并初始化內(nèi)核。接下來將由Grub或LILO繼續(xù)引導(dǎo)系統(tǒng)。如果你在grub配置文件里指定了systemd作為引導(dǎo)管理程序,之后的引導(dǎo)過程將由systemd完成。Systemd使用“target”來處理引導(dǎo)和服務(wù)管理過程。這些systemd里的“target”文件被用于分組不同的引導(dǎo)單元以及啟動同步進程。

3. systemd執(zhí)行的第一個目標(biāo)是default.target。但實際上default.target是指向graphical.target的軟鏈接。Linux里的軟鏈接用起來和Windows下的快捷方式一樣。文件Graphical.target的實際位置是/usr/lib/systemd/system/graphical.target。在下面的截圖里顯示了graphical.target文件的內(nèi)容。

4. 在這個階段,會啟動multi-user.target而這個target將自己的子單元放在目錄“/etc/systemd/system/multi-user.target.wants”里。這個target為多用戶支持設(shè)定系統(tǒng)環(huán)境。非root用戶會在這個階段的引導(dǎo)過程中啟用。防火墻相關(guān)的服務(wù)也會在這個階段啟動。

"multi-user.target"會將控制權(quán)交給另一層“basic.target”。

5. "basic.target"單元用于啟動普通服務(wù)特別是圖形管理服務(wù)。它通過/etc/systemd/system/basic.target.wants目錄來決定哪些服務(wù)會被啟動,basic.target之后將控制權(quán)交給sysinit.target.

6. "sysinit.target"會啟動重要的系統(tǒng)服務(wù)例如系統(tǒng)掛載,內(nèi)存交換空間和設(shè)備,內(nèi)核補充選項等等。sysinit.target在啟動過程中會傳遞給local-fs.target。這個target單元的內(nèi)容如下面截圖里所展示。

7. local-fs.target,這個target單元不會啟動用戶相關(guān)的服務(wù),它只處理底層核心服務(wù)。這個target會根據(jù)/etc/fstab和/etc/inittab來執(zhí)行相關(guān)操作。
系統(tǒng)引導(dǎo)性能分析

Systemd提供了工具用于識別和定位引導(dǎo)相關(guān)的問題或性能影響。Systemd-analyze是一個內(nèi)建的命令,可以用來檢測引導(dǎo)過程。你可以找出在啟動過程中出錯的單元,然后跟蹤并改正引導(dǎo)組件的問題。在下面列出一些常用的systemd-analyze命令。

systemd-analyze time 用于顯示內(nèi)核和普通用戶空間啟動時所花的時間。

   

復(fù)制代碼
代碼如下:
$ systemd-analyze time
Startup finished in 1440ms (kernel) + 3444ms (userspace)

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

   

復(fù)制代碼
代碼如下:
$ systemd-analyze blame
2001ms mysqld.service
234ms httpd.service
191ms vmms.service

systemd-analyze verify 顯示在所有系統(tǒng)單元中是否有語法錯誤。

systemd-analyze plot 可以用來把整個引導(dǎo)過程寫入一個SVG格式文件里。整個引導(dǎo)過程非常長不方便閱讀,所以通過這個命令我們可以把輸出寫入一個文件,之后再查看和分析。下面這個命令就是做這個。

   

復(fù)制代碼
代碼如下:
systemd-analyze plot > boot.svg

Systemd的爭議

Systemd并沒有幸運地獲得所有人的青睞,一些專家和管理員對于它的工作方式和開發(fā)有不同意見。根據(jù)對于Systemd的批評,它不是“類Unix”方式因為它試著替換一些系統(tǒng)服務(wù)。一些專家也不喜歡使用二進制配置文件的想法。據(jù)說編輯systemd配置非常困難而且沒有一個可用的圖形工具。
如何在Ubuntu 14.04和12.04上測試Systemd

本來,Ubuntu決定從Ubuntu 16.04 LTS開始使用Systemd來替換當(dāng)前的引導(dǎo)過程。Ubuntu 16.04預(yù)計在2016年4月發(fā)布,但是考慮到Systemd的流行和需求,剛剛發(fā)布的Ubuntu 15.04采用它作為默認(rèn)引導(dǎo)程序。另外,Ubuntu 14.04 Trusty Tahr和Ubuntu 12.04 Precise Pangolin的用戶可以在他們的機器上測試Systemd。測試過程并不復(fù)雜,你所要做的只是把相關(guān)的PPA包含到系統(tǒng)中,更新倉庫并升級系統(tǒng)。

聲明:請注意它仍然處于Ubuntu的測試和開發(fā)階段。升級測試包可能會帶來一些未知錯誤,最壞的情況下有可能損壞你的系統(tǒng)配置。請確保在嘗試升級前已經(jīng)備份好重要數(shù)據(jù)。

在終端里運行下面的命令來添加PPA到你的Ubuntu系統(tǒng)里:

   

復(fù)制代碼
代碼如下:
sudo add-apt-repository ppa:pitti/systemd

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

然后運行下面的命令更新APT包管理倉庫。

   

復(fù)制代碼
代碼如下:
sudo apt-get update
    

    運行下面的命令升級系統(tǒng)。

   

復(fù)制代碼
代碼如下:
sudo apt-get dist-upgrade

    就這些,你應(yīng)該已經(jīng)可以在你的Ubuntu系統(tǒng)里看到Systemd配置文件了,打開/lib/systemd/目錄可以看到這些文件。

好吧,現(xiàn)在讓我們編輯一下grub配置文件指定systemd作為默認(rèn)引導(dǎo)程序??梢允褂肎edit文字編輯器編輯grub配置文件。

   

復(fù)制代碼
代碼如下:
sudo gedit /etc/default/grub

    

    在文件里修改GRUBCMDLINELINUX_DEFAULT項,設(shè)定它的參數(shù)為:“init=/lib/systemd/systemd”
    

    就這樣,你的Ubuntu系統(tǒng)已經(jīng)不再使用傳統(tǒng)的引導(dǎo)程序了,改為使用Systemd管理器。重啟你的機器然后查看systemd引導(dǎo)過程吧。
    

    結(jié)論

Systemd毫無疑問為改進Linux引導(dǎo)過程前進了一大步;它包含了一套漂亮的庫和守護進程配合工作來優(yōu)化系統(tǒng)引導(dǎo)和關(guān)閉過程。許多Linux發(fā)行版正準(zhǔn)備將它作為自己的正式引導(dǎo)程序。在以后的Linux發(fā)行版中,我們將有望看到systemd開機。但是另一方面,為了獲得成功并廣泛應(yīng)用,systemd仍需要認(rèn)真處理批評意見。

標(biāo)簽:撫州 北海 南昌 防城港 臨沂 邢臺 烏蘭察布 韶關(guān)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Linux系統(tǒng)的systemd啟動過程》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    和田县| 苗栗市| 沧州市| 沁水县| 名山县| 贵港市| 五河县| 承德县| 兴化市| 祥云县| 澳门| 新宁县| 庄浪县| 渑池县| 竹北市| 景东| 海阳市| 大埔区| 安陆市| 威宁| 嘉鱼县| 门源| 三都| 巩留县| 沂源县| 兴宁市| 和田市| 惠安县| 皋兰县| 万荣县| 和平区| 海淀区| 南城县| 南投市| 大城县| 宁安市| 湟中县| 隆化县| 京山县| 龙里县| 荣成市|