CentOS 7 系列(二)系統服務配置--單元(Unit)

systemd.unit

單元(Unit)

Systemd由一個叫做單元(Unit)的概念,它保存了服務、設備、掛載點和操作系統其他信息的配置文件,並能夠處理不同單元之間的依賴關係。大部分單元都靜態的定義在單元文件中,也有一些是動態生成的。單元有多種狀態:

  • 處於活動的則是(active),當前正在運行

  • 停止的則是(inactive),當前已經停止

  • 啓動中的則是(activing),當前正在啓動

  • 停止中的則是(deactiving),當前正在停止

  • 失敗的則是(failed)狀態,意思說單元啓動過程中遇到錯誤比如找不到文件、路徑或者進程運行中崩潰了等。

一共有11種不同類型的單元:

單元類型 說明
service單元 用於封裝一個後臺服務進程,比如通過systemctl start firewalld啓動防火牆,這種就屬於service單元。
socket單元 用於封裝一個後臺服務進程,比如通過systemctl start firewalld啓動防火牆,這種就屬於service單元。
target單元 用於將多個單元在邏輯上組合在一起讓它們同時啓動。
device單元 用於封裝一個設備文件,可用於基於設備啓動。並不是每一個設備文件都需要一個device單元,但是每一個被udev規則標記的設備都必須作爲一個device單元出現。
mount單元 用於封裝一個文件系統掛載點(向後兼容/etc/fstab)
automount單元 用於封裝一個文件系統自動掛載點,只有該文件系統被訪問時纔會進行掛載,它取代了傳統的autofs服務。
timer單元 用於封裝一個基於時間觸發的動作,它取代了atd、crond等計劃任務。
swap單元 用於封裝一個交換分區或者交換文件,它與mount類似。
path單元 用於根據文件系統上特定對象的變化來啓動其他服務。
slice單元 用於控制特定的CGroup內所有進程的總體資源佔有。
scope單元 它與service單元類似,但是由systemd根據D-bus接口接收到的信息自動創建,可用於管理外部創建的進程。

systemd能夠處理各種依賴與衝突關係以及先後順序,依賴與衝突、先後順序兩者之間是獨立的。比如service1依賴service2,而且啓動service1必須先啓動service2,,那麼這2個服務將會同時啓動。

說明:一個單元配置文件只能描述一種單元。

系統提供兩種級別的單元:

  • 系統單元:在/lib/systemd/system目錄中,優先級高於用戶單元。

  • 用戶單元:在/usr/lib/systemd/system目錄中

當systemd以系統實例運行,那麼優先級如下:

系統單元目錄 說明 優先級
/lib/systemd/system 本地配置的系統單元
/run/systemd/system 運行時配置的系統單元
/usr/lib/systemd/system 軟件包安裝的系統單元

使用下面的命令可以列出系統所有單元

1
systemctl list-unit-files

wKiom1jflx7QTeOsAACMrmKkD5g023.jpg

說明:注意單元名稱的後綴,可以看出是那一類單元。另外,enabled表示被啓用的單元並不是說當前在運行,disabled表示被禁用的單元,至於static則表示不能直接啓用,它們是被其他單元所依賴的對象。

如果想要查看某一類型的單元

1
systemctl list-unit-files --type=類型

wKioL1jflzSgMU_-AABhoxz69FA335.jpg

如果想要查看當前服務的狀態,使用下面的命令,可以看到active表示當前正在運行。

1
systemctl status 服務名稱

wKiom1jfl0_Bf8VCAAEKGCKYDtQ359.jpg

如果某個服務啓動不了,你可以通過這個命令看一下啓動過程哪裏出錯了。


單元文件中的布爾值寫法:1,yes,true,on表示真;0,no,false,off表示假

單位文件中的時長寫法:默認是秒,us(微妙),ms(毫秒),s(秒),min(分鐘),h(小時),d(天),w(星期)。

其他約束:空白行或者以“#”或者以“;”開頭的都會被忽略,行尾“\”表示續行符,在續行時被替換爲一個空格。


[Unit] 段:

這個段在大部分單元文件中都會存在,下面看一下它的配置字段有哪些,紅色爲常用字段。

字段 說明
Description= 對單元進行簡單描述的字符串。 用於UI中緊跟單元名稱之後的簡要描述文字。 例如 "Apache2 Web Server" 就是一個好例子。 不好的例子: "high-performance light-weight HTTP server"(太通用) 或 "Apache2"(信息太少)。
Documentation= 一組用空格分隔的文檔URI列表, 這些文檔是對此單元的詳細說明。 可接受 "http://", "https://", "file:", "info:", "man:" 五種URI類型。 有關URI語法的詳細說明,參見 uri(7) 手冊。 這些URI應該按照相關性由高到低列出。 比如,將解釋該單元作用的文檔放在第一個, 最好再緊跟單元的配置說明, 最後再附上其他文檔。 可以多次使用此選項, 依次向文檔列表尾部添加新文檔。 但是,如果爲此選項設置一個空字符串, 那麼表示清空先前已存在的列表。
Requires= 設置此單元所必須依賴的其他單元。 當此單元被啓動時,所有這裏列出的其他單元也必須被啓動。 如果有某個單元未能成功啓動,那麼此單元也不會被啓動。 想要添加多個單元, 可以多次使用此選項, 也可以設置一個空格分隔的單元列表。 注意,此選項並不影響單元之間的啓動或停止順序。 想要調整單元之間的啓動或停止順序, 請使用 After= 或 Before= 選項。 例如,在 foo.service 中設置了 Requires=bar.service 但是並未使用 After= 或 Before= 設定兩者的啓動順序, 那麼,當需要啓動 foo.service 的時候, 這兩個單元會被並行的同時啓動。 建議使用 Wants= 代替 Requires= 來設置單元之間的非致命依賴關係, 從而有助於獲得更好的健壯性, 特別是在某些單元啓動失敗的時候。
Wants=

此選項是 Requires= 的弱化版。 當此單元被啓動時,所有這裏列出的其他單元只是儘可能被啓動。 但是,即使某些單元不存在或者未能啓動成功, 也不會影響此單元的啓動。 推薦使用此選項來設置單元之間的依賴關係。

注意,此種依賴關係也可以在單元文件之外通過向 .wants/ 目錄中添加軟連接來設置, 詳見前文

BindsTo= 與 Requires= 類似, 不同之處在於: 如果這裏列出的單元停止運行或者崩潰, 那麼也會連帶導致該單元自身被停止。 這就意味着該單元可能因爲 某個單元的主動退出、某個設備被拔出、某個掛載點被卸載, 而被強行停止。
PartOf= 與 Requires= 類似, 不同之處在於:僅作用於單元的停止或重啓。 其含義是,當停止或重啓這裏列出的某個單元時, 也會同時停止或重啓該單元自身。 注意,這個依賴是單向的, 該單元自身的停止或重啓並不影響這裏列出的單元。
Conflicts= 指定單元之間的衝突關係。 接受一個空格分隔的單元列表,表明該單元不能與列表中的任何單元共存, 也就是說:(1)當此單元啓動的時候,列表中的所有單元都將被停止; (2)當列表中的某個單元啓動的時候,該單元同樣也將被停止。 注意,此選項與 After= 和 Before= 選項沒有任何關係。

Before=

After=

