Systemd簡介:
Systemd是系統啓動和服務器守護進程管理器,負責在系統啓動或運行時,激活系統資源,服務器進程和其它進程。
首先簡單瞭解一下centos的啓動流程;
POST --> Boot Sequence --> Bootloader -->kernel + initramfs(initrd)--> rootfs-->/sbin/init
早期linux版本,系統啓動一直是採用init進程,這個進程它的功能就是準備軟件執行的環境。所有的操作都會通過init的配置文件即/etc/inittab來規劃。
這個方法有兩個缺點:
①啓動時間長,init進程是串行啓動,只有前一個進程啓動完,纔會啓動下一個進程。
②啓動腳本複雜,init進程只是執行啓動腳本,不管其他事情,腳本需要自己處理各種情況,這往往使得腳本變長。
Systemd 就是爲了解決這些問題而誕生的。它的設計目標是,爲系統的啓動和管理提供一套完整的解決方案。
根據 Linux 慣例,字母d是守護進程(daemon)的縮寫。 Systemd 這個名字的含義,就是它要守護整個系統。
使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成爲系統的第一個進程(PID 等於 1),其他進程都是它的子進程。
CentOS7使用systemd替換了SysV。Systemd目的是要取代UNIX時代以來一直在使用init系統,兼容SysV和LSB的啓動腳本,而且能夠在進程啓動過程中更加有效的引導加載服務。
Systemd新特性:
系統引導時實現服務並行啓動
按需啓動守護進程
自動化的服務依賴關係管理
同時採用socket式與D-Bus總線式激活服務
支持快照和系統恢復
核心概念:unit(單元)
unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息
配置文件:
/usr/lib/systemd/system:每個服務最主要的啓動腳本設置,類似於之前的/etc/init.d/
/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行
/etc/systemd/system:管理員建立的執行腳本,類似於/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運行
Unit類型
“Systemctl –t help”命令 查看unit類型
Service unit : 文件擴展名爲.service, 用於定義系統服務
Target unit : 文件擴展名爲.target,用於模擬實現“運行級別”
Device unit : 文件擴展名爲 .device, 用於定義內核識別的設備
Mount unit : 文件擴展名爲 .mount, 定義文件系統掛載點
Socket unit : 文件擴展名爲.socket, 用於標識進程間通信用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動
Snapshot unit : 文件擴展名爲.snapshot, 管理系統快照
Swap unit : 文件擴展名爲.swap, 用於標識swap設備
Automount unit : 文件擴展名爲 .automount,文件系統的自動掛載點
Path unit : 文件擴展名爲.path,用於定義文件系統中的一個文件或目錄使用,常用於當文件系統變化時,延遲激活服務,如:spool 目錄
slice unit : 進程組
Timer Unit:定時器
Scope Unit:不是由 Systemd 啓動的外部進程
特性
關鍵特性:
基於socket的激活機制:socket與服務程序分離
基於d-bus的激活機制:
基於device的激活機制:
基於path的激活機制:
系統快照:保存各unit的當前狀態信息於持久存儲設備中
向後兼容sysvinit腳本
不兼容:
systemctl命令固定不變,不可擴展
非由systemd啓動的服務,systemctl無法與之通信和控制
管理服務
Systemd並不是一個命令,而是一組命令,涉及到系統管理的方方面面。監視和控制systemd的主要命令是systemctl,該命令可用於查看系統狀態和管理系統及服務,詳細的可以使用命令“man 1 systemctl”查看幫助文件。
systemctl :是 Systemd 的主命令,用於管理系統。
systemd-analyze :命令用於查看啓動耗時。
hostnamectl :命令用於查看當前主機的信息。
localectl :命令用於查看本地化設置
timedatectl :命令用於查看當前時區設置
loginctl :命令用於查看當前登錄的用戶
管理系統服務:
CentOS 7: service unit
注意:能兼容早期的服務腳本
命令:systemctl COMMAND name.service
service命令對應關係:
啓動:service name start ==> systemctl start name.service
停止:service name stop ==> systemctl stop name.service
重啓:service name restart ==> systemctl restart name.service
狀態:service name status ==> systemctl status name.service
systemctl命令相對於service命令,啓動相應的服務,服務名後需加上擴展名,啓動和停止正常執行後沒有返回信息,(執行錯誤會有相應的提示),但是查看狀態信息,顯示的信息較爲詳細。
例:
條件式重啓:已啓動才重啓,否則不做操作
service name condrestart ==> systemctl try-restart name.service
重載或重啓服務:先加載,再啓動
systemctl reload-or-restart name.service
重載或條件式重啓服務:
systemctl reload-or-try-restart name.service
禁止自動和手動啓動:
systemctl mask name.service
取消禁止:
systemctl unmask name.service
服務查看
查看某服務當前激活與否的狀態:
systemctl is-active name.service
查看所有已經激活的服務:
systemctl list-units --type|-t service
查看所有服務:
systemctl list-units --type service –all|-a
chkconfig命令的對應關係:
設定某服務開機自啓:
chkconfig name on ==> systemctl enable name.service
設定某服務開機禁止啓動:
chkconfig name off ==> systemctl disable name.service
查看所有服務的開機自啓狀態:
chkconfig --list ==> systemctl list-unit-files --type service
用來列出該服務在哪些運行級別下啓用和禁用
chkconfig sshd --list ==> ls /etc/systemd/system/*.wants/sshd.service
查看服務是否開機自啓:
systemctl is-enabled name.service
其它命令:
查看服務的依賴關係:
systemctl list-dependencies name.service
殺掉進程:
systemctl kill 進程名
服務狀態
systemctl list-units --type service --all顯示狀態
各項所代表的意思:
loaded:Unit配置文件已處理
active(running):一次或多次持續處理的運行
active(exited):成功完成一次性的配置
active(waiting):運行中,等待一個事件
inactive:不運行
enabled:開機啓動
disabled:開機不啓動
static:開機不啓動,但可被另一個啓用的服務激活
systemctl命令示例:
顯示所有單元狀態
# systemctl
# systemctl list-unit
只顯示服務單元的狀態
# systemctl --type=service
顯示sshd服務單元
# systemctl status sshd.service –l
驗證sshd服務當前是否活動
# systemctl is-active sshd
啓動,停止和重啓sshd服務
# systemctl start sshd.service
# systemctl stop sshd.service
# systemctl restart sshd.service
重新加載配置
# systemctl reload sshd.service
列出活動狀態的所有服務單元
# systemctl list-units --type=service
列出所有服務單元
# systemctl list-units --type=service --all
查看服務單元的啓用和禁用狀態。
# systemctl list-unit-files --type=service
列出失敗的服務
# systemctl --failed --type=service
列出依賴的單元
# systemctl list-dependencies sshd
驗證sshd服務是否開機啓動
# systemctl is-enabled sshd
禁用network,使之不能自動啓動,但手動可以
# systemclt disable network
啓用network
# systemctl enable network
禁用network,使之不能手動或自動啓動
# systemclt mask network
啓用network
# systemctl umask network
運行級別
target units:
unit配置文件:.target
# ls /usr/lib/systemd/system/*.target # systemctl list-unit-files --type target --all
運行級別對照:
SysV啓動級別 | Systemd目標 | 註釋 |
0 | runlevel0.target, poweroff.target | 關機 |
1,s,single | runlevel1.target, rescue.target | 單用戶模式 |
2 | runlevel2.target, multi-user.target | 用戶自定義的啓動級別(默認爲3) |
3 | unlevel3.target, multi-user.target | 多用戶,無圖形界面,用戶可通過中端或網絡登錄 |
4 | runlevel4.target, multi-user.target | 用戶自定義啓動級別(默認爲3) |
5 | runlevel5.target, graphical.target | 多用戶,有圖形界面,繼承級別3的服務,依賴於級別3,並啓動圖形界面服務 |
6 | runlevel6.target, reboot.target | 重啓 |
emergency | emergenty.target | 救援模式(Emergency shell) |
查看依賴性:
# systemctl list-dependencies graphical.target
早期linux版本中,是使用init N(N爲運行級別)進行切換,但systemd中,啓動級別通過“目標單元”訪問。通過如下命令進行切換:
級別切換:
init N ==> systemctl isolate name.target
# systemctl isolate multi-user.target
注:只有/lib/systemd/system/*.target 文件中AllowIsolate=yes 才能切換(修改文件需
執行systemctl daemon-reload才能生效)
查看target:
[root@CentOS 7 ~]# runlevel N 3 [root@CentOS 7 ~]# who -r run-level 3 2016-09-23 08:41 [root@CentOS 7 ~]# systemctl list-units --type target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes ...
獲取默認運行級別:
早期版本無論是查看默認運行級別,還是修改默認級別都是通過查看或編輯“/etv/inittab”文件,但是在7版本中,有了一些改變。
# /etc/inittab ==> systemctl get-default
修改默認級別:
# /etc/inittab ==> systemctl set-default name.target
# systemctl set-default multi-user.target
# ls –l /etc/systemd/system/default.target
切換至緊急救援模式:
# systemctl rescue
切換至emergency模式:
# systemctl emergency
其它常用命令:
傳統命令init,poweroff,halt,reboot都成爲systemctl的軟鏈接
關機:systemctl halt、systemctl poweroff
重啓:systemctl reboot
掛起:systemctl suspend
休眠:systemctl hibernate
休眠並掛起:systemctl hybrid-sleep
CentOS7引導順序:
UEFi或BIOS初始化,運行POST開機自檢
選擇啓動設備
引導裝載程序, centos7是grub2
加載裝載程序的配置文件:(/etc/grub.d/ 、etc/default/grub爲模板配置文件 )/boot/grub2/grub.cfg爲真正的配置文件,不建議直接修改
加載initramfs驅動模塊
加載內核選項
內核初始化,centos7使用systemd代替init
執行initrd.target所有單元,包括掛載/etc/fstab
從initramfs根文件系統切換到磁盤根目錄
systemd執行默認target配置,配置文件/etc/systemd/default.target /etc/systemd/system/
systemd執行sysinit.target初始化系統及basic.target準備操作系統
systemd啓動multi-user.target下的本機與服務器服務
systemd執行multi-user.target下的/etc/rc.d/rc.local
Systemd執行multi-user.target下的getty.target及登入服務
systemd執行graphical需要的服務
service unit文件格式:
/etc/systemd/system:系統管理員和用戶使用
/usr/lib/systemd/system:發行版打包者使用
以“#” 開頭的行後面的內容會被認爲是註釋
相關布爾值,1、yes、on、true 都是開啓,0、no、off、false 都是關閉。
時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等請顯式說明
service unit file文件通常由三部分組成:
[Unit]:定義與Unit類型無關的通用選項;用於提供unit的描述信息、unit行爲及依賴關係等
[Service]:與特定類型相關的專用選項;此處爲Service類型
[Install]:定義由“systemctl enable”以及"systemctl disable“命令在實現服務啓用或禁用時用到的一些選項
示例:
ssh服務的service文件:/usr/lib/systemd/system/sshd.service
Unit段的常用選項:
Description:描述信息
After:定義unit的啓動次序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit即無法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的衝突關係
Service段的常用選項:
Type:定義影響ExecStart及相關參數的功能的unit進程啓動類型
simple:默認值,這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中
forking:由ExecStart啓動的程序透過spawns延伸出其他子程序來作爲此daemon的主要服務。原生父程序在啓動結束後就會終止
oneshot:與simple類似,不過這個程序在工作完畢後就結束了,不會常駐在內存中
dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱後,纔會繼續運作.因此通常也要同時設定BusNname= 才行
notify:在啓動完成後會發送一個通知消息。還需要配合NotifyAccess 來讓Systemd 接收消息
idle:與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢後纔會執行。這類的daemon通常是開機到最後才執行即可的服務
EnvironmentFile:環境配置文件
ExecStart:指明啓動unit要運行命令或腳本的絕對路徑
ExecStartPre:ExecStart前運行
ExecStartPost:ExecStart後運行
ExecStop:指明停止unit要運行的命令或腳本
Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啓動此服務
Install段的常用選項:
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務
注意:對於新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而後可以選擇重啓
# systemctl daemon-reload
服務Unit文件示例:
# vim /testdir/bak.sh tar -Jcf /testdir/etc`date +%F`.tar.xz /etc/ &> /dev/null
# chmod +x /testdir/bak.sh
# 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 # systemctl start bak.service # ls /testdir/ bak.sh etc2016-09-24.tar.xz
設置內核參數:
設置內核參數,隻影響當次啓動
啓動時,在linux16行後添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=recure.target
recure.target 比emergency 支持更多的功能,例如日誌等
示例:
如圖所示情況下鍵入e,進入內核編輯模式
找到linux16這一行,在後面添加想要進入的模式,如圖是進入圖形模式,添加完成後,按Ctrl和x鍵啓動
啓動排錯:
文件系統損壞
先嚐試自動修復,失敗則進入emergency shell,提示用戶修復
在/etc/fstab不存在對應的設備和UUID
等一段時間,如不可用,進入emergency shell
在/etc/fstab不存在對應掛載點
systemd嘗試創建掛載點,否則提示進入emergency shell.
在/etc/fstab不正確的掛載選項
提示進入emergency shell
破解root口令:
啓動時任意鍵暫停啓動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啓動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
修復GRUB2:
GRUB“the Grand Unified Bootloader”
引導提示時可以使用命令行界面
可從文件系統引導
主要配置文件/boot/grub2/grub.cfg
修復配置文件
# grub2-mkconfig > /boot/grub2/grub.cfg
修復grub
在BIOS環境使用命令: grub2-install /dev/sda
在UEFI環境使用命令: grub2-install