首頁 > 軟體

CentOS7進程管理systemd詳解

2020-06-16 17:32:23

概述:

系統啟動過程中,當核心啟動完成,後載入根檔案系統,後就緒的一些使用者空間的服務的管理工作,就交由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


IT145.com E-mail:sddin#qq.com