系統啓動過程當中,當內核啓動完成,後加載根文件系統,後就緒的一些用戶空間的服務的管理工做,就交由init進行啓動和管理,在CentOS6以前的init的管理方式都相似,相關的內容咱們在以前的文章中也作出過介紹。在CentOS7上,init變成了systemd,其管理方式也發生了重大的變化,本章就跟你們歐一塊兒探討一些關於CentOS7上的systemd的新特性的內容。具體分爲一下幾個方面:linux
一、systemd新特性簡介centos
二、systemd如何管理系統系統上的各服務服務器
三、systemd管理各個服務時,所依賴的unit文件的組織格式socket
四、systemd相關操做的實際效果展現centos7
init程序是當系統內核啓動後,加載完根文件系統,而後就由內核加載了init程序,並將後續用戶空間其餘程序的啓動和管理工做交由init程序進行管理,除非有須要進行內核特權級別操做時,內核纔會被用戶空間的各個系統調用,完成一些內核級別的操做spa
在CentOS五、6上,init初始化用戶空間的啓動流程爲:/sbin/init程序主要是經過讀取/etc/inittab文件來完成必定的任務,完成的任務有:操作系統
定義默認運行級別(/etc/inittab)hibernate
運行系統初始化腳本(/etc/rc.d/rc.sysinit)完成系統初始化rest
關閉指定運行級別下的各服務,啓動指定級別下須要開啓的各服務htm
啓動mingetty虛擬終端,調用login程序,顯示登陸提示符,讓終端進行登陸
init程序的類型:
centos5:SysV init
其配置文件:/etc/inittab
centos6: Upstart
其配置文件:/etc/inittab和/etc/init/*.conf
centos7:Systemd
其配置文件:/usr/lib/systemd/system/、/etc/systemd/system/
<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
<1>基於socket的激活機制:socket與程序分離,能夠在系統啓動時,先把某個服務的socket分配給該服務,但該服務能夠事先不用啓動
<2>基於bus的激活機制:基於總線的激活
<3>基於device的激活機制:當某個設備接入時,systemd能夠自動的去激活諸如device unit、mount unit、automount unit對設備進行識別和掛載等
<4>基於path的激活機制:系統能夠自動監控某個目錄存不存在,文件存不存在,並根據此判斷,來激活別的服務、進程等
<5>系統快照:可以保存各unit的當前狀態信息於持久存儲設備中;從而實現了回滾機制
<6>能向後兼容sysv init腳本:在centos五、6系統上/etc/init.d/目錄下的服務腳本,systemd也可以對其進行管理
不兼容的地方:
1):systemctl的命令是固定不變的,也就是說像在centos6上的各種服務腳本的start、stop這類咱們能夠經過修改服務腳本,去實現service 命令使用的時候後面的參數的變化。可是systemctl控制的時候,則沒法經過修改服務腳本去實現systemctl後面參數的變化
2):不是由systemd啓動的服務,systemctl沒法與之通訊,也就是沒法對其進行控制。在centos6上,利用服務腳本自身啓動時,利用service依然可以對其進行管理,可是centos7上,若是服務腳本自身啓動,而不是經過systemctl進行啓動,則systemctl就沒法對服務作出管理
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,主要用於定義文件系統中的文件或目錄
主要是依靠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
運行級別的對應關係:
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
關機:systemctl halt、systemctl poweroff
重啓:systemctl reboot
掛起:systemctl suspend
快照:systemctl hibernate
快照並掛起:systemctl hybrid-sleep
<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