2021-05-12 14:32:11
CentOS7/RHEL7 systemd詳解
目錄
1. 為什麼是systemd
(1) 關於Linux服務管理
(2) SysV init的優缺點
(3) UpStart的改進
(4) systemd的誕生
(5)為什麼systemd能做到啟動很快
2. SysV init介紹
(1) 什麼是SystemV
(2)SysV init的執行級別
(3)SysV init執行順序
(4)SysV init和系統關閉
(5)SysV init的管理和控制功能
3. systemd的特性
(1)systemd解決了那些問題?
(2)systemd的爭議在哪裡?
(3)systemd能更徹底的結束服務進程
4. CentOS 7的systemd特性
(1)通訊端服務保持啟用功能
(2)進程間通訊保持啟用功能
(3)裝置保持啟用功能
(4)檔案路徑保持啟用功能
(5)系統狀態快照
(6)掛載和自動掛載點管理
(7)閃電並行啟動
(8)單元邏輯模擬檢查
(9)和SysV init向後相容
5. 如何分析衡量systemd啟動速度
(1)檢視詳細的每個服務消耗的啟動時間
(2)檢視嚴重消耗時間的服務樹狀表
(3)列印分析圖及其他命令
6. CentOS 7的systemd向後相容
(1)systemd對執行級別支援有限。
(2)systemd不支援像init指令碼那樣的個性化命令。
(3)systemd不支援和沒有從systemd啟動的服務通訊。
(4)systemd可以只停止執行的服務
(5)不能從標準輸出裝置讀到系統服務資訊。
(6)systemd不繼承任何上下文環境。
(7)SysV init指令碼依賴性
(8)超時機制
7. systemd服務管理
(1) 什麼是單元
(2)systemd的服務管理
(3)服務詳細資訊檢視
8. 使用systemd target
(1)怎樣知道一個目標需要哪些進程服務?
(2)target與執行級別
(3)target管理
9. 關閉、暫停、休眠系統
10. 通過systemd管理遠端系統
11. 建立和修改systemd單元檔案
(1)單元檔案概述
(2)理解單元檔案結構
(3)建立自定義的單元檔案
(4)建立emacs.service例子:
(5)建立第二個sshd服務的例子
(6)修改已經存在的單元檔案
(7)擴充套件預設單元組態檔設定
12. 單元範例化
13. VNC SERVER設定
1.為什麼是systemd
(1) 關於Linux服務管理
Linux系統從啟動到提供服務的過程是這樣,先是機器加電,然後通過MBR或者UEFI載入GRUB,再啟動核心,核心啟動服務,然後開始對外服務。
SysV init UpStart systemd主要是解決服務引導管理的問題。
提示:關於systemd的拼寫,官方的說法就是systemd,既不是Syetemd,也是不systemD。
(2) SysV init的優缺點
SysV init是最早的解決方案,依靠劃分不同的執行級別,啟動不同的服務集,服務依靠指令碼控制,並且是順序執行的。
SysV init方案的優點是:
原理簡單,易於理解;
依靠shell指令碼控制,編寫服務指令碼門檻比較低。
缺點是:
服務順序啟動,啟動過程比較慢;
不能做到根據需要來啟動服務,比如通常希望插入U盤的時候,再啟動USB控制的服務,這樣可以更好的節省系統資源。
(3) UpStart的改進
為了解決系統服務的隨插即用,UpStart應運而生,在CentOS6系統中,SysV init和UpStart是並存的,UpStart主要解決了服務的隨插即用。服務順序啟動慢的問題,UpStart的解決辦法是把相關的服務分組,組內的服務是順序啟動,組之間是並行啟動。
(4) systemd的誕生
SysV init服務啟動慢,在以前並不是一個問題,尤其是Linux系統以前主要是在伺服器系統上,常年也難得重新啟動一次。有的伺服器光硬體檢測都需要5分鐘以上,相對來說系統啟動已經很快了。
但是隨著行動網際網路的到來,SysV init服務啟動慢的問題顯得越來越突出,許多移動裝置都是基於Linux核心,比如安卓。移動裝置啟動比較頻繁,每次啟動都要等待服務順序啟動,顯然難以接受,systemd就是為了解決這個問題誕生的。
systemd的設計思路是:
盡可能的快速啟動服務;
盡可能的減少系統資源佔用。
(5)為什麼systemd能做到啟動很快
systemd使用並行的方法啟動服務,不像SysV init是順序執行的,所以大大節省了系統啟動時間。
使用並行啟動,最大的難點是要解決服務之間的依賴性,systemd的解決辦法是使用類似緩衝池的辦法。比如對TCP有依賴的服務,在啟動的時候會檢查依賴服務的TCP埠,systemd會把對TCP埠的請求先快取起來,當依賴的伺服器啟動之後,在將請求傳遞給服務,使兩個服務通訊。同樣的進程間通訊的D-BUS也是這樣的原理,目錄掛載則是先讓服務以為目錄被掛載了,到真正存取目錄的時候,才去真正操作。
2.SysV init介紹
SysV init是systemV風格的init系統,顧名思義,它源於SystemV系列UNIX。它提供了比BSD風格init系統更高的靈活性。是已經風行了幾十年的UNIX init系統,一直被各類Linux發行版所採用。
(1) 什麼是SystemV
SystemV,曾經也被稱為AT&T SystemV,是Unix作業系統眾多版本中的一支。它最初由AT&T開發,在1983年第一次發布。一共發行了4個SystemV的主要版本:版本1、2、3和4。SystemV Release4,或者稱為SVR4,是最成功的版本,成為一些UNIX共同特性的源頭,例如”SysV初始化指令碼“(/etc/init.d),用來控制系統啟動和關閉,SystemV Interface Definition(SVID)是一個SystemV如何工作的標準定義。
(2)SysV init的執行級別
SysV init用術語runlevel來定義"預訂的執行模式"。SysV init檢查'/etc/inittab'檔案中是否含有'initdefault'項。來告訴init系統是否有一個預設執行模式。如果沒有預設的執行模式,那麼使用者將進入系統控制台,手動決定進入何種執行模式。
SysV init中執行模式描述了系統各種預訂的執行模式。通常會有8種執行模式,即執行模式0到6和S或者s。
每種Linux發行版對執行模式的定義都不太一樣。但0,1,6卻得到了大家的一致贊同:
0關機
1單使用者模式
6重新啟動
通常在/etc/inittab檔案中定義了各種執行模式的工作範圍。比如RedHat定義了runlevel3和5。執行模式3將系統初始化為字元介面的shell模式;執行模式5將系統初始化為GUI模式。無論是命令列介面還是GUI,執行模式3和5相對於其他執行模式而言都是完整的正式的執行狀態,計算機可以完成使用者需要的任務。而模式1,S等往往用於系統故障之後的排錯和恢復。
很顯然,這些不同的執行模式下系統需要初始化執行的進程,需要進行的初始化準備都是不同的。比如執行模式3不需要啟動X系統。使用者只需要指定需要進入哪種模式,SysV init負責執行所有該模式所必須的初始化工作。
(3)SysV init執行順序
SysV init巧妙地用指令碼,檔案命名規則和軟連結來實現不同的runlevel。首先,SysV init需要讀取/etc/inittab檔案。分析這個檔案的內容,它獲得以下一些設定資訊:
系統需要進入的runlevel;
捕獲組合鍵的定義;
定義電源fail/restore指令碼;
啟動getty和虛擬控制台;
得到設定資訊後,SysV init順序地執行以下這些步驟,從而將系統初始化為預訂的runlevelX:
/etc/rc.d/rc.sysinit
/etc/rc.d/rc和/etc/rc.d/rcX.d/(X代表執行級別0-6)
/etc/rc.d/rc.local
XDisplayManager(如果需要的話)
1)rc.sysinit指令碼功能
首先,執行rc.sysinit以便執行一些重要的系統初始化任務。在RedHat公司的RHEL5中(RHEL6已經使用UpStart了),rc.sysinit主要完成以下這些工作:
啟用udev和selinux;
設定定義在/etc/sysctl.conf中的核心引數;
設定系統時鐘;
載入keymaps;
啟用交換分割區;
設定主機名(hostname);
根分割區檢查和remount;
啟用RAID和LVM裝置;
開啟磁碟配額;
檢查並掛載所有檔案系統;
清除過期的locks和PID檔案;
2)rc.d指令碼
完成了以上這些工作之後,SysV init開始執行/etc/rc.d/rc指令碼。根據不同的runlevel,rc指令碼將開啟對應runlevel的rcX.d目錄(X就是runlevel),找到並執行存放在該目錄下的所有啟動指令碼。每個runlevelX都有一個這樣的目錄,目錄名為/etc/rc.d/rcX.d。
在這些目錄下存放著很多不同的指令碼。檔名以S開頭的指令碼就是啟動時應該執行的指令碼,S後面跟的數位定義了這些指令碼的執行順序。在/etc/rc.d/rcX.d目錄下的指令碼其實都是一些軟連結檔案,真實的指令碼檔案存放在/etc/init.d目錄下。如下所示:
rc5.d目錄下的指令碼
[root@www~]#ll/etc/rc5.d/
lrwxrwxrwx1rootroot16Sep42008K02dhcdbd->../init.d/dhcdbd
....(中間省略)....
lrwxrwxrwx1rootroot14Sep42008K91capi->../init.d/capi
lrwxrwxrwx1rootroot23Sep42008S00microcode_ctl->../init.d/microcode_ctl
lrwxrwxrwx1rootroot22Sep42008S02lvm2-monitor->../init.d/lvm2-monitor
....(中間省略)....
lrwxrwxrwx1rootroot17Sep42008S10network->../init.d/network
....(中間省略)....
lrwxrwxrwx1rootroot11Sep42008S99local->../rc.local
lrwxrwxrwx1rootroot16Sep42008S99smartd->../init.d/smartd
....(底下省略)....
當所有的初始化指令碼執行完畢。SysV init執行/etc/rc.d/rc.local指令碼。
rc.local是Linux留給使用者進行個性化設定的地方。可以把自己私人想設定和啟動的東西放到這裡,一台LinuxServer的使用者一般不止一個,所以才有這樣的考慮。
(4)SysV init和系統關閉
SysV init不僅需要負責初始化系統,還需要負責關閉系統。在系統關閉時,為了保證資料的一致性,需要小心地按順序進行結束和清理工作。
比如應該先停止對檔案系統有讀寫操作的服務,然後再umount檔案系統。否則資料就會丟失。
這種順序的控制這也是依靠/etc/rc.d/rcX.d/目錄下所有指令碼的命名規則來控制的,在該目錄下所有以K開頭的指令碼都將在關閉系統時呼叫,字母K之後的數位定義了它們的執行順序。
這些指令碼負責安全地停止服務或者其他的關閉工作。
(5)SysV init的管理和控制功能
此外,在系統啟動之後,管理員還需要對已經啟動的進程進行管理和控制。SysV init軟體包包含了一系列的控制啟動,執行和關閉所有其他程式的工具。
halt停止系統。
init就是SysV init本身的init進程實體,以pid1身份執行,是所有使用者進程的父進程。最主要的作用是在啟動過程中使用/etc/inittab檔案建立進程。
killall5就是System V的killall命令。向除自己的對談(session)進程之外的其它進程發出信號,所以不能殺死當前使用的shell。
last回溯/var/log/wtmp檔案(或者-f選項指定的檔案),顯示自從這個檔案建立以來,所有使用者的登入情況。
lastb作用和last差不多,預設情況下使用/var/log/btmp檔案,顯示所有失敗登入企圖。
mesg控制其它使用者對使用者終端的存取。
pidof找出程式的進程識別號(pid),輸出到標準輸出裝置。
poweroff等於shutdown-h–p,或者telinit0。關閉系統並切斷電源。
reboot等於shutdown–r或者telinit6。重新啟動系統。
runlevel讀取系統的登入記錄檔案(一般是/var/run/utmp)把以前和當前的系統執行級輸出到標準輸出裝置。
shutdown以一種安全的方式終止系統,所有正在登入的使用者都會收到系統將要終止通知,並且不准新的登入。
sulogin當系統進入單使用者模式時,被init呼叫。當接收到啟動載入程式傳遞的-b選項時,init也會呼叫sulogin。
telinit實際是init的一個連線,用來向init傳送單字元引數和信號。
utmpdump以一種使用者友好的格式向標準輸出裝置顯示/var/run/utmp檔案的內容。
wall向所有有資訊許可權的登入使用者傳送訊息。
不同的Linux發行版在這些SysV init的基本工具基礎上又開發了一些輔助工具用來簡化init系統的管理工作。比如RedHat的RHEL在SysV init的基礎上開發了initscripts軟體包,包含了大量的啟動指令碼(如rc.sysinit),還提供了service,chkconfig等命令列工具,甚至一套圖形化介面來管理init系統。其他的Linux發行版也有各自的initscript或其他名字的init軟體包來簡化SysV init的管理。
只要理解了SysV init的機制,在一個最簡的僅有SysV init的系統下,可以直接呼叫指令碼啟動和停止服務,手動建立inittab和建立軟連線來完成這些任務。因此理解SysV init的基本原理和命令是最重要的。甚至也可以開發自己的一套管理工具。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-04/115937p2.htm
相關文章