一、systemd的由來與特性 1、歷史由來 從CentOS 7系列開始,redhat正式將systemd用於系統管理,來取代CentOS 5的sysV init和CentOS 6的upstart體系;較之之前,systemd為linux系統提供了啟動與管理的一整套解決方案;下圖為systemd框架 ...
一、systemd的由來與特性
1、歷史由來
從CentOS 7系列開始,redhat正式將systemd用於系統管理,來取代CentOS 5的sysV init和CentOS 6的upstart體系;較之之前,systemd為linux系統提供了啟動與管理的一整套解決方案;下圖為systemd框架圖,見圖可知,功能甚為強大。
2、systemd的新特性
1. 系統啟動時服務並行啟動;
2. 按需激活進程,節約資源;
3. 系統快照功能,下次啟動時可恢復至某一次快照時狀態;
4. 基於依賴關係定義服務控制邏輯;
二、system的unit
1、何為unit
unit是對配置文件進行標識和配置:文件中主要包含了系統服務,監聽socket,保存的系統快照以及其他與init相關的信息
2、unit在系統中的路徑
軟體包安裝的系統單元:/usr/lib/systemd/system
運行時配置的系統單元:/run/systemd/system
本地配置的系統單元:/etc/systemd/system
3、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
Timer unit:用於管理計劃任務,文件擴展名為.timer
Slice unit:用於資源管理,文件擴展名為.slice
Scope unit:用於外部創建的進程,文件擴展名為.scope
4、各unit取代的傳統服務
/etc/rc.d/init.d/ --> service unit
init LEVEL --> target unit
/etc/fstab --> mount unit
autofs service --> automount unit
atd,crond --> timer unit**
5、unit的配置文件
5.1、概述
systemd在管理unit時,會預設從本地配置/etc/systemd/system目錄中讀取配置文件;但是,本地配置目錄中的大多數配置文件都是鏈接/usr/lib/systemd/system中的文件。
ln -s /usr/lib/systemd/system/name.service /etc/systemd/system/name.service實現的就是上面的過程;
其等同於:systemctl enable name.service,激活開機啟動
反之:systemctl disable name.service 關閉開機啟動
5.2、配置文件
修改配置文件,可以直接 vim /usr/lib/systemd/system/name.service修改;
查看配置文件,systemctl cat name.service
#/usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
5.3、配置文件區塊
[unit] 定義unit的元數據以及與其他unit之間的關係
Description:簡短描述
Documentation:man文檔地址
Requires:強依賴關係,當前 Unit 依賴的其他 Unit,如果它們沒有運行,當前 Unit 會啟動失敗
Wants:弱依賴關係,與當前 Unit 配合的其他 Unit,如果它們沒有運行,當前 Unit 不會啟動失敗
BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行
Before:如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之後啟動
After:如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之前啟動
Conflicts:這裡指定的 Unit 不能與當前 Unit 同時運行
Condition...:當前 Unit 運行必須滿足的條件,否則不會運行
Assert...:當前 Unit 運行必須滿足的條件,否則會報啟動失敗
[service] service unit的配置,只有service類型才有
Type:定義啟動時的進程行為,它有以下幾種值
Type=simple:預設值,執行ExecStart指定的命令,啟動主進程
Type=forking:以 fork 方式從父進程創建子進程,創建後父進程會立即退出
Type=oneshot:一次性進程,Systemd 會等當前服務退出,再繼續往下執行
Type=dbus:當前服務通過D-Bus啟動
Type=notify:當前服務啟動完畢,會通知Systemd,再繼續往下執行
Type=idle:若有其他任務執行完畢,當前服務才會運行
ExecStart:啟動當前服務的命令
ExecStartPre:啟動當前服務之前執行的命令
ExecStartPost:啟動當前服務之後執行的命令
ExecReload:重啟當前服務時執行的命令
ExecStop:停止當前服務時執行的命令
ExecStopPost:停止當其服務之後執行的命令
RestartSec:自動重啟當前服務間隔的秒數
Restart:定義何種情況 Systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
Environment:指定環境變數
[install] 定義如何啟動,以及是否開機啟動
WantedBy:可以是一個或多個Target,當前unit enable時,符號鏈接會放入/etc/systemd/system/TARGET.wants目錄下
RequiredBy:可以是一個或多個Target,當前unit enable時,符號鏈接會放入/etc/systemd/system/TARGET.requires目錄下
Alias:別名
Also:當前 Unit enable 時,會被同時激活的其他 Unit
三、 systemd的關鍵特性
1、基於socket的激活機制
systemd為支持此機制的服務監聽socket,當有客戶端與socket通信時,由systemd激活服務,應答客戶端的請求;這種機制類似於守護進程。
2、基於bus的激活機制
基於匯流排的激活
3、基於device的激活機制
當有設備接入時,systemd會自動激活device、mount、automount等unit來識別,掛載接入的設備
4、基於path的激活機制
當某個文件路徑變得可用時或路徑出現相應文件時,激活對應服務
5、系統快照機制
保存各unit的當前狀態信息到持久存儲中,在下次開機時可恢復之前某次快照時的系統狀態,必要時可自動載入
6、向後相容
相容CentOS 5的sysV init以及CentOS 6的upstart機制,也就是說可以繼續將服務管理腳本放入/etc/rc.d/init.d目錄中管理
四、systemd與sysV init 以及upstart不相容之處
1、/etc/rc.d/init.d目錄中的服務管理腳本不可以用systemctl命令來管理,systemctl命令的參數已經固定
2、/etc/rc.d/init.d目錄中的服務管理腳本啟動的服務,與systemd管理啟動的進程之間無法通信
3、systemd雖然模擬出run level,但是與init、upstart機制的運行級別不完全一致
五、Service unit
1、系統服務新老機制對應
啟動:service name start ==> systemctl start name.service
停止:service name stop ==> systemctl stop name.service
重啟:service name restart ==> systemctl restart name.service
狀態:service name startus ==> systemctl startus name.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 service
查看所有服務:systemctl list-units --type service --all
2、chkconfig命令的對應關係
設定某服務開機自啟:chkconfig name on ==> systemctl enable name.service
禁止:chkconfig name off ==> systemctl disable name.service
查看所有服務的開機自啟狀態:chkconfig --list ==> systemctl list-unit-file --type service
查看服務是否開機自啟:systemctl is-enable name.service
查看服務的依賴關係:systemctl list-dependencies name.service
六、target unit
1、運行級別:
0 ==> runlevel0.target,poweoff.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
2、級別切換:init N ==> systemctl isolate name.target
3、查看級別:runlevel ==> systemctl list-units --type target
4、獲取預設運行級別:/etc/initab ==> systemctl get-default
5、修改預設級別:/etc/initab ==> systemctl set-default name.target
6、切換至緊急救援模式:systemctl rescue
7、切換至emergency模式:systemctl emergency
七、其他常用命令
1、系統開關機及快照
關機:systemctl halt,systemctl poweroff
重啟:systemctl reboot
掛起:systemctl suspend
快照:systemctl hibernate
快照並掛起:systemctl hybrid-sleep
關閉進程:systemctl kill
2、主機名
更改主機名:hostnamectl set-hostname iie-test
查看主機名:hostnamectl status