強制指定單元之間的先後順序。 接受一個空格分隔的單元列表。 假定 foo.service 單元 包含 Before=bar.service 設置, 那麼當兩個單元都需要啓動的時候, bar.service 將會一直延遲到 foo.service 啓動完畢之後再啓動。 注意,停止順序與啓動順序正好相反, 也就是說, 只有當 bar.service 完全停止後, 纔會停止 foo.service 單元。 After= 的含義 與 Before= 正好相反, 假定 foo.service 單元 包含 After=bar.service 設置, 那麼當兩個單元都需要啓動的時候, foo.service 將會一直延遲到 bar.service 啓動完畢之後再啓動。 注意,停止順序與啓動順序正好相反, 也就是說, 只有當 foo.service 完全停止後, 纔會停止 bar.service 單元。 注意,此選項僅用於指定先後順序, 與 Requires= 選項沒有任何關係。 不過在實踐中也經常遇見 將某個單元同時設置到 After= 與 Requires= 選項中的情形。 可以多次使用此選項, 以將多個單元添加到列表中。 假定兩個單元之間存在先後順序(無論誰先誰後), 並且一個要停止而另一個要啓動, 那麼永遠是"先停止後啓動"的順序。 但如果兩個單元之間沒有先後順序, 那麼它們的停止和啓動就都是相互獨立的, 並且是並行的。
OnFailure= 接受一個空格分隔的單元列表。 當該單元進入失敗("failed")狀態時, 將會啓動列表中的單元。

PropagatesReloadTo=

ReloadPropagatedFrom=

接受一個空格分隔的單元列表。 PropagatesReloadTo= 表示 在 reload 該單元時,也同時 reload 所有列表中的單元。 ReloadPropagatedFrom= 表示 在 reload 列表中的某個單元時,也同時 reload 該單元。
JoinsNamespaceOf= 接受一個空格分隔的單元列表, 表示將該單元所啓動的進程加入到列表單元的網絡及 臨時文件(/tmp, /var/tmp) 的名字空間中。 如果單元列表中僅有一個單元處於已啓動狀態, 那麼該單元將加入到這個唯一已啓動單元的名字空間中。 如果單元列表中有多個單元處於已啓動狀態, 那麼該單元將隨機加入一個已啓動單元的名字空間中。 此選項僅適用於支持 PrivateNetwork= 與/或 PrivateTmp= 指令的單元 (對加入者與被加入者都適用)。 詳見 systemd.exec(5) 手冊。
RequiresMountsFor= 接受一個空格分隔的絕對路徑列表,表示該單元將會使用到這些文件系統路徑。 所有這些路徑中涉及的掛載點所對應的 mount 單元,都會被隱式的添加到 Requires= 與 After= 選項中。 也就是說,這些路徑中所涉及的掛載點都會在啓動該單元之前被自動掛載。
OnFailureJobMode= 可設爲 "fail", "replace", "replace-irreversibly", "isolate", "flush", "ignore-dependencies", "ignore-requirements" 之一。 默認值是 "replace" 。 指定 OnFailure= 中列出的單元應該以何種方式排隊。值的含義參見 systemctl(1) 手冊中對 --job-mode= 選項的說明。 如果設爲 "isolate" , 那麼只能在 OnFailure= 中設置一個單獨的單元。
IgnoreOnIsolate= 如果設爲 yes , 那麼在執行 systemctl isolate another.target 命令時,此單元不會被停止。 默認值是 no 。
StopWhenUnneeded= 如果設爲 yes , 那麼當此單元不再被任何已啓動的單元依賴時, 將會被自動停止。 默認值 no 的含義是, 除非此單元與其他即將啓動的單元衝突, 否則即使此單元已不再被任何已啓動的單元依賴, 也不會自動停止它。

RefuseManualStart=

RefuseManualStop=

如果設爲 yes , 那麼此單元將拒絕被手動啓動(RefuseManualStart=) 或拒絕被手動停止(RefuseManualStop=)。 也就是說, 此單元只能作爲其他單元的依賴條件而存在, 只能因爲依賴關係而被間接啓動或者間接停止, 不能由用戶以手動方式直接啓動或者直接停止。 設置此選項是爲了 禁止用戶意外的啓動或者停止某些特定的單元。 默認值是 no。
AllowIsolate= 如果設爲 yes , 那麼此單元將允許被 systemctl isolate 命令操作, 否則將會被拒絕。 唯一一個將此選項設爲 yes 的理由,大概是爲了兼容SysV初始化系統。 此時應該僅考慮對 target 單元進行設置, 以防止系統進入不可用狀態。 建議保持默認值 no
DefaultDependencies= 默認值 yes 表示爲此單元隱式地創建默認依賴。 不同類型的單元,其默認依賴也不同,詳見各自的手冊頁。 例如對於 service 單元來說, 默認的依賴關係是指: (1)開機時,必須在基礎系統初始化完成之後才能啓動該服務; (2)關機時,必須在該服務完全停止後才能關閉基礎系統。 通常,只有那些在系統啓動的早期就必須啓動的單元, 以及那些必須在系統關閉的末尾才能關閉的單元, 纔可以將此選項設爲 no 。 注意,設爲 no 並不表示取消所有的默認依賴, 只是表示取消非關鍵的默認依賴。 強烈建議對絕大多數普通單元保持此選項的默認值 yes 。

