歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> CentOS7/RHEL7 systemd詳解

CentOS7/RHEL7 systemd詳解

日期:2017/2/28 14:21:35   编辑:Linux教程

目錄
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

Copyright © Linux教程網 All Rights Reserved