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指令碼控制,編寫服務指令碼門檻比較低。
缺點是:
服務順序啟動,啟動過程比較慢;
不能做到根據需要來啟動服務,比如通常希望插入隨身碟的時候,再啟動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的基本原理和命令是最重要的。甚至也可以開發自己的一套管理工具。
更多詳情見請繼續閱讀下一頁的精彩內容: