了不起的systemctl——簡介

Linux系統的啓動方式有點複雜,而且總是有需要優化的地方。傳統的Linux系統啓動過程主要由著名的init進程(也被稱爲SysV init啓動系統)處理,而基於init的啓動系統被認爲有效率不足的問題,systemd是Linux系統機器的另一種啓動方式,宣稱彌補了以傳統Linux SysV init爲基礎的系統的缺點。

理解Linux啓動過程

在我們打開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的主要目的就是減少系統引導時間和計算開銷。Systemd(系統管理守護進程),最開始以GNU GPL協議授權開發,現在已轉爲使用GNU LGPL協議,它是如今討論最熱烈的引導和服務管理程序。如果你的Linux系統配置爲使用Systemd引導程序,它取替傳統的SysV init,啓動過程將交給systemd處理。Systemd的一個核心功能是它同時支持SysV init的後開機啓動腳本。

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

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

Systemd支持併發引導過程從而可以更快啓動

通過控制組來追蹤進程,而不是PID

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

支持系統快照和恢復

監控已啓動的服務;也支持重啓已崩潰服務

包含了systemd-login模塊用於控制用戶登錄

支持加載和卸載組件

低內存使用痕跡以及任務調度能力

記錄事件的Journald模塊和記錄系統日誌的syslogd模塊

Systemd同時也清晰地處理了系統關機過程。在操作系統中,在/lib/systemd/system目錄下有三個腳本,分別叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。這幾個腳本會在用戶選擇關機,重啓或待機時執行。在接收到關機事件時,systemd首先卸載所有文件系統並停止所有內存交換設備,斷開存儲設備,之後停止所有剩下的進程。

Systemd結構概覽

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

一.當你打開電源後電腦所做的第一件事情就是BIOS初始化。BIOS會讀取引導設備設定,定位並傳遞系統控制權給MBR(假設硬盤是第一引導設備)。

二.MBR從Grub或LILO引導程序讀取相關信息並初始化內核。接下來將由Grub或LILO繼續引導系統。如果你在grub配置文件裏指定了systemd作爲引導管理程序,之後的引導過程將由systemd完成。Systemd使用“target”來處理引導和服務管理過程。這些systemd裏的“target”文件被用於分組不同的引導單元以及啓動同步進程。

三.systemd執行的第一個目標是default.target。但實際上default.target是指向graphical.target的軟鏈接。軟鏈接用起來和Windows下的快捷方式一樣。文件Graphical.target的實際位置是/lib/systemd/system/graphical.target。在下面的截圖裏顯示了graphical.target文件的內容。
了不起的systemctl——簡介

四.在這個階段,會啓動multi-user.target而這個target將自己的子單元放在目錄 “/etc/systemd/system/multi-user.target.wants” 裏。這個target爲多用戶支持設定系統環境。非root用戶會在這個階段的引導過程中啓用。防火牆相關的服務也會在這個階段啓動。

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

了不起的systemctl——簡介

五. "basic.target"單元用於啓動普通服務特別是圖形管理服務。它通過 /lib/systemd/system/basic.target.wants 目錄來決定哪些服務會被啓動,basic.target之後將控制權交給sysinit.target.
了不起的systemctl——簡介

六. "sysinit.target"會啓動重要的系統服務例如系統掛載,內存交換空間和設備,內核補充選項等等。sysinit.target在啓動過程中會傳遞給local-fs.target。這個target單元的內容如下面截圖裏所展示。
了不起的systemctl——簡介

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

系統引導性能分析

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

systemd-analyze time用於顯示內核和普通用戶空間啓動時所花的時間。
了不起的systemctl——簡介

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

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

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

$ systemd-analyze plot > boot.svg

CentOS7自定義系統服務

CentOS7的服務systemctl腳本存放在:/usr/lib/systemd/,有系統(system)和用戶(user)之分,需要開機不登陸就能運行的程序,存在系統服務裏,即:/usr/lib/systemd/system目錄下.

CentOS7的每一個服務以.service結尾,一般會分爲3部分:[Unit]、[Service]和[Install]

[Unit]部分主要是對這個服務的說明,內容包括Description和After,Description 用於描述服務,After用於描述服務類別

[Service]部分是服務的關鍵,是服務的一些具體運行參數的設置.

Type=forking是後臺運行的形式,

User=users是設置服務運行的用戶,

Group=users是設置服務運行的用戶組,

PIDFile爲存放PID的文件路徑,

ExecStart爲服務的具體運行命令,

ExecReload爲重啓命令,

ExecStop爲停止命令,

PrivateTmp=True表示給服務分配獨立的臨時空間

注意:[Service]部分的啓動、重啓、停止命令全部要求使用絕對路徑,使用相對路徑則會報錯!

[Install]部分是服務安裝的相關設置,可設置爲多用戶的

首先,使用systemctl start [ 服務名(也是文件名) ] 可測試服務是否可以成功運行,如果不能運行則可以使用systemctl status [ 服務名(也是文件名) ]查看錯誤信息和其他服務信息,然後根據報錯進行修改,直到可以start,如果不放心還可以測試restart和stop命令。

接着,只要使用systemctl enable xxxxx就可以將所編寫的服務添加至開機啓動即可。

實例:服務用於開機運行tomcat項目:

#vim /usr/lib/systemd/system/tomcat.service

[Unit]

Description=java tomcat project

After=tomcat.service

[Service]

Type=forking

User=users

Group=users

PIDFile=/usr/local/tomcat/tomcat.pid

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecReload=

ExecStop=/usr/local/tomcat/bin/shutdown.sh

PrivateTmp=true

[Install]

WantedBy=multi-user.target

添加可執行權限:

chmod 754 /usr/lib/systemd/system/tomcat.service

設置爲開機自啓動:

#systemctl enable tomcat.service

常用指令(以tomcat服務爲例):

啓動某服務

systemctl start tomcat.service

停止某服務

systemctl stop tomcat.service

重啓某服務

service tomcat restart

systemctl restart tomcat.service

使某服務自動啓動(如tomcat服務)

systemctl enable tomcat.service

使某服務不自動啓動

systemctl disable tomcat.service

檢查服務狀態

systemctl status tomcat.service (服務詳細信息)

systemctl is-active tomcat.service(僅顯示是否Active)

顯示所有已啓動的服務

systemctl list-units --type=service
了不起的systemctl——簡介
睿江雲官網鏈接:http://www.eflycloud.com/#register?salesID=6DGNUTUAV

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章