一、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