1. 什麼是systemd
systemd 是linux系統的基礎組件合集, 提供了一個系統和服務的管理器, 運行的PID 爲1 負責啓動和管理其他進程, 支持並行化任務, 採用socket式和 D-Bus 總線激活方式, 按需啓動守護進程(daemon) 利用Linux 的cgroups 近視進程, 支持快照和系統恢復, 維護掛載點, 各服務間依賴關係的精確控制, systemd 支持 SysV 和 LSB 初始腳本, 除此之外, 還包含本了日誌進程, 控制基礎系統配置, 維護登陸用戶列表, 以及系統賬戶,運行時目錄的設置 等等操作.
2. systemd的基本工具
- systemd 提供了一個用於監視和管理控制的 工具
systectl
用於查看系統狀態和管理系統及服務.
2.1 常用查看操作
-
顯示系統狀態
systemctl status
-
輸出已激活的單元(unit)
systemctl
或者systemctl list-units
-
顯示運行失敗的單元
systemctl --failed
3. systemd 中的 單元(unit)
3.1 概述
- systemd中一個單元文件可以是: 系統服務(.service), 掛載點(.mount), socket(.sockets), 系統設備(.device), 交換分區(.swap), 文件路徑(.path), 啓動目標(.target), 由systemd 管理的計時器(.timer)
3.1 單元配置文件位置
/etc/systemd/system/*
/usr/lib/systemd/system/*
/run/systemd/system/*
3.3 單元操作
-
啓動單元
systemctl start <unit>
-
停止單元
systemctl stop <unit>
-
查看狀態
systemctl status <unit>
-
重啓單元
systemctl restart <unit>
-
重載配置
systemctl reload <unit>
-
設置自啓動
systemctl enable <unit>
-
取消自啓動
systemctl disable <unit>
-
禁用單元
systemctl mask <unit>
-
取消禁用
systemctl unmask <unit>
3.4 電源管理
-
重啓
systemctl reboot
-
關閉電源
systemctl poweroff
-
待機
systemctl suspend
4. unit 單元文件
systemd 單元文件的語法是源於 XDG桌面配置文件 .desktop
最初源頭是 windows 的.ini
文件 , 單元文件可以從多個地方加載.
- 查看加載文件的優先級(從低到高)
systemctl show --property=UnitPath
4.0 配置文件
-
查看所有配置文件
systemclt list-unit-files
-
配置文件風格
[Unit]
# 該段用於配置unit 可以填寫區域名, 字段名,
[Service]
# 用於配置服務相關的配置
[Intall]
# 定義服務如何啓動
4.1 unit 單元
[unit]
部分選項 單元配置文件可以包含[unit]
, 攜帶關不不依賴於單元類型的一般信息:
-
Description
:- 簡短的描述
-
Documentation
:- 文檔地址
- 以空格分割 URI 列表, 引用 單元或其配置的文檔, 接受的是
http://
,https://
,file:
,info:
,man:
, 類型的URI, 可以配置多個.
-
Requires
:- 當 unit 依賴的其他unit, 如果沒有運行, 當前 Unit會啓動失敗
-
requisite
:- 類似於 Requests=, 但是不過此處列的單位未啓動, 則不會啓動他們, 並且此單元的啓動將立即失敗
Requisite
並不會排序依賴,
- 類似於 Requests=, 但是不過此處列的單位未啓動, 則不會啓動他們, 並且此單元的啓動將立即失敗
-
Wants
:- 當前 Unit 配合其他 Unit, 如果沒有運行, 當前Unit 不會啓動失敗
-
Before=
,- 如果該字段指定給你 Unit, 必須在當前 Unit 啓動之後
-
After=
:- 如果該字段指定的 Unit, 必須在當前 Unit 啓動之前啓動
intall
部分選項
-
Alias=
- 用於設置當前的 Unit 的啓動別名
-
WantedBy=
,RequiredBy
:- 它的值一個或多個 Target, 當前 Unit 激活時 (enable) 符號鏈接會放入 /etc/systemd/system 目錄下, 以Target 名稱+ .wants 或 .required 後綴構成子目錄
-
Also=
:- 當前 Unit 激活時, 會被同時激活其他 Unit
Service
部分選項
-
Type=
:- 定義啓動時的進程行爲, 必須設置爲 simple, forking, oneshot, dbus, notify, idle中.
- simple:
- 默認值, 執行 ExecStart指令的命令, 啓動主進程
- forking:
- 以 fork 方式從父進程創建子進程, 創建後 父進程會退出
- oneshot:
- 一次性的進程,執行完之後會推出
- dbus:
- 當服務通過 D-Bus 啓動
- notify:
- 該服務啓動完畢, 會通知 system 再繼續往下執行
- idle:
- 與simple 類似, 不同的是 其他任務執行完畢, 當前服務纔會執行
-
PIDFile=
:- 守護進程的PID 文件, 必須是絕對路徑, Type=Forking 中必須設置, systemd 將會在該服務啓動後 從問你件中讀取主動守護的PID, systemd 不會希爾該文件, 在服務停止後刪除
-
BusName
:- 設置該服務通信使用的 D-Bus 名稱, 在Type=dbus 時, 必須設置該項
-
ExecStart
:- 啓動該服務需要執行的命令(命令+參數) 除了
Type=oneshot
, 都是需要設置ExecStart=
. - 命令必須是絕對路徑表示的可執行的文件, 可以添加參數, 也可以使用不同前綴.
- 前綴:
- @: 如果前綴加上了 @, 後面參數會依次 傳遞給被執行的進程
- -: 如果前綴加上了 -, 表示該進程如果以失敗狀態(非0) 退出, 也會被視爲成功執行
- +: 前綴加上了 +, 該進程擁有完全的權限(超級管理員), 並且User=, Group=..所有設置的權限限制以及 PrivateDevices=, PrivateTmp= 等文件習題歐冠呢名字空間配置, 該命令
- +: 和+ 相似, 不同於會忽略 User=, Group=, SupplementtaryGroups= 選項的設置, 字符空間之類, 其他限制有效, 與 DynamicUser= 一起使用, 會執行明林之前 user/gorup 後將身份憑證切換操作.
- 啓動該服務需要執行的命令(命令+參數) 除了
-
ExecStartPre=
,ExecStartPost=
:- 設置 執行 ExecStart= 之前執行命令, 語法和 ExecStart 相同, 如果設置了多個命令, 順序受到單元文件執行順序.
-
ExecReload=
:- 可選的執行, 用於設置該服務要求重新啓動的 配置是執行的命令行, 語法和 ExecStart 相同.
-
ExecStop
:- 設置用於停止該服務的指令,
-
ExecStopPost
:- 設置停止服務後執行的命令.
-
RestartSec
:- 設置重啓服務停止多長時間, 默認100ms,
-
TimeoutStartSec=
:- 服務停止多長時間, 如果該服務未能在規定時間內, 發出"啓動完成", 指令表示啓動失敗, 並且會被關閉.
-
TimoutStopSec=
:- 服務關閉的最大等待時間, 如果規定時間內沒有收到成功停止信號, 會被強制使用 SIGTERM 信號關閉.
-
TimeoutSec
:- 同時設置 TimeoutStartSec 和 TimeoutStopSec 連個
-
Reset=
:- 服務進程正常退出, 異常退出, 被殺死, 超時, 是否重啓, 這裏的服務進程指的是
ExecStartPre=
,ExecStartPre=
,ExecStart
- 可選:
- no: 不重啓
- on-success: 正常退出會重啓
- on-failure: 異常退出會重啓
- on-abnormal: 被強制殺死和 超時時會重啓
- on-about: 被強制殺死會重啓
- on-watchdog: 看門狗檢測時重啓
- 服務進程正常退出, 異常退出, 被殺死, 超時, 是否重啓, 這裏的服務進程指的是
-
Sockets=
:- 設置一個 sockets 單元名稱, 服務啓動時 套接字
4. Target
啓動計算機室需要啓動大量的 Unit, 如果每一次啓動, 都明確本次啓動需要哪些 Unit, 顯示不方便, Systemd 解決方案就是 Target.
-
簡單說, Target 就是一個 Unit組, 包含狠毒哦Unit, 啓動某個 Target 的時候, Systemd 就會啓動裏面所有的 Unit. Target 概念類似狀態點, 啓動某個target 就類似於系統某個狀態.
-
傳統的 init 啓動模式裏面的, RunLevel 概念, 和Target 作用很類似, 不同的是 RunLevel 互斥, 不可能有多個RunLevel 同時啓動, 多個Target 可以同時啓動
-
查看當前所有的 Target systemctl list-unit-files --type=target
-
查看一個 Target 包含所有 Unit systemctl list-dependencies multi-user.target
-
查看啓動時的默認Target systemctl get-default
-
設置啓動默認的 target systemctl set-default multi-user.target
-
切換Target 默認不會關閉前一個 Target systemctl isolate TARGET
END