JobTimeoutSec=

JobTimeoutAction=

JobTimeoutRebootArgument=

JobTimeoutSec=

用於設置該單元等候外部任務(job)完成的最長時限。 如果超時,那麼超時的 job 將被撤銷,並且該單元將保持其現有狀態不變。 對於非 device 單元,此選項的默認值是 "infinity"(永不超時)。 注意,此選項的超時不是指單元自身的超時(例如 TimeoutStartSec= 就是指單元自身的超時), 而是指該單元在啓動或者停止等狀態變化過程中,等候某個外部任務完成的最長時限。 換句話說,適用於單元自身的超時設置(例如 TimeoutStartSec=)用於指定單元自身在改變其狀態時,總共允許使用多長時間; 而 JobTimeoutSec= 則是設置此單元在改變其狀態的過程中,等候某個外部任務完成所能容忍的最長時間。
JobTimeoutAction= 用於指定當超時發生時, 將觸發什麼樣的額外動作。 默認值爲 none 。 可設置的值與 StartLimitAction= 相同,參見 systemd.service(5) 手冊。 JobTimeoutRebootArgument= 用於指定傳遞給 reboot(2) 系統調用的字符串參數。

StartLimitIntervalSec=

StartLimitBurst=

設置單元的啓動頻率限制。 默認情況下,一個單元在10秒內最多允許啓動5次。 StartLimitIntervalSec= 用於設置時長, 默認值等於 DefaultStartLimitIntervalSec= 的值(默認爲10秒),設爲 0 表示不作限制。 StartLimitBurst= 用於設置在一段給定的時長內,最多允許啓動多少次, 默認值等於 DefaultStartLimitBurst= 的值(默認爲5次)。 雖然此選項通常與 Restart= (參見 systemd.service(5)) 一起使用, 但實際上,此選項作用於任何方式的啓動(包括手動啓動), 而不僅僅是由 Restart= 觸發的啓動。 注意,一旦某個設置了 Restart= 自動重啓邏輯的單元 觸碰到了啓動頻率限制,那麼該單元將再也不會嘗試自動重啓; 不過,如果該單元后來又被手動重啓成功的話,那麼該單元的自動重啓邏輯將會被再次激活。 注意,systemctl reset-failed 命令能夠重置單元的啓動頻率計數器。 系統管理員在手動啓動某個已經觸碰到了啓動頻率限制的單元之前,可以使用這個命令清除啓動限制。 注意,因爲啓動頻率限制位於所有單元條件檢查之後,所以基於失敗條件的啓動不會計入啓動頻率限制的啓動次數之中。 注意, slice, target, device, scope 單元不受此選項的影響, 因爲這幾種單元要麼永遠不會啓動失敗、要麼只能成功啓動一次。
RebootArgument= 當 StartLimitAction= 或 FailureAction= 觸發關機動作時, 此選項的值就是傳遞給 reboot(2) 系統調用的字符串參數。 相當於 systemctl reboot 命令接收的可選參數。

ConditionArchitecture=,

ConditionVirtualization=

ConditionHost=

ConditionKernelCommandLine=

ConditionSecurity=

ConditionCapability=

ConditionACPower=

ConditionNeedsUpdate=

ConditionFirstBoot=

ConditionPathExists=

