systemd

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 單元

  1. [unit] 部分選項 單元配置文件可以包含 [unit], 攜帶關不不依賴於單元類型的一般信息:
  • Description:

    • 簡短的描述
  • Documentation:

    • 文檔地址
    • 以空格分割 URI 列表, 引用 單元或其配置的文檔, 接受的是 http://, https://, file:, info:, man:, 類型的URI, 可以配置多個.
  • Requires:

    • 當 unit 依賴的其他unit, 如果沒有運行, 當前 Unit會啓動失敗
  • requisite:

    • 類似於 Requests=, 但是不過此處列的單位未啓動, 則不會啓動他們, 並且此單元的啓動將立即失敗 Requisite 並不會排序依賴,
  • Wants:

    • 當前 Unit 配合其他 Unit, 如果沒有運行, 當前Unit 不會啓動失敗
  • Before=,

    • 如果該字段指定給你 Unit, 必須在當前 Unit 啓動之後
  • After=:

    • 如果該字段指定的 Unit, 必須在當前 Unit 啓動之前啓動
  1. intall 部分選項
  • Alias=

    • 用於設置當前的 Unit 的啓動別名
  • WantedBy=, RequiredBy:

    • 它的值一個或多個 Target, 當前 Unit 激活時 (enable) 符號鏈接會放入 /etc/systemd/system 目錄下, 以Target 名稱+ .wants 或 .required 後綴構成子目錄
  • Also=:

    • 當前 Unit 激活時, 會被同時激活其他 Unit
  1. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章