systemd 簡介:php
systemd 是一個 Linux 系統基礎組件的集合, 提供了一個系統和服務管理器, 運行爲 PID 1 並負責啓動其它程序 功能包括: 一、支持並行化任務 二、同時採用 socket 與 D-Bus 總線激活服務 三、按需啓動守護進程(daemon), 利用 Linux 的 cgroups 監視進程 四、支持快照和系統恢復, 維護掛載點和自動掛載點, 各服務間基於依賴關係進行精密控制 五、支持 SysV 和 LSB 初始腳本, 能夠替代 sysvinit 六、日誌進程、控制基礎系統配置, 維護登錄用戶列表以及系統帳戶、運行時目錄和設置 七、運行容器和虛擬機, 能夠簡單的管理網絡配置、網絡時間同步、日誌轉發和名稱解析等
systemd 和 init:html
centos7 之前, centos 的啓動一直採用 init 的啓動方式 可是這種方式有兩種缺點: 一、啓動時間長, init 是串行啓動, 只有前一個進程啓動完, 纔會啓動下一個進程 二、啓動腳本複雜, init 進程只是執行啓動腳本, 無論其餘事情, 腳本須要本身處理各類狀況, 這每每使得腳本變得很長 systemd 就是爲了解決 init 的問題而誕生的一種新型的啓動方式 一、systemd 按需啓動服務, 儘可能減小系統資源消耗 二、儘量並行啓動進程, 減小系統啓動等待時間 systemd 儘管解決了 init 所留下的問題, 可是其也產生了新的問題 一、其最注意的問題之一就是體系龐大, 很是複雜。與操做系統的其餘部分強耦合, 違反了 unix 的哲學 keep simple, keep stupid 二、在 centos 目前的版本中, systemd 的 bug 較多
Unit 管理:python
systemd 能夠管理全部系統資源。不一樣的資源統稱爲 Unit Unit 一共分紅12種: Service unit 系統服務 Target unit 啓動組 Device Unit 系統設備 Mount Unit 掛載點 Automount Unit 自動掛載點 Path Unit 文件路徑 Scope Unit 不是由 Systemd 啓動的外部進程 Slice Unit 進程組 Snapshot Unit systemd 快照 Socket Unit 進程間通訊的 socket Swap Unit 交換分區 Timer Unit 由 systemd 管理的計時器 Unit 管理命令: # 啓動一個 Unit systemctl start UNIT_NAME # 中止一個 Unit systemctl stop UNIT_NAME # 殺死一個 Unit systemctl kill UNIT_NAME # 重啓一個 Unit systemctl restart UNIT_NAME # 從新加載 Unit 配置文件 systemctl reload UNIT_NAME # 查看 Unit 狀態 systemctl status UNIT_NAME # 檢查 Unit 是否爲開機自啓動 systemctl is-enabled UNIT_NAME # 檢查 Unit 是否處於運行狀態 systemctl is-active UNIT_NAME # 檢查 Unit 是否處於啓動失敗狀態 systemctl is-failed UNIT_NAME # 將 Unit 設置爲開機自啓動 systemctl enable UNIT_NAME # 取消 Unit 的開機自啓動 systemctl disable UNIT_NAME # 禁用 Unit systemctl mask UNIT_NAME # 取消禁用 systemctl unmask UNIT_NAME # 查看 Unit 幫助信息(由 Unit 文件提供) systemctl help UNIT_NAME # 從新載入 systemd 系統配置, 掃描 Unit 文件的變更 systemctl daemon-reload UNIT_NAME # 列出正在運行的 Unit systemctl list-units # 列出全部 Unit,包括沒有找到配置文件的或者啓動失敗的 systemctl list-units --all # 列出全部沒有運行的 Unit systemctl list-units --all --state=inactive # 列出全部加載失敗的 Unit systemctl list-units --failed # 列出全部正在運行的、類型爲 service 的 Unit systemctl list-units --type=service # 顯示系統狀態 systemctl status # 顯示一個 Unit 的全部底層參數 systemctl show UNIT_NAME # 顯示一個 Unit 的指定屬性的值 systemctl show -p ATTR UNIT_NAME # 設置一個 Unit 的指定屬性 sudo systemctl set-property UNIT_NAME ATTR=VALUE # 列出一個 Unit 的全部依賴(--all 展開 target) systemctl list-dependencies --all UNIT_NAME
電源管理:linux
# 重啓 systemctl reboot # 關閉電源 systemctl poweroff # 待機 systemctl suspend # 休眠 systemctl hibernate # 混合休眠模式(同時休眠到硬盤並待機) systemctl hybrid-sleep
Unit 配置文件:shell
每個 Unit 都有一個配置文件, 告訴 Systemd 怎麼啓動這個 Unit systemd 默認從 /etc/systemd/system/ 讀取配置文件 可是 /etc/systemd/system/ 裏面存放的大部分文件都是符號連接, 指向 /usr/lib/systemd/system/ 真正的配置文件通常都存放在這個目錄 systemctl enable 命令用於在上面兩個目錄之間, 創建符號連接關係 systemctl disable 命令用於在上面兩個目錄之間, 取消符號連接關係 默認狀況下, Unit 配置文件的後綴應該等於 Unit 的種類, 好比 sshd.socket。若是省略 systemd 默認後綴名爲 .service, 因此 sshd 會被理解成 sshd.service # 列出全部配置文件 systemctl list-unit-files # 列出指定類型的配置文件 systemctl list-unit-files --type=service systemctl list-unit-files 命令會輸出一個文件列表, 該列表有兩列 UNIT FILE 和 STATE UNIT FILE 爲 配置文件的名稱, STATE 爲該 UNIT 的狀態 STATE 一共有 4 種狀態: enabled 已創建啓動連接 disabled 沒有創建啓動連接 static 該配置文件沒有 [Install] 部分(沒法執行), 只能做爲其餘配置文件的依賴 masked 該配置文件被禁止創建啓動連接 配置文件格式: # 查看 sshd.service 的配置文件 systemctl cat sshd # 編輯 sshd.service 配置文件 systemctl edit --full sshd.service Unit 配置文件分爲多個區塊, 每一個區塊的第一行, 是用方括號表示的區塊名(section), Unit 配置文件嚴格區分大小寫 Unit 配置文件區塊字段: [Unit] 區塊一般是配置文件的第一個區塊, 用來定義 Unit 的元數據, 以及配置與其餘 Unit 的關係, 它的主要字段以下: Description 簡短描述 Documentation 文檔地址 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 運行必須知足的條件, 不然會報啓動失敗 [Install] 區塊一般是配置文件的最後一個區塊, 用來定義如何啓動, 以及是否開機啓動, 它的主要字段以下: WantedBy 它的值是一個或多個 Target, 當前 Unit 激活時(enable) 符號連接會放入 /etc/systemd/system/ 中以 Target 名 + .wants 構成的目錄中 RequiredBy 它的值是一個或多個 Target, 當前 Unit 激活時(enable) 符號連接會放入 /etc/systemd/system/ 中以 Target 名 + .required 構成的目錄中 Alias 當前 Unit 可用於啓動的別名 Also 當前 Unit 激活(enable) 時, 會被同時激活的其餘 Unit [Service] 區塊用來設置 Service 的配置, 只有 Service 類型的 Unit 纔有這個區塊, 它的主要字段以下: Type 定義啓動時的進程行爲。它有如下幾種值。 Type=simple 默認值, 執行 ExecStart 指定的命令, 啓動主進程, 服務進程不會 fork。若是該服務要啓動其餘服務, 不要使用此類型啓動 Type=forking 以 fork 方式從父進程建立子進程, 建立後父進程會當即退出, 使用此類型啓動時應指定 PIDFile= 以便 systemd 跟蹤服務的主進程 Type=oneshot 這一選項適用於只執行一項任務、隨後當即退出的服務。可能須要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出以後仍然認爲服務處於激活狀態 Type=notify 與 Type=simple 相同,但服務會在就緒後向 systemd 發送一個信號。這一通知的實現由 libsystemd-daemon.so 提供 Type=dbus 使用 D-Bus 啓動 Type=idle systemd 會等待全部任務處理完成後, 纔開始執行 idle 類型的單元。其餘行爲與 Type=simple 相似 ExecStart 啓動當前服務的命令 ExecStartPre 啓動當前服務以前執行的命令 ExecStartPost 啓動當前服務以後執行的命令 ExecReload 重啓當前服務時執行的命令 ExecStop 中止當前服務時執行的命令 ExecStopPost 中止當其服務以後執行的命令 RestartSec 自動重啓當前服務間隔的秒數 Restart 定義何種狀況下 systemd 會嘗試重啓當前服務 no 默認值, 不會嘗試重啓當前服務 always 老是重啓 on-success 服務進程正常退出時纔會重啓(退出狀態碼爲 0) on-failure 當服務進程以非 0 退出狀態碼退出時纔會重啓 on-abnormal 當一個信號(包括核心轉儲,不包括SIGHUP, SIGINT, SIGTERM 或 SIGPIPE), 操做超時或觸發看門狗超時終止進程時, 服務將從新啓動 on-abort 當服務進程因發送非指定的信號而退出時, 纔會從新啓動服務 on-watchdog 當服務的看門狗進程超時時, 纔會從新啓動該服務 # Restart 值的對應關係(參考: https://www.freedesktop.org/software/systemd/man/systemd.service.html) Restart settings/Exit causes no always on-success on-failure on-abnormal on-abort on-watchdog Clean exit code or signal X X Unclean exit code X X Unclean signal X X X X Timeout X X X Watchdog X X X X TimeoutSec 定義 systemd 中止當前服務以前等待的秒數 Environment 指定環境變量 示例:(centos7 httpd) [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target # 一旦修改配置文件, 就要讓 systemd 從新加載配置文件, 而後從新啓動, 不然修改不會生效 systemctl daemon-reload systemctl restart UNIT_NAME
Target:apache
運行級別(runlevel)是一箇舊的概念, systemd 引入了一個和運行級別功能類似又不一樣的概念--目標(target) 不像數字表示的啓動級別, 每一個目標都有名字和獨特的功能, 而且能同時啓用多個 一些目標繼承其餘目標的服務, 並啓動新服務。systemd 提供了一些模仿 sysvinit 運行級別的目標, 仍可使用舊的 telinit 運行級別 命令切換 target 管理命令: # 查看當前系統的全部 Target $ systemctl list-unit-files --type=target # 查看一個 Target 包含的全部 Unit $ systemctl list-dependencies multi-user.target # 查看啓動時的默認 Target $ systemctl get-default # 設置啓動時的默認 Target $ sudo systemctl set-default multi-user.target # 切換 Target, 該命令僅更改當前運行目標, 對下次啓動無影響 $ sudo systemctl isolate multi-user.target SysV 運行級別" 與 "systemd target" 對照表 SysV 運行級別 Systemd target 註釋 0 runlevel0.target, poweroff.target 中斷系統 1 runlevel1.target, rescue.target 單用戶模式 2, 4 runlevel2.target, runlevel4.target, multi-user.target 用戶自定義運行級別, 一般識別爲級別3 3 runlevel3.target, multi-user.target 多用戶, 無圖形界面。用戶能夠經過終端或網絡登陸 5 runlevel5.target, graphical.target 多用戶, 圖形界面。繼承級別3的服務, 並啓動圖形界面服務 6 runlevel6.target, reboot.target 重啓 emergency emergency.target 急救模式(Emergency shell) systemd 和 SysV 的區別: 一、默認的 RunLevel 在 /etc/inittab 文件設置, 被默認的 Target 取代, 位置是 /etc/systemd/system/default.target 一般符號連接到 graphical.target(圖形界面) 或者 multi-user.target (多用戶命令行) 二、啓動腳本的位置, 之前是 /etc/init.d 目錄, 符號連接到不一樣的 RunLevel 目錄 (好比/etc/rc3.d、/etc/rc5.d等) 如今則存放在 /lib/systemd/system 和 /etc/systemd/system 目錄 三、配置文件的位置, 之前 init 進程的配置文件是 /etc/inittab, 各類服務的配置文件存放在 /etc/sysconfig 目錄 如今的配置文件主要存放在 /lib/systemd 目錄, 在/etc/systemd目錄裏面的修改能夠覆蓋原始設置。
參考: centos
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html網絡