ConditionPathExistsGlob=

ConditionPathIsDirectory=

ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=

ConditionPathIsReadWrite=

ConditionDirectoryNotEmpty=

ConditionFileNotEmpty=

ConditionFileIsExecutable=

這組選項用於在啓動單元之前,首先測試特定的條件是否爲真。 若爲真則開始啓動,否則將會(悄無聲息地)跳過此單元(僅是跳過,而不是進入"failed"狀態)。 注意,即使某單元由於測試條件爲假而被跳過,那些由於依賴關係而必須先於此單元啓動的單元並不會受到影響(也就是會照常啓動)。 可以使用條件表達式來跳過那些對於本機系統無用的單元, 比如那些對於本機內核或運行環境沒有用處的功能。 如果想要單元在測試條件爲假時進入"failed"狀態(而不是跳過), 可以使用對應的另一組 AssertXXX= 選項(見下面)。
ConditionArchitecture= 檢測是否運行於特定的硬件平臺: x86, x86-64, ppc, ppc-le, ppc64, ppc64-le, ia64, parisc, parisc64, s390, s390x, sparc, sparc64, mips, mips-le, mips64, mips64-le, alpha, arm, arm-be, arm64, arm64-be, sh, sh64, m86k, tilegx, cris, native(編譯 systemd 時的目標平臺)。 可以在這些關鍵字前面加上感嘆號(!)前綴表示邏輯反轉。 注意,Personality= 的設置對此選項沒有任何影響。
ConditionVirtualization= 檢測是否運行於(特定的)虛擬環境中: qemu, kvm, zvm, vmware, microsoft, oracle, xen, bochs, uml, openvz, lxc, lxc-libvirt, systemd-nspawn, docker, rkt, vm(某種虛擬機), container(某種容器), yes(某種虛擬環境), no(物理機)。 參見 systemd-detect-virt(1) 手冊以瞭解所有已知的虛擬化技術及其標識符。 如果嵌套在多個虛擬化環境內, 那麼以最內層的那個爲準。 可以在這些關鍵字前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionHost= 檢測系統的 hostname 或者 "machine ID" 。 參數可以是一個主機名字符串(首尾可加引號界定), 或者是一個 "machine ID" 格式的字符串(首尾不可加引號), 參見 machine-id(5) 手冊。 可以在字符串前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionKernelCommandLine= 檢測是否設置了某個特定的內核引導選項。 參數可以是一個單獨的單詞,也可以是一個 "var=val" 格式的賦值字符串。 如果參數是一個單獨的單詞,那麼以下兩種情況都算是檢測成功: (1)恰好存在一個完全匹配的單詞選項; (2)在某個 "var=val" 格式的內核引導選項中等號前的 "var" 恰好與該單詞完全匹配。 如果參數是一個 "var=val" 格式的賦值字符串, 那麼必須恰好存在一個完全匹配的 "var=val" 格式的內核引導選項,纔算檢測成功。 可以在字符串前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionSecurity= 檢測是否啓用了特定的安全模塊: selinux, apparmor, ima, smack, audit 。 可以在這些關鍵字前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionCapability= 檢測 systemd 的 capability 集合中是否存在特定的 capabilities(7) 。 參數應設爲例如 "CAP_MKNOD" 這樣的 capability 名稱。 注意,此選項不是檢測特定的 capability 是否實際可用, 而是僅檢測特定的 capability 在綁定集合中是否存在。 可以在名稱前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionACPower= 檢測系統是否正在使用交流電源。 yes 表示至少在使用一個交流電源, 或者更本不存在任何交流電源。 no 表示存在交流電源, 但是沒有使用其中的任何一個。
ConditionNeedsUpdate= 可設爲 /var 或 /etc 之一, 用於檢測指定的目錄是否需要更新。 設爲 /var 表示 檢測 /usr 目錄的最後更新時間(mtime) 是否比 /var/.updated 文件的最後更新時間(mtime)更晚。 設爲 /etc 表示 檢測 /usr 目錄的最後更新時間(mtime) 是否比 /etc/.updated 文件的最後更新時間(mtime)更晚。 可以在值前面加上感嘆號(!)前綴表示邏輯反轉。 當更新了 /usr 中的資源之後,可以通過使用此選項, 實現在下一次啓動時更新 /etc 或 /var 目錄的目的。 使用此選項的單元必須設置 ConditionFirstBoot=systemd-update-done.service , 以確保在 .updated 文件被更新之前啓動完畢。 參見 systemd-update-done.service(8) 手冊。
ConditionFirstBoot= 可設爲 yes 或 no 。 用於檢測 /etc 目錄 是否處於未填充的原始狀態 (也就是系統出廠後的首次啓動)。 此選項可用於系統出廠後,首次開機時執行必要的初始化操作。
ConditionPathExists= 檢測指定的路徑是否存在, 必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionPathExistsGlob= 與 ConditionPathExists= 類似, 唯一的不同是支持通配符。
ConditionPathIsDirectory= 檢測指定的路徑是否存在並且是一個目錄,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionPathIsSymbolicLink= 檢測指定的路徑是否存在並且是一個軟連接,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionPathIsMountPoint= 檢測指定的路徑是否存在並且是一個掛載點,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionPathIsReadWrite= 檢測指定的路徑是否存在並且可讀寫(rw),必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionDirectoryNotEmpty= 檢測指定的路徑是否存在並且是一個非空的目錄,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionDirectoryNotEmpty= 檢測指定的路徑是否存在並且是一個非空的目錄,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionFileNotEmpty= 檢測指定的路徑是否存在並且是一個非空的普通文件,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。
ConditionFileIsExecutable= 檢測指定的路徑是否存在並且是一個可執行文件,必須使用絕對路徑。 可以在路徑前面加上感嘆號(!)前綴表示邏輯反轉。



