2021-05-12 14:32:11
CentOS7進程管理systemd詳解
概述:
系統啟動過程中,當核心啟動完成,後載入根檔案系統,後就緒的一些使用者空間的服務的管理工作,就交由init進行啟動和管理,在CentOS6之前的init的管理方式都類似,相關的內容我們在之前的文章中也做出過介紹。在CentOS7上,init變成了systemd,其管理方式也發生了重大的變化,本章就跟大家歐一起探討一些關於CentOS7上的systemd的新特性的內容。具體分為一下幾個方面:
1、systemd新特性簡介
2、systemd如何管理系統系統上的各服務
3、systemd管理各個服務時,所依賴的unit檔案的組織格式
4、systemd相關操作的實際效果展示
第一章 systemd新特性簡介
1、init程式的功能介紹
init程式是當系統核心啟動後,載入完根檔案系統,然後就由核心載入了init程式,並將後續使用者空間其他程式的啟動和管理工作交由init程式進行管理,除非有需要進行核心特權級別操作時,核心才會被使用者空間的各個系統呼叫,完成一些核心級別的操作
在CentOS5、6上,init初始化使用者空間的啟動流程為:/sbin/init程式主要是通過讀取/etc/inittab檔案來完成一定的任務,完成的任務有:
定義預設執行級別(/etc/inittab)
執行系統初始化指令碼(/etc/rc.d/rc.sysinit)完成系統初始化
關閉指定執行級別下的各服務,啟動指定級別下需要開啟的各服務
啟動mingetty虛擬終端,呼叫login程式,顯示登入提示符,讓終端進行登入
init程式的型別:
centos5:SysV init
其組態檔:/etc/inittab
centos6: Upstart
其組態檔:/etc/inittab和/etc/init/*.conf
centos7:Systemd
其組態檔:/usr/lib/systemd/system/、/etc/systemd/system/
2、systemd的新特性:
<1>系統引導時實現服務並行啟動(前提是並行啟動的服務之間沒有依賴關係)
<2>按需啟用進程(進程在沒有存取時是不會被啟動的,但是服務仍然處於半活動狀態,只是服務沒有啟動)
<3>系統狀態快照,自我儲存某一時刻進程使用者空間狀態的快照,可以回滾到某一個時刻
<4>基於依賴關係定義的服務控制邏輯
CentOS7/RHEL7 systemd詳解 http://www.linuxidc.com/Linux/2015-04/115937.htm
為什麼systemd會被如此迅速的採用? http://www.linuxidc.com/Linux/2014-08/105789.htm
systemd 與 sysVinit 彩版對照表 http://www.linuxidc.com/Linux/2014-09/106455.htm
太有用了!用systemd命令來管理Linux系統! http://www.linuxidc.com/Linux/2014-09/106490.htm
淺析 Linux 初始化 init 系統,第 3 部分: Systemd http://www.linuxidc.com/Linux/2014-12/110383.htm
3、systemd的關鍵特性:
<1>基於socket的啟用機制:socket與程式分離,可以在系統啟動時,先把某個服務的socket分配給該服務,但該服務可以事先不用啟動
<2>基於bus的啟用機制:基於匯流排的啟用
<3>基於device的啟用機制:當某個裝置接入時,systemd可以自動的去啟用諸如device unit、mount unit、automount unit對裝置進行識別和掛載等
<4>基於path的啟用機制:系統可以自動監控某個目錄存不存在,檔案存不存在,並根據此判斷,來啟用別的服務、進程等
<5>系統快照:能夠儲存各unit的當前狀態資訊於持久儲存裝置中;從而實現了回滾機制
<6>能向後相容sysv init指令碼:在centos5、6系統上/etc/init.d/目錄下的服務指令碼,systemd也能夠對其進行管理
不相容的地方:
1):systemctl的命令是固定不變的,也就是說像在centos6上的各類服務指令碼的start、stop這類我們可以通過修改服務指令碼,去實現service 命令使用的時候後面的引數的變化。但是systemctl控制的時候,則無法通過修改服務指令碼去實現systemctl後面引數的變化
2):不是由systemd啟動的服務,systemctl無法與之通訊,也就是無法對其進行控制。在centos6上,利用服務指令碼自身啟動時,利用service依然能夠對其進行管理,但是centos7上,如果服務指令碼自身啟動,而不是通過systemctl進行啟動,則systemctl就無法對服務做出管理
4、systemd的核心概念:unit
unit由其相關的組態檔進行標識、識別和設定,也就是說一個unit到底定義與否,由其組態檔進行標識。這類組態檔中主要包含了幾個類別:系統服務,監聽的socket、儲存的快照以及其他與init相關的資訊,這些組態檔中主要儲存在:
/usr/lib/systemd/system/ 每個服務最主要的啟動指令碼設定,類似於之前的/etc/init.d/
/run/systemd/system/ 系統執行過程中所產生的服務指令碼,比上面目錄優先執行
/etc/systemd/system/ 管理員建立的執行指令碼,類似於/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先執行
unit的常見型別:
service unit:這類unit的副檔名為.service,主要用於定義系統服務(其扮演了在centos6上/etc/init.d/目錄下的服務指令碼的作用)
target unit:這類unit的副檔名為.target,主要用於模擬實現"執行級別"的概念
device unit:這類unit副檔名為.device,用於定義核心識別的裝置,然後udev利用systemd識別的硬體,完成建立裝置檔名
mount unit:這類unit副檔名為.mount,主要用於定義檔案系統掛載點
socket unit:這類unit副檔名為.socket,用於標識進程間通訊用到的socket檔案
snapshot unit:這類unit副檔名為.snapshot,主要用於實現管理系統快照
swap unit:這類unit副檔名為.swap,主要用於標識管理swap裝置
automount unit:這類unit副檔名為.automount,主要用於檔案系統自動掛載裝置
path unit:這類unit副檔名為.path,主要用於定義檔案系統中的檔案或目錄
第二章 systemd如何管理系統上的各個服務
1、systemd對服務的管理(service類unit的管理)
主要是依靠service型別的unit檔案進行管控的完成的
systemctl命令:
語法:systemctl [OPTIONS…] COMMAND [SERVICE_NAME.service…]
<1>啟動:service SERVICE_NAME start ==> systemctl start SERVICE_NAME.service
<2>停止:service SERVICE_NAME stop ==> systemctl stop SERVICE_NAME.service
<3>重新啟動:service SERVICE_NAME restart ==> systemctl restart SERVICE_NAME.service
<4>狀態:service SERVICE_NAME status ==> systemctl status SERVICE_NAME.service
centos7裡面狀態資訊裡顯示的loaded 表示是否加入到systemctl可管理的列表中(類似centos6中chkconfig –add的概念,如果是loaded,表示已經新增到列表中,後面disabled表示沒有開機自動啟動)
<5>條件式重新啟動:(相當於如果服務之前啟動了,則對服務進行重新啟動,如果服務之前沒啟動,則不執行任何操作)
service SERVICE_NAME condrestart ==> systemctl tryrestart SERVICE_NAME.service
<6>過載或重新啟動服務:(相當於如果服務支援不重新啟動而過載組態檔,就進行過載,如果服務不支援過載組態檔,就重新啟動服務)
cenntos6不支援
systemctl reload-or-restart SERVICE_NAME.service
<7>過載或條件是重新啟動:(相當於如果服務支援不重新啟動而過載組態檔,就進行過載,如果服務不支援過載組態檔,就重新啟動服務,但重新啟動的前提是該服務之前是開啟的)
cenntos6不支援
systemctl reload-or-try-restart SERVICE_NAME.service
<8>檢視某服務當前是否啟用:
centos6不支援
systemctl is-acive SERVICE_NAME.service
<9>檢視所有已啟用的服務:
systemctl list-unit –type|-t service
<10>檢視所有的服務,也就是所有已經裝載load的服務,包含已啟用和未啟用的:
chkconfig –list ==> systemctl list-unit -t service -a
顯示出來的資訊的含義:
loaded:Unit組態檔已處理
active(running):一次或多次持續處理的執行
active(exited):成功完成一次性的設定
active(waiting):執行中,等待一個事件
inactive:不執行
enabled:開機啟動
disabled:開機不啟動
static:開機不啟動,但可被另一個啟用的服務啟用
<11>設定服務可以開機自動啟動:
chkconfig SERVICE_NAME on ==> systemctl enable SERVICE_NAME.service
<12>禁止服務開機自動啟動:
chkconfig SERVICE_NAME off ==> systemctl disable SERVICE_NAME.service
<13>檢視某服務是否能夠開機自啟動:
chkconfig –list SERVICE_NAME ==> systemctl is-enabled SERVICE_NAME.service
<14>禁止某服務設定為開機自啟:
systemctl mask SERVICE_NAME.service
<15>取消上述禁止:
systemctl unmask SERVICE_NAME.service
<16>檢視服務的依賴關係:
systemctl list-dependencies SERVICE_NAME.service
2、systemd對target類unit的管理(類似於執行級別的管理)
執行級別的對應關係:
0 ==> runlevel0.target 或 poweroff.target
1 ==> runlevel1.target 或 rescue.target
2 ==> runlevel2.target 或 multi-user.target
3 ==> runlevel3.target 或 multi-user.target
4 ==> runlevel4.target 或 multi-user.target
5 ==> runlevel5.target 或 graphical.target
6 ==> runlevel6.target 或 reboot.target
<1>級別切換:
init 數位 ==> systemctl isolate NAME.target
<2>檢視當前執行級別:
runlevel ==> systemctl –list-unit -t target
<3>檢視所有裝載的target:
systemctl –list-unit -t target -a
<4>檢視預設執行級別:
systemctl get-default
<5>設定預設執行級別:
systemctl set-default NAME.target
centos6修改/etc/inittab檔案
<6>切換至緊急救援模式:
systemctl rescue
<7>切換至緊急emergency模式:比緊急救援模式載入的東西更加少,緊急救援模式還會執行系統初始化指令碼/etc/rc.d/rc.sysinit系統初始化指令碼,但emergency不會執行系統初始化指令碼,通常用於當裝了某些硬體驅動後無法正常啟動時,才進入該模式。
systemctl emergency
3、systemd相關的其他常用命令:
關機:systemctl halt、systemctl poweroff
重新啟動:systemctl reboot
掛起:systemctl suspend
快照:systemctl hibernate
快照並掛起:systemctl hybrid-sleep
4、CentOS6與CentOS7上對服務的管理方式對比總結
4、CentOS7的啟動流程詳解
<1>UEFi或BIOS初始化,執行POST開機自檢
<2>選擇啟動裝置
<3>引導裝載程式, centos7是grub2
<4>載入裝載程式的組態檔: /etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
<5>載入initramfs驅動模組
<6>載入核心選項
<7>核心初始化, centos7使用systemd代替init
<8>執行initrd.target所有單元,包括掛載/etc/fstab
<9>從initramfs根檔案系統切換到磁碟根目錄
<10>systemd執行預設target設定,組態檔/etc/systemd/default.target /etc/systemd/system/
<11>systemd執行sysinit.target初始化系統及basic.target準備作業系統
<12>systemd啟動multi-user.target下的本機與伺服器服務
<13>systemd執行multi-user.target下的/etc/rc.d/rc.local
<14>systemd執行multi-user.target下的getty.target及登入服務
<15>systemd執行graphical需要的服務
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-09/135464p2.htm
相關文章