systemd, init - systemd
系統與服務管理器
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)狀態時,
導致故障的原因將被記錄到日誌中以方便日後排查。
需要注意的是,
不同的單元可能還會有各自不同的"子狀態",
但它們都被對映到上述五種狀態之一。
各種不同的單元型別如下:
2.socket 單元。
用於封裝一個系統套接字(UNIX)或網際網路套接字(INET/INET6)或FIFO管道。
相應的服務在第一個"連線"進入套接字時才會被啟動。
有關套接字單元的詳情,參見
systemd.socket(5)
手冊;有關基於套接字或其他方式的啟動,參見
daemon(7) 手冊。
4.device
單元。用於封裝一個裝置檔案,可用於基於裝置的啟動。
並非每一個裝置檔案都需要一個
device 單元,
但是每一個被 udev
規則標記的裝置都必須作為一個
device 單元出現。參見
systemd.device(5) 手冊。
6.automount 單元。
用於封裝一個檔案系統自動掛載點,也就是僅在掛載點確實被訪問的情況下才進行掛載。
它取代了傳統的 autofs
服務。參見
systemd.automount(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) 的
enable 與
disable
命令修改上述目錄中的內容。
完整的目錄列表參見
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) 的
enable 與
disable
命令修改上述目錄中的內容。
無論這種修改是全域性的(針對所有使用者)、還是私有的(針對單個使用者)。
完整的目錄列表參見
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=debug
或 systemd.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-kmsg 或
systemd.log_target=console 或 systemd.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
$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(自動)三個值。 auto
與 no 相似,
不同之處在於當某個服務啟動失敗或者啟動耗時太長時,將會顯示其狀態。
當使用了 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.target 或
rd.systemd.unit=emergency.target
rescue, rd.rescue, single, s,
S, 1
啟動到救援模式。等價於設定了
systemd.unit=rescue.target 或
rd.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=
更多核心引導選項的解釋,
參見 kernel-command-line(7) 手冊。
/run/systemd/notify
/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)
- 1.
- cgroups
- 2.
- Container Interface
- 3.
- initrd Interface
- 4.
- XDG Base Directory specification
- 5.
- 當 systemd 在 Linux
容器中執行的時候,
這些引數可以直接在
systemd
命令列上傳遞(放置在所有命令列選項之後),
當 systemd 不在 Linux
容器中執行的時候,
這些引數將從 /proc/cmdline
中獲取。
- 6.
- systemd Homepage