概述:
系統啟動過程中,當內核啟動完成,后加載根文件系統,后就緒的一些用戶空間的服務的管理工作,就交由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>基于依賴關系定義的服務控制邏輯
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需要的服務
第三章 systemd管理各個服務時,所依賴的unit文件的組織格式
1、servie unit文件的組織格式:
/etc/systemd/system/目錄下的個unit文件和/usr/lib/systemd/system/下文件的關系:
當運行級別定義后,該級別下需要加載運行的服務等,會從/usr/lib/systemd/system/下的對應的unit以軟鏈接方式映射/etc/systemd/system/目錄下
如利用systemctl set-default runlevel5.target 修改默認運行級別后,原來/etc/systemd/system/default.target會重新鏈接到/usr/lib/systemd/system/graphical.target
service unit file文件的組成:
文件通常由三部分組成:
[Unit]:定義與Unit類型無關的通用選項,用于提供unit的描述信息,unit行為及依賴關系等;
[Service]:與特定類型相關的專用選項,此處為service類型
[Install]:定義由“systemctl enable”以及“systemctl disable”命令在實現服務啟用或僅用時用到的一些選項;
unit段的常用選項:
Description:描述信息,意義性描述
After:定義unit啟動次序,表示當前unit應該晚于哪些unit啟動,其功能與Before相反
Requies:依賴到的其他units;強依賴,被依賴的unit無法激活時,當前unit也無法激活
Wants:指明依賴到的其他units;弱依賴,被依賴的unit無法激活時,當前unit可以被激活
Conflicts:定義units間的沖突關系
service段的常用選項:
Type:用于定義ExecStart及相關參數的功能的unit進程啟動類型;
類型:
simple:默認值,表示由ExecStart啟動的進程為主進程
forking:表示由ExecStart啟動的進程生成的其中一個子進程將成為主進程,啟動完成后,父進程會退出
oneshot:功能類似于simple,但是在啟動后續的units進程之前,主進程將會退出
notify:類似于simple,表示后續的units,僅在通過sdnotify函數發送通知以后,才能運行該命令
idle:
常見的是notify、forking、simple
EnvironmentFile :指明環境配置文件,為真正ExecStart執行之前提供環境配置或變量定義等文件
ExecStart:指明啟動unit要運行的命令或腳本;ExecStartPre、ExecStartPost表示啟動前或啟動后要執行的命令或腳本
ExecStop:指明停止unit要運行的命令或腳本
Restart:表示進程意外終止了,會自動重啟
install段的常用選項:
Alias:當前unit的別名
RequiredBy:被那些units所依賴,強依賴
WantedBy:被那些units所依賴,弱依賴
注意:對于新創建的unit文件,或修改了的unit文件,必須要讓systemd重新識別此配置文件,可利用:systemctl daemon-reload 進行重載
2、unit文件示例
vim /etc/systemd/system/bak.service
[Unit]
Description=backup my etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
[Install]
WantedBy=multi-user.target
編輯完成后,執行
systemctl daemon-reload 讓systemd識別此服務配置文件
systemctl start bak.service 啟動此服務
第四章 systemd相關操作的實際效果展示
1、系統啟動時,通過修改grub選項中的相關內核參數,實現啟動時進入不同的模式(緊急救援模式、emergency模式)
在啟動時,啟動菜單項按e鍵,然后在linux16行后添加:(設置內核參數,只影響當次啟動)
systemd.unit=emergency.target emergency模式
或 systemd.unit=rescure.target 緊急救援模式
rescure.target 比emergency 支持更多的功能,例如日志等
2、系統啟動時破解root口令
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啟動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
3、修復grub
主要配置文件 /boot/grub2/grub.cfg
修復配置文件 grub2-mkconfig > /boot/grub2/grub.cfg
修復grub
grub2-install /dev/sda BIOS環境
grub2-install UEFI環境
破壞grub,然后進行修復
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/48167
文章對當天所學的知識,整理的很好,特別是管理服務的·那張圖,能看出來很用心,贊一個。