Scroll to navigation

SYSTEMD(1) systemd SYSTEMD(1)

NAME

systemd, init - systemd 系統與服務管理器

SYNOPSIS

systemd [OPTIONS...]

init [OPTIONS...] {COMMAND}

描述

systemd 是一個專用於 Linux 操作系統的系統與服務管理器。 當作爲啓動進程(PID=1)運行時,它將作爲初始化系統運行, 也就是啓動並維護各種用戶空間的服務。

爲了與傳統的 SysV 兼容,如果將 systemd 以 init 名稱啓動,並且"PID≠1",那麼它將執行 telinit 命令並將所有命令行參數原封不動的傳遞過去。 這樣對於普通的登陸會話來說,無論是調用 init 還是調用 telinit 都是等價的。 詳見 telinit(8) 手冊。

當作爲系統實例運行時, systemd 將會按照 system.conf 配置文件 以及 system.conf.d 配置目錄中的指令工作; 當作爲用戶實例運行時,systemd 將會按照 user.conf 配置文件 以及 user.conf.d 配置目錄中的指令工作。詳見 systemd-system.conf(5) 手冊。

選項

能夠識別的命令行選項如下:

--test

檢測並輸出啓動序列,然後退出。 僅用於調試目的。

--dump-configuration-items

輸出一個單元(unit)列表。 此列表簡明且完整的列出了 所有單元文件中定義的"unit"。

--unit=

設置啓動時默認啓動的單元(unit)。 默認值是 default.target

--system, --user

--system 表示強制作爲系統實例運行(即使"PID≠1"), --user 表示強制作爲用戶實例運行(即使"PID=1")。 通常不應該使用此選項。 此選項僅用於調試目的, 而且 --system 僅在與 --test 一起使用時纔有實際意義。

--dump-core

在崩潰時進行內核轉儲。 當作爲用戶實例運行時,此選項沒有實際意義。 此選項還可以通過內核引導選項 systemd.dump_core= 開啓 (參見"內核引導選項"小節)。

--crash-vt=VT

在崩潰時切換到指定的虛擬控制檯(VT)。 當作爲用戶實例運行時,此選項沒有實際意義。 可以設爲一個 1–63 之間的整數或布爾值。 若設爲整數則切換到指定編號的虛擬控制檯; 若設爲 yes 則表示使用內核消息所使用的虛擬控制檯; 若設爲 no 則表示不切換到任何虛擬控制檯。 此選項還可以通過內核引導選項 systemd.crash_vt= 設置 (參見"內核引導選項"小節)。

--crash-shell

在崩潰時啓動一個 shell 。 當作爲用戶實例運行時,此選項沒有實際意義。 此選項還可以通過內核引導選項 systemd.crash_shell= 開啓 (參見"內核引導選項"小節)。

--crash-reboot

在崩潰時自動重啓系統。 當作爲用戶實例運行時,此選項沒有實際意義。 此選項還可以通過內核引導選項 systemd.crash_reboot= 開啓 (參見"內核引導選項"小節)。

--confirm-spawn

在派生新進程時進行確認提示。 當作爲用戶實例運行時,此選項沒有實際意義。

--show-status=

在系統啓動過程中顯示簡明的服務狀態信息。 當作爲用戶實例運行時,此選項沒有實際意義。 其參數必須是一個表示真假的布爾值, 如果未指定則相當於設爲 yes

--log-target=

設置日誌的目標,其參數必須是 console, journal, kmsg, journal-or-kmsg, null 之一(小寫)。

--log-level=

設置日誌的等級, 其參數必須是一個數字或者 符合 syslog(3) 習慣的 emerg, alert, crit, err, warning, notice, info, debug 之一(小寫)。

--log-color=

高亮重要的日誌信息,其參數必須是一個表示真假的布爾值, 若未指定則相當於設爲 yes

--log-location=

在日誌中包含代碼的位置, 其參數必須是一個表示真假的布爾值, 若未指定則相當於設爲 yes 。僅用於調試目的。

--default-standard-output=, --default-standard-error=

爲所有的 service 與 socket 設置默認的標準輸出與標準錯誤, 相當於設置 StandardOutput=StandardError= 指令的值(參見 systemd.exec(5) 手冊)。其參數必須是 inherit, null, tty, journal, journal+console, syslog, syslog+console, kmsg, kmsg+console 之一(小寫)。 --default-standard-output= 的默認值是 journal ;而 --default-standard-error= 的默認值是 inherit

--machine-id=

覆蓋文件系統上的 machine-id 設置, 常用於網絡啓動或容器。 禁止設爲全零的值。

-h, --help

顯示簡短的幫助信息並退出。

--version

顯示簡短的版本信息並退出。

概念

systemd 將各種系統啓動和運行相關的對象, 表示爲各種不同類型的單元(unit), 並提供了處理不同單元之間依賴關係的能力。 大部分單元都靜態的定義在單元文件中 (參見 systemd.unit(5) 手冊), 但是有少部分單元則是動態自動生成的: 其中一部分來自於其他傳統的配置文件(爲了兼容性), 而另一部分則動態的來自於系統狀態或可編程的運行時狀態。 單元既可以處於活動(active)狀態也可以處於停止(inactive)狀態, 當然也可以處於啓動中(activating)或停止中(deactivating)的狀態。 還有一個特殊的失敗(failed)狀態, 意思是單元以某種方式失敗了 (進程崩潰了、或者觸碰啓動頻率限制、或者退出時返回了錯誤代碼、或者遇到了操作超時之類的故障)。 當進入失敗(failed)狀態時, 導致故障的原因將被記錄到日誌中以方便日後排查。 需要注意的是, 不同的單元可能還會有各自不同的"子狀態", 但它們都被映射到上述五種狀態之一。

各種不同的單元類型如下:

1.service 單元。用於封裝一個後臺服務進程。 參見 systemd.service(5) 手冊。

2.socket 單元。 用於封裝一個系統套接字(UNIX)或互聯網套接字(INET/INET6)或FIFO管道。 相應的服務在第一個"連接"進入套接字時纔會被啓動。 有關套接字單元的詳情,參見 systemd.socket(5) 手冊;有關基於套接字或其他方式的啓動,參見 daemon(7) 手冊。

3.target 單元。 用於將多個單元在邏輯上組合在一起。參見 systemd.target(5) 手冊。

4.device 單元。用於封裝一個設備文件,可用於基於設備的啓動。 並非每一個設備文件都需要一個 device 單元, 但是每一個被 udev 規則標記的設備都必須作爲一個 device 單元出現。參見 systemd.device(5) 手冊。

5.mount 單元。 用於封裝一個文件系統掛載點(也向後兼容傳統的 /etc/fstab 文件)。參見 systemd.mount(5) 手冊。

6.automount 單元。 用於封裝一個文件系統自動掛載點,也就是僅在掛載點確實被訪問的情況下才進行掛載。 它取代了傳統的 autofs 服務。參見 systemd.automount(5) 手冊。

7.timer 單元。 用於封裝一個基於時間觸發的動作。它取代了傳統的 atd, crond 等任務計劃服務。參見 systemd.timer(5) 手冊。

8.swap 單元。 用於封裝一個交換分區或者交換文件。 它與 mount 單元非常類似。參見 systemd.swap(5) 手冊。

9.path 單元。 用於根據文件系統上特定對象的變化來啓動其他服務。參見 systemd.path(5) 手冊。

10.slice 單元。 用於控制特定 CGroup 內(例如一組 service 與 scope 單元)所有進程的總體資源佔用。 參見 systemd.slice(5) 手冊。

11.scope 單元。它與 service 單元類似,但是由 systemd 根據 D-bus 接口接收到的信息自動創建, 可用於管理外部創建的進程。參見 systemd.scope(5) 手冊。

單元的名稱由單元文件的名稱決定, 某些特定的單元名稱具有特殊的含義,詳情參見 systemd.special(7) 手冊。

systemd 能夠處理各種類型的依賴關係, 包括依賴與衝突(也就是 Requires=Conflicts= 指令), 以及先後順序(也就是 After=Before= 指令)。 注意, 上述兩種類型的依賴關係(依賴與衝突、先後順序)之間是相互獨立的(無關的)。 舉例來說,假定 foo.service 依賴於(Requires) bar.service 但並未指定先後順序, 那麼這兩個服務將被同時並行啓動。 不過在兩個單元之間既存在依賴關係也存在先後順序的情形也很常見。 另外需要注意的是, 大多數依賴關係都是由 systemd 隱式創建和維護的, 因此沒有必要額外手動創建它們。

應用程序和單元(透過依賴關係)可能會查詢其他單元的狀態變化。 在 systemd 中, 這種查詢被包裝爲"任務"(job)並被作爲"任務隊列"進行管理。 任務的執行結果可能成功也可能失敗, 但是任務的執行順序是依照任務所屬單元之間的先後順序確定的。

在系統啓動時,systemd 默認啓動 default.target 單元, 該單元中應該包含所有你想在開機時默認啓動的單元。 但實際上,它通常只是一個指向 graphical.target (圖形界面) 或 multi-user.target (命令行界面,常用於嵌入式或服務器環境, 一般是 graphical.target 的一個子集)的符號連接。 詳見 systemd.special(7) 手冊。

systemd 依賴於內核提供的 cgroups[1] 特性控制進程的派生, 從而確保可以追蹤到所有子進程。 cgroups 信息由內核負責維護, 並且可以通過 /sys/fs/cgroup/systemd/ 接口進行訪問。此外,還可以通過 systemd-cgls(1)ps(1) 之類的工具進行查看 (ps xawf -eo pid,user,cgroup,args)

systemd 幾乎完全兼容傳統的 SysV init 系統: SysV init 腳本可以作爲另一種配置文件格式被識別; 提供與 SysV 兼容的 /dev/initctl 接口; 提供各種 SysV 工具的兼容實現; 依然兼容例如 /etc/fstab 或者 utmp 之類傳統的 Unix 特性。

systemd 還有一個小型的事務系統: 如果要啓動或關閉一個單元, 那麼該單元所依賴的 所有其他單元都會被一起加入到同一個臨時事務中。 這樣,就可以校驗整個事務的一致性, 也就是檢查是否存在循環依賴。 如果存在循環依賴, 那麼 systemd 將會嘗試通過 去掉弱依賴(want)來解決這個問題, 如果最終實在無法解決循環依賴的問題, 那麼 systemd 將會報錯。

systemd 內置了許多系統啓動過程中必需的操作, 例如,設置 hostname 以及配置 loopback 網絡設備, 以及掛載 /sys 和 /proc 文件系統。

在系統啓動或者執行 systemctl reload ... 時, systemd 可以根據其他配置文件或者內核引導選項動態生成單元,參見 systemd.generator(7) 手冊。

如果要從容器中調用 systemd 那麼必須遵守 Container Interface[2] 規範。 如果要從 initrd 中調用 systemd 那麼必須遵守 initrd Interface[3] 規範。

目錄

系統單元目錄
systemd 會從多個優先級不同的系統單元目錄中讀取系統單元, 軟件包應該將系統單元文件安裝在 pkg-config systemd --variable=systemdsystemunitdir 命令所返回的系統單元目錄中(通常是 /usr/lib/systemd/system)。 此外, systemd 還會讀取優先級較高的 /usr/local/lib/systemd/system 目錄以及優先級較低的 /usr/lib/systemd/system 目錄中的系統單元文件。 優先級最高的系統單元目錄是 pkg-config systemd --variable=systemdsystemconfdir 命令所返回的目錄(通常是 /etc/systemd/system)。 注意,軟件包應該僅使用 systemctl(1)enabledisable 命令修改上述目錄中的內容。 完整的目錄列表參見 systemd.unit(5) 手冊。

用戶單元目錄

用戶單元目錄所遵守的規則與系統單元目錄類似, 軟件包應該將用戶單元文件安裝在 pkg-config systemd --variable=systemduserunitdir 命令所返回的用戶單元目錄中(通常是/usr/lib/systemd/user)。 此外,因爲用戶單元目錄還遵守 XDG Base Directory specification[4] 規範, 所以 systemd 還會讀取 $XDG_DATA_HOME/systemd/user(僅在已設置 $XDG_DATA_HOME 的情況下) 或 ~/.local/share/systemd/user(僅在未設置 $XDG_DATA_HOME 的情況下) 目錄中的用戶單元。 全局用戶單元目錄(針對所有用戶)是 pkg-config systemd --variable=systemduserconfdir 命令所返回的目錄(通常是/etc/systemd/user)。 注意,軟件包應該僅使用 systemctl(1)enabledisable 命令修改上述目錄中的內容。 無論這種修改是全局的(針對所有用戶)、還是私有的(針對單個用戶)。 完整的目錄列表參見 systemd.unit(5) 手冊。

SysV啓動腳本目錄(不同發行版之間差別可能很大)

如果 systemd 找不到指定服務所對應的單元文件, 那麼就會到SysV啓動腳本目錄中 去尋找同名腳本(去掉 .service 後綴)。

SysV運行級目錄(不同發行版之間差別可能很大)

systemd 在決定是否啓用一個服務的時候, 會參照SysV運行級目錄對該服務的設置。 注意, 這個規則不適用於那些已經擁有原生單元文件的服務。

信號

SIGTERM
systemd 系統實例將會保存其當前狀態, 然後重新執行它自身,再恢復到先前保存的狀態。 基本上相當於執行 systemctl daemon-reexec 命令。

systemd 用戶實例將會啓動 exit.target 單元。 基本上相當於執行 systemctl --user start exit.target 命令。

SIGINT

systemd 系統實例將會啓動 ctrl-alt-del.target 單元。 基本上相當於執行 systemctl start ctl-alt-del.target 命令。 在控制檯上按 Ctrl-Alt-Del 組合鍵即可觸發這個信號。 但是,如果在2秒內連續收到超過7次這個信號,那麼將會不顧一切的立即強制重啓。 因此,如果系統在重啓過程中僵死, 那麼可以通過快速連按7次 Ctrl-Alt-Del 組合鍵來強制立即重啓。

systemd 用戶實例處理此信號的方式與 SIGTERM 相同。

SIGWINCH

systemd 系統實例將會啓動 kbrequest.target 單元。 基本上相當於執行 systemctl start kbrequest.target 命令。

systemd 用戶實例將會完全忽略此信號。

SIGPWR

systemd 將會啓動 sigpwr.target 單元。 基本上相當於執行 systemctl start sigpwr.target 命令。

SIGUSR1

systemd 將會嘗試重新連接到 D-Bus 總線。

SIGUSR2

systemd 將會以人類易讀的格式將其完整的狀態記錄到日誌中。 日期的格式與 systemd-analyze dump 的輸出格式相同。

SIGHUP

重新加載守護進程的配置文件。 基本上相當於執行 systemctl daemon-reload 命令。

SIGRTMIN+0

進入默認模式,啓動 default.target 單元。 基本上相當於執行 systemctl start default.target 命令。

SIGRTMIN+1

進入救援模式,啓動 rescue.target 單元。 基本上相當於執行 systemctl isolate rescue.target 命令。

SIGRTMIN+2

進入緊急維修模式,啓動 emergency.target 單元。 基本上相當於執行 systemctl isolate emergency.target 命令。

SIGRTMIN+3

關閉系統,啓動 halt.target 單元。 基本上相當於執行 systemctl start halt.target 命令。

SIGRTMIN+4

關閉系統並切斷電源,啓動 poweroff.target 單元。 基本上相當於執行 systemctl start poweroff.target 命令。

SIGRTMIN+5

重新啓動,啓動 reboot.target 單元。 基本上相當於執行 systemctl start reboot.target 命令。

SIGRTMIN+6

通過內核的 kexec 接口重新啓動,啓動 kexec.target 單元。 基本上相當於執行 systemctl start kexec.target 命令。

SIGRTMIN+13

立即關閉機器

SIGRTMIN+14

立即關閉機器並切斷電源

SIGRTMIN+15

立即重新啓動

SIGRTMIN+16

立即通過內核的 kexec 接口重新啓動

SIGRTMIN+20

在控制檯上顯示狀態消息。 相當於使用 systemd.show_status=1 內核引導選項。

SIGRTMIN+21

禁止在控制檯上顯示狀態消息。 相當於使用 systemd.show_status=0 內核引導選項。

SIGRTMIN+22, SIGRTMIN+23

將日誌等級設爲 "debug"(22) 或 "info"(23)。 相當於使用 systemd.log_level=debugsystemd.log_level=info 內核引導選項。

SIGRTMIN+24

立即退出 systemd 用戶實例(也就是僅對 --user 實例有效)。

SIGRTMIN+26, SIGRTMIN+27, SIGRTMIN+28

將日誌等級設爲 "journal-or-kmsg"(26) 或 "console"(27) 或 "kmsg"(28)。 相當於使用 systemd.log_target=journal-or-kmsgsystemd.log_target=consolesystemd.log_target=kmsg 內核引導選項。

環境變量

$SYSTEMD_LOG_LEVEL
systemd 日誌等級。 可以被 --log-level= 選項覆蓋。

$SYSTEMD_LOG_TARGET

systemd 日誌目標。 可以被 --log-target= 選項覆蓋。

$SYSTEMD_LOG_COLOR

systemd 是否應該高亮重要的日誌信息。 可以被 --log-color= 選項覆蓋。

$SYSTEMD_LOG_LOCATION

systemd 是否應該在日誌信息中包含代碼位置(code location)。 可以被 --log-location= 選項覆蓋。

$XDG_CONFIG_HOME, $XDG_DATA_HOME

systemd 用戶實例根據 XDG Base Directory specification[4] 規範使用這些變量加載單元文件及其 .{d,wants,requires}/ 目錄。

$SYSTEMD_UNIT_PATH

單元目錄

$SYSTEMD_SYSVINIT_PATH

SysV啓動腳本目錄

$SYSTEMD_SYSVRCND_PATH

SysV運行級目錄

$SYSTEMD_COLORS

控制輸出內容的色彩方案

$LISTEN_PID, $LISTEN_FDS, $LISTEN_FDNAMES

在基於套接字啓動的過程中由 systemd 設置此變量, 以供管理程序使用。詳見 sd_listen_fds(3) 手冊。

$NOTIFY_SOCKET

由 systemd 設置此變量, 以報告狀態以及提供啓動完畢的通知,以供管理程序使用。詳見 sd_notify(3) 手冊。

內核引導選項

當作爲系統實例運行的時候, systemd 能夠接受下面列出的內核引導選項。[5]

systemd.unit=, rd.systemd.unit=

設置默認啓動的單元。 默認值是 default.target 。 可用於臨時修改啓動目標(例如 rescue.target 或 emergency.target )。詳情參見 systemd.special(7) 手冊。 有 "rd." 前綴的參數專用於 initrd(initial RAM disk) 環境, 而無前綴的參數則用於常規環境。

systemd.dump_core=

如果設爲默認值 yes ,那麼 systemd(PID=1) 將會在崩潰時進行核心轉儲, 否則不進行任何轉儲。

systemd.crash_chvt=

可以設爲一個 1-63 之間的整數或布爾值。 若設爲整數則 systemd(PID=1) 將在崩潰時切換到指定編號的虛擬控制檯; 若設爲 yes , 則表示切換到內核消息所使用的虛擬控制檯; 若設爲 no(默認值) 則不切換到任何虛擬控制檯。

systemd.crash_shell=

如果設爲 yes , 那麼 systemd(PID=1) 將在崩潰10秒後啓動一個 shell , 默認值 no 則表示即使崩潰也不啓動任何 shell 。 由於被啓動的 shell 不需要任何密碼認證, 所以使用這個特性時需要注意其帶來的安全隱患。

systemd.crash_reboot=

如果設爲 yes, 那麼 systemd(PID=1) 將在崩潰10秒後自動重啓整個機器, 默認值 no 則表示即使崩潰也不重啓(無限制的死在那裏), 這樣可以避免進入循環重啓。 如果與 systemd.crash_shell=yes 同時使用, 那麼系統將在退出 shell 之後重啓。

systemd.confirm_spawn=

設爲 yes 表示 systemd(PID=1) 在派生新進程時進行確認提示。 默認值 no 表示不提示。

systemd.show_status=

啓動時是否在控制檯上顯示簡明的服務狀態。 可以接受 yes(顯示), no(不顯示), auto(自動)三個值。 autono 相似, 不同之處在於當某個服務啓動失敗或者啓動耗時太長時,將會顯示其狀態。 當使用了 quiet 內核引導選項的時候, 默認值是 auto , 否則默認值是 yes

systemd.log_target=, systemd.log_level=, systemd.log_color=, systemd.log_location=

用於控制日誌輸出,含義與之前的 $SYSTEMD_LOG_TARGET, $SYSTEMD_LOG_LEVEL, $SYSTEMD_LOG_COLOR, $SYSTEMD_LOG_LOCATION 環境變量相同。

systemd.default_standard_output=, systemd.default_standard_error=

設置服務的默認標準輸出與標準錯誤, 含義與相應的 --default-standard-output=--default-standard-error= 命令行選項相同。

systemd.setenv=

接受"VARIABLE=VALUE"格式的字符串, 可用於爲派生的子進程設置默認環境變量。 可以多次使用以設置多個變量。

systemd.machine_id=

接受一個32字符表示的16進制值, 用作該主機的 machine-id 。 主要用於網絡啓動,以確保每次啓動都能得到相同的 machine-id 值。

quiet

關閉啓動過程中的狀態輸出。相當於 systemd.show_status=no 的效果。 注意,因爲此選項也同樣被內核所識別, 並用于禁止輸出內核日誌, 所以使用此選項會導致同時關閉內核與 systemd 的輸出。

debug

開啓調試輸出, 等價於設置了 systemd.log_level=debug 。 注意,因爲此選項也同樣被內核所識別, 並用於開啓內核的調試輸出, 所以使用此選項會導致同時開啓內核與 systemd 的調試輸出。

emergency, rd.emergency, -b

啓動到緊急維修模式。等價於設置了 systemd.unit=emergency.targetrd.systemd.unit=emergency.target

rescue, rd.rescue, single, s, S, 1

啓動到救援模式。等價於設置了 systemd.unit=rescue.targetrd.systemd.unit=rescue.target

2, 3, 4, 5

啓動到對應的 SysV 運行級。 等價於設置了對應的 systemd.unit=runlevel2.target, systemd.unit=runlevel3.target, systemd.unit=runlevel4.target, systemd.unit=runlevel5.target,

locale.LANG=, locale.LANGUAGE=, locale.LC_CTYPE=, locale.LC_NUMERIC=, locale.LC_TIME=, locale.LC_COLLATE=, locale.LC_MONETARY=, locale.LC_MESSAGES=, locale.LC_PAPER=, locale.LC_NAME=, locale.LC_ADDRESS=, locale.LC_TELEPHONE=, locale.LC_MEASUREMENT=, locale.LC_IDENTIFICATION=

設置相應的系統 locale , 會覆蓋 /etc/locale.conf 中的設置。 參見 locale.conf(5)locale(7) 手冊。

更多內核引導選項的解釋, 參見 kernel-command-line(7) 手冊。

SOCKETS 與 FIFOS

/run/systemd/notify
通知守護進程狀態的 UNIX socket 文件, 用於實現 sd_notify(3) 中實現的守護進程通知邏輯。

/run/systemd/private

僅被 systemctl(1) 工具內部用於與 systemd 進程通信的 UNIX socket 文件。 其他進程不應該使用它。

/dev/initctl

由 systemd-initctl.service 單元提供的與傳統 SysV 兼容的客戶端接口(FIFO)。 這是一個即將被廢棄的接口,儘量不要使用它。

參見

systemd Homepage[6], systemd-system.conf(5), locale.conf(5), systemctl(1), journalctl(1), systemd-notify(1), daemon(7), sd-daemon(3), systemd.unit(5), systemd.special(5), pkg-config(1), kernel-command-line(7), bootup(7), systemd.directives(7)

NOTES

1.
cgroups
2.
Container Interface
3.
initrd Interface
4.
XDG Base Directory specification
5.
當 systemd 在 Linux 容器中運行的時候, 這些參數可以直接在 systemd 命令行上傳遞(放置在所有命令行選項之後), 當 systemd 不在 Linux 容器中運行的時候, 這些參數將從 /proc/cmdline 中獲取。
6.
systemd Homepage

本頁面中文版由中文 man 手冊頁計劃提供。

翻譯人員:金步國
金步國作品集:http://www.jinbuguo.com
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

systemd 231