[Install] 段:

這個段包含單元啓動信息,只有單元狀態爲enable或者disabled纔會用到這個段,這個段不能出現在單元的.d/*.conf配置文件中。

字段 說明
Alias= 啓用時使用的別名,可以設爲一個空格分隔的別名列表。 每個別名的後綴(也就是單元類型)都必須與該單元自身的後綴相同。 如果多次使用此選項,那麼每個選項所設置的別名都會被添加到別名列表中。 在啓用此單元時,systemctl enable 命令將會爲每個別名創建一個指向該單元文件的軟連接。 注意,因爲 mount, slice, swap, automount 單元不支持別名,所以不要在這些類型的單元中使用此選項。

WantedBy=

RequiredBy=

接受一個空格分隔的單元列表, 表示在使用 systemctl enable 啓用此單元時, 將會在每個列表單元的 .wants/ 或 .requires/ 目錄中創建一個指向該單元文件的軟連接。 這相當於爲每個列表中的單元文件添加了 Wants=此單元 或 Requires=此單元 選項。 這樣當列表中的任意一個單元啓動時,該單元都會被啓動。 有關 Wants= 與 Requires= 的詳細說明, 參見前面 [Unit] 小節的說明。 如果多次使用此選項,那麼每個選項的單元列表都會合並在一起。

這個選項跟啓動級別有關,通常設置的值爲mult-user.targe 這是一個target,之後再講,你只需要知道這相當於啓動級別中的多用戶默認。

Also=

設置此單元的附屬單元,可以設爲一個空格分隔的單元列表。 表示當使用 systemctl enable 啓用 或 systemctl disable 停用 此單元時, 也同時自動的啓用或停用附屬單元。如果多次使用此選項, 那麼每個選項所設置的附屬單元列表都會合並在一起。

DefaultInstance= 僅對模板單元有意義, 用於指定默認的實例名稱。 如果啓用此單元時沒有指定實例名稱, 那麼將使用這裏設置的名稱。


參考鏈接:systemd.unit中文手冊

本文出自 “小惡魔的家” 博客,請務必保留此出處http://littledevil.blog.51cto.com/9445436/1912489

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