CentOS 7上的系統管理之:Systemd和systemctl

參考資料:html

Chapter 10. Managing Services with systemd Red Hat Enterprise Linux 7 | Red Hat Customer Portallinux

systemd - Wikipediashell

man手冊:systemd(1)和systemctl(1)apache

IBM developer works上,劉明老師關於CentOS 5/6/7的init系統的介紹bash

簡介

早期的CentOS 5系統上,使用的init系統是SysV init。這套系統運行穩定,使用shell腳本的形式,串行地一個個啓動進程,當前一個進程啓動完畢後,再啓動後一個。這種方式帶來的缺點是:服務器

  • 計算機的啓動速度很慢,後面的進程必須等待前面的進程依次串行地啓動完畢方可啓動。
  • 有的服務可能在啓動後很長的一段時間或者幾乎不會使用到,例如服務器中的打印服務。

發展到CentOS 6的時候,init系統換成了Upstart,這個系統有效的解決了上述的缺點,實現了並行啓動和按需啓動。網絡

而到了CentOS 7的時候,則出現了Systemd這套init系統,它更加完善了並行啓動和按需啓動,使得啓動的速度更上一層樓。這裏的按需啓動,指的是某個服務被設置爲開機啓動,當開機時該服務並無真正的啓動,只是註冊好了socket佔用,等待第一次有請求進來的時候,Systemd懸掛該請求而後啓動服務,服務啓動完畢後就恢復該請求,從而實現按需啓動,這種方式也變相加速了系統的啓動速度。併發

Systemd不只僅是一個服務,還能夠用於管理系統自身的方方面面,例如日誌、相似crond的任務調度程序(timer)、電源管理等等。app

Systemd支持向後兼容(backward compatible)SysV init的腳本等其餘的諸多特性,使得其目前在慢慢成爲Linux發行版的一種標準,這是一件好事。運維

這篇文章所能闡述的也只是Systemd的皮毛而已。主要描述了運維人員在平常使用中應該掌握的systemctl命令,以及如何閱讀unit文件以及尋找幫助。

Unit

在Systemd中使用配置文件來進行管理,這些配置文件叫作unit。unit有許許多多的類型,以下。

Unit 類型 文件擴展名 描述
Service unit .service 用於管理系統的服務unit,最經常使用,通常由所安裝的服務所提供(httpd、MySQL等)
Target unit .target target unit表示的是指望系統運行於哪一個狀態下,用戶的目標是什麼。好比運行於支持圖形顯示的狀態下,那麼它除了能夠提供CLI的shell界面之外,還須要額外啓用許多服務等組件用於支持圖形界面,這些組件也是一個個的unit,因此target就是多個unit的集合(這些unit之間還有前後和依賴關係)。所以,target就是用來模擬之前的運行級別(runlevel)的概念。
Automount unit .automount 文件系統自動掛載點。
Device unit .device 一個被內核所識別的設備文件。
Mount unit .mount 一個文件系統的掛載點。
Path unit .path 文件系統中的一個文件或目錄。
Scope unit .scope 一個外部建立的進程。
Slice unit .slice 一組用於管理系統進程的分層組織的單元。
Snapshot unit .snapshop Systemd管理器所保存的一個狀態,所以稱之爲快照。
Socket unit .socket 一個進程間通訊(IPC)socket。
Swap unit .swap 一個swap設備或者swap文件。

Timer unit

.timer

一個Systemd timer。

Unit配置文件

unit文件存在於三個位置:

  • /usr/lib/systemd/system/:軟件程序包所提供的unit文件。例如httpd程序包提供了httpd.service文件。
  • /run/systemd/system/:運行時所建立的unit文件。優先級高於已安裝的服務unit文件所在的目錄。
  • /etc/systemd/system/:經過systemctl enable所建立的和用於擴展一個服務所添加的unit文件目錄。優先級高於運行時unit文件。

優先級:/etc/systemd/system/ --> /run/systemd/system/ --> /usr/lib/systemd/system/。

Systemd配置文件

/etc/systemd/system.conf是Systemd的配置文件,用戶能夠編輯此文件來修改值。想要恢復默認值的話直接刪除此文件便可。文件中每一個選項的做用能夠參考man手冊systemd-system.conf(5)。

主特性

  • 基於socket激活(socket-based):在引導時,系統針對全部支持這類激活的系統服務建立監聽socket,一旦服務啓動就將這些socket傳遞給它們。這不只容許systemd並行啓動服務,還使得服務在重啓的時候不會丟失任何在其服務不可用期間發送給它的消息(由於相關的socket仍然能夠訪問而且將全部的消息放入隊列中)。該特性須要使用socket unit。
  • 基於總線激活(bus-based):當第一次被客戶端程序訪問的時候,使用D-Bus用於IPC的系統服務能夠按需啓動。該特性須要使用D-Bus服務文件。
  • 基於設備激活(device-based):當某種特定的硬件設備被插入或者可用時,支持基於設備激活的系統服務能夠按需啓動。該特性須要使用device unit。
  • 基於路徑激活(path-based):當一個文件或者目錄改變其狀態時,支持基於路徑激活的系統服務能夠按需啓動。該特性須要使用path unit。
  • 掛載和自動掛載點管理:Systemd監視和管理掛載和自動掛載點。該特性須要使用mount和automount unit。
  • 進擊的並行性(aggressive parallelization):因爲具有基於socket激活的特性,只要全部監聽的socket準備就緒,systemd就能夠並行啓動服務。結合系統服務的按需激活特性,併發激活有效地減小了系統啓動的時間。
  • 支持事務的(transactional)unit激活邏輯:在激活或者關閉(deactivate)一個unit以前,systemd會計算它的依賴關係,建立一個臨時事務,驗證事務的一致性。當一個事務出現不一致的狀況時,systemd會在其報錯以前嘗試去校對它並從中移除一些不重要的工做。
  • 向後兼容(backward compatibility)SysV init:支持遵循LSB標準的SysV init腳本。

兼容性變化

Systemd在設計的時候儘量作到與SysV和Upstart兼容,不過仍是有一些點是不一樣的,須要留意:

  • Systemd對於運行級別的支持是有限的,並非全部的運行級別都支持。其對於運行級別的支持是經過target unit來實現的,相似一種映射關係,例如graphical.target映射到runlevel5。systemd程序包在發行的時候包含了runlevel命令,不過用戶因該儘可能避免使用該命令。
  • systemctl程序不支持自定義子命令。在CentOS 6的SysV init腳本中,除了支持start、stop和restart這些基礎子命令之外,腳本做者還能夠撰寫任何本身但願實現的功能實現額外的子命令。例如RHEL 6中的iptables腳本支持panic子命令,該子命令告訴系統進入panic模式,丟棄全部的流入和流出的數據包。而systemctl,僅支持文檔中列出的子命令。
  • 非由systemd所啓動的服務,沒法收到systemctl管理。當使用systemd啓動服務的時候,systemd會記錄並追蹤服務的主進程PID,systemctl命令經過該PID來管理服務進程。若用戶經過程序的CLI程序啓動服務的話,那麼systemd就沒法獲取並追蹤該PID了。
  • Systemd只能中止運行中的服務。在之前,RHEL 6和以往的版本中,系統使用【/etc/rc0.d/】中的字符連接來關閉全部可用的服務而不關心它們的狀態。在systemd中,只有運行中的服務會被關閉了。
  • 系統服務沒法從標準輸入流中讀取數據。當systemd啓動一個服務的時候,會將/dev/null和服務的STDIN關聯起來,使得用戶沒法與其交互。
  • 系統服務不會從調用它們的用戶和會話中繼承任何上下文(context,例如HOME和PATH這類環境變量)。每一個服務運行在一個乾淨的執行上下文中。
  • 當加載一個SysV init腳本的時候,systemd從LSB頭中讀取依賴關係並在運行時解釋。
  • Systemd的服務unit有一個代碼寫死的5分鐘超時時長,用於處理那些運行出現故障的服務。這個時長能夠在獨立的服務類unit文件中修改。

 

管理服務

在SysV init和Upstart中,使用【/etc/rc.d/init.d/】下的shell腳本(通常是bash)來管理服務,使用的命令是service和chkconfig。在Systemd中使用service類型的unit文件(.service文件)來管理,使用的命令統一爲systemctl。

因爲向後兼容的特性的存在,舊命令依然可用,可是官方並不建議。新舊命令的對應關係以下。

service命令和systemctl命令對照表,service命令用於管理一個服務的啓動和中止。

service  systemctl  描述 
 service name start  systemctl start name.service  啓動一個服務
 service name stop  systemctl stop name.service  中止一個服務
 service name restart  systemctl restart name.service  重啓一個服務
 service name condrestart  systemctl try-restart name.serivce  只有當服務處於運行狀態時才重啓服務
 service name reload  systemctl reload name.service  重載服務,通常用於配置文件的修改後執行
 serivce name status

 systemctl status name.service

 systemctl is-active name.service

 查看服務的運行狀態
 service --status-all  systemctl list-units --type service --all  查看全部服務的運行狀態

chkconfig命令和systemctl命令對照表,chkconfig命令用於管理服務的開機啓動狀況以及將服務歸入chkconfig管理。

chkconfig systemctl 描述
 chkconfig name on  systemctl enable name.service  使服務開機啓動
 chkconfig name off  systemctl disable name.service  禁止服務開機啓動
 chkconfig --list name

 systemctl status name.service

 systemctl is-enable name.service

 查看服務是否開機啓動
 chkconfig --list  systemctl list-unit-files --type service  列出全部的服務並檢查其是否開機啓動
 chkconfig --list  systemctl list-dependencies --after  列出在指定的unit以前須要被啓動的服務
 chkconfig --list  systemctl list-dependencies --before  列出在指定的unit以後須要被啓動的服務

在書寫unit名稱的時候,通常是建議寫全名,這樣比較能顧名思義,例如「httpd.service」。不過簡寫,不寫unit類型後綴,那麼systemctl也是能夠識別的,以下2個命令的效果是同樣的,systemctl會自動識別unit類型。

~]# systemctl stop nfs-server.service ~]# systemctl stop nfs-server

unit的名稱若是比較長,能夠定義一個簡短的別名,想查看別名的話使用以下命令。show子命令能夠查看不少unit的信息。

[root@c7-server ~]# systemctl show httpd.service -p Names Names=httpd.service

若是結合chroot命令來運行systemctl命令的話,大部分命令是不可用的,除了systemctl enable和systemctl disable,詳見官方文檔

列出服務

列出全部當前已載入的服務。

[root@c7-server ~]# systemctl list-units --type service UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.service loaded active running ABRT Xorg log watcher ... ● kdump.service loaded failed failed Crash recovery kernel arming ...

UNIT:unit的完整名稱。

LOAD:加載的狀況。

ACTIVE:高級激活狀態。

SUB:低級激活狀態。這個狀態會取決於unit的類型有不一樣的狀態值。

DESCRIPTION:描述。

默認狀況下列出的是已激活的服務(不過從上述結果來看,狀態爲failed的也能夠被列出),想要查看已加載的全部狀態的服務的話,須要傳遞--all選項。

注:--type和--all均有縮寫版,爲了顧名思義,這裏儘可能都參照官方文檔,給出了完整版選項。

從結果上來看,LOAD狀態爲not-found的也能夠被列出。

[root@c7-server ~]# systemctl list-units --type service --all UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-vmcore.service                                   loaded    inactive dead    Harvest vmcores for ABRT ... ● apparmor.service not-found inactive dead apparmor.service ... ● kdump.service loaded failed failed Crash recovery kernel arming ...

查看全部已安裝的服務類unit單元,並可查看其是否開機啓動。

[root@c7-server ~]# systemctl list-unit-files UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static ... tmp.mount disabled ... cups.path enabled ... sssd-autofs.service indirect ...

顯示服務狀態

[root@c7-server ~]# systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:httpd(8) man:apachectl(8) [root@c7-server ~]# systemctl start httpd.service [root@c7-server ~]# systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2019-11-22 11:49:33 CST; 1s ago Docs: man:httpd(8) man:apachectl(8) Main PID: 3193 (httpd) Status: "Processing requests..." Tasks: 6 CGroup: /system.slice/httpd.service ├─3193 /usr/sbin/httpd -DFOREGROUND ├─3195 /usr/sbin/httpd -DFOREGROUND ├─3196 /usr/sbin/httpd -DFOREGROUND ├─3197 /usr/sbin/httpd -DFOREGROUND ├─3199 /usr/sbin/httpd -DFOREGROUND └─3201 /usr/sbin/httpd -DFOREGROUND Nov 22 11:49:32 c7-server systemd[1]: Starting The Apache HTTP Server... Nov 22 11:49:33 c7-server systemd[1]: Started The Apache HTTP Server.

服務處於啓動或中止的狀態時,有不一樣的狀態信息顯示。使用root用戶執行此命令,還能夠顯示日誌信息。

若是僅但願查看服務是否啓動,是否開機啓動的話,可以使用以下命令。

[root@c7-server ~]# systemctl is-active httpd.service active [root@c7-server ~]# systemctl is-enabled httpd.service disabled

啓動、中止和重啓等

~]# systemctl start httpd.service ~]# systemctl stop httpd.service ~]# systemctl restart httpd.service

若是服務本來是中止的狀態,則執行restart會啓用該服務。若是咱們但願只有當服務當前是啓動的狀態才重啓的話,那麼應該執行try-restart。

~]# systemctl try-restart httpd.service

某些服務支持在不打斷運行狀態的狀況下重載服務從而讀取配置文件。

~]# systemctl reload httpd.service

若是服務不支持重載的話,服務會忽略systemd的reload操做。爲了方便,確保修改的配置文件必定會生效,能夠執行以下2個子命令。

reload-or-restart:嘗試reload,若是服務不支持就restart。

reload-or-try-restart:嘗試reload,若是服務不支持就try-restart。若是服務自己沒啓動,那麼再執行了此命令後應該也不會啓動,須要手工啓動。啓動時,服務就會去讀取配置文件了。

~]# systemctl reload-or-restart httpd.service ~]# systemctl reload-or-try-restart httpd.service

開機啓動

~]# systemctl enable httpd.service ~]# systemctl disable httpd.service

當咱們設置開機啓動的時候,systemd會讀取服務的配置文件(/usr/lib/systemd/system/httpd.service)中的[Install]部分。

[Install] WantedBy=multi-user.target

根據此部分的內容建立字符連接。

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

若是服務自己是開機啓動的,那麼再執行一次enable的話並不會建立字符連接文件。想確保其必定建立的話,可以使用reenable。

~]# systemctl reenable httpd.service Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service. Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

關閉開機啓動,就是刪除字符連接了。

~]# systemctl disable httpd.service Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

systemd支持mask操做,若是一個服務被mask了,那麼它沒法被手動啓動或者被其餘服務所啓動,也沒法被設置爲開機啓動。

[root@c7-server ~]# systemctl mask httpd.service Created symlink from /etc/systemd/system/httpd.service to /dev/null. [root@c7-server ~]# systemctl start httpd.service Failed to start httpd.service: Unit is masked. [root@c7-server ~]# systemctl enable httpd.service Failed to execute operation: Cannot send after transport endpoint shutdown

可以使用unmask來取消mask。

~]# systemctl unmask httpd.service Removed symlink /etc/systemd/system/httpd.service.

啓動一個衝突的服務

在systemd中存在積極的(positive)依賴和消極的(negative)依賴。啓動某個特定的服務,可能會要求啓動一個或多個其餘服務(此爲積極的依賴),或者要求中止一個或多個其餘服務(此爲消極的依賴)。

當你嘗試啓動某個服務的時候,systemd會自動解決這些依賴關係。注意,systemd不會顯式通知用戶。若是你已經啓動了一個服務A(好比postfix),而後你嘗試啓動服務B(好比sendmail),服務B和服務A有消極的依賴關係,那麼當你啓動服務B的時候,服務A會自動被中止。

注:sendmail和postfix都是郵件服務,之間存在消極的依賴關係。

 

TARGET

Systemd上使用target來模仿之前的運行級別的概念。不過要注意,這只是模仿,並不表明徹底同樣。target能夠看做是一系列的unit的集合從而實現某個運行級別的功能。而且這些target之間會存在一個依賴鏈的關係。例如想啓動圖形界面(graphical.target)的話,就須要啓動圖形服務(gdm.service)或者帳戶服務(accounts-daemon.service)而且須要激活multi-user.target。一樣地,multi-user.target須要啓動網絡服務(NetworkManager.service)或者D-Bus(dbus.service)並激活basic.target。basic.target也有本身的依賴。

運行級別和target的對應關係以下表。

運行級別 Target Units 描述
0 runlevel0.target, poweroff.target 關閉系統並關閉電源
1 runlevel1.target, rescue.target 救援模式
2 runlevel2.target, multi-user.target 非圖形的多用戶模式
3 runlevel3.target, multi-user.target 非圖形的多用戶模式
4 runlevel4.target, multi-user.target 非圖形的多用戶模式
5 runlevel5.target, graphical.target 帶圖形的多用戶模式
6 runlevel6.target, reboot.target 重啓

查看、切換運行級別/target的新舊命令以下表所示,應儘可能避免使用舊的命令。

舊命令 新命令 描述
runlevel systemctl list-units --type target 查看當前系統運行於哪一個target下
telinit runlevel systemctl isolate name.target 修改當前的target

查看默認target

~]# systemctl get-default graphical.target

這個值的獲取,實際上是去檢索字符連接。

~]# ls -l /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 36 Oct 17 15:06 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target

查看當前target

~]# systemctl list-units --type target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Local Encrypted Volumes getty-pre.target loaded active active Login Prompts (Pre) getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target      loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network nfs-client.target loaded active active NFS client services nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rpc_pipefs.target loaded active active rpc_pipefs.target slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers

這個命令查詢出來的,是當前已加載並激活的target。那麼咱們如何從裏面找到當前的target是什麼呢?

在bootup(7)的man手冊中有描述,並非全部的unit都是並行啓動的,局部並行,總體依然是有前後次序之分的。例如:

sysinit.target --> basic.target --> multi-user.target --> graphical.target

rescue.target和emergency.target應該都是單獨出現,也就是說:

見到rescue.target或者emergency.target或者graphical.target,那麼就是對應的target,這三者之間不會有並存的關係。

見到multi-user.target,就看看有沒有graphical.target,沒有的話那就是multi-user.target。

設置默認target

~]# systemctl set-default multi-user.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

修改當前的target

相似於之前的切換運行級別。

~]# systemctl isolate multi-user.target

執行了該命令之後,我在Xshell的終端不會斷開,不過VMware中的虛擬機已經退出了GUI進入了CLI。

切換救援(rescue)模式

當正常的系統啓動流程失敗的時候,能夠進入救援模式。救援模式是一種單用戶的模式,用於讓用戶修復系統。在救援模式中,OS嘗試掛載全部的文件系統並啓動一些重要的系統服務,但它不會激活網絡服務也只容許單用戶同時登陸。相似於之前的單用戶模式。

~]# systemctl rescue

切換至救援模式之後,Xshell終端所有退出並沒有法登錄,並收到廣播通知。

Broadcast message from root@c7-server on pts/1 (Fri 2019-11-22 17:14:20 CST): The system is going down to rescue mode NOW!

若是管理員不想讓用戶收到這個通知,可使用--no-wall選項。

VMware控制檯退出登陸並要求root密碼從新登陸。

也可使用isolate子命令切換至救援模式,可是isolate的方式,不會向其餘用戶發送切換救援模式的通知。

~]# systemctl isolate recue.target

切換緊急(emergency)模式

緊急模式是最小化的系統環境,相比救援模式,它所提供的服務就更少了,僅用於當進入救援模式都失敗的時候。

緊急模式中,僅以只讀的方式掛載根文件系統,其餘的全部本地文件系統均不掛載,不會激活網絡服務,只啓動少量基本服務,須要root密碼。

一樣也支持isoloate切換方式和--no-walls選項。一樣會退出Xshell的終端,僅在VMware控制檯容許登陸。所以就不截圖了,貼命令便可。

~]# systemctl emergency ~]# systemctl emergency --no-walls ~]# systemctl isolate emergency.target

 

電源管理

在systemd中使用systemctl統一了電源管理,新舊命令對照表以下:

舊命令 新命令 描述
halt systemctl halt 中止系統
poweroff systemctl poweroff 關機
reboot systemctl reboot 重啓
pm-suspend systemctl suspend 懸掛系統
pm-hibernate systemctl hibernate 休眠系統
pm-suspend-hybrid systemctl hybrid-sleep 休眠並懸掛系統

關機

在Linux中,關閉系統指的是halt,它會中止全部的進程以及CPU,可是並無關閉掉電源。而poweroff則比較接近於咱們所理解的關機。

若是在VMware中halt了一個系統,那麼它會提示你須要手工關閉計算機的電源纔可完成關機。而poweroff則不用。

 

 

所以在Linux環境下的關機,應該是使用poweroff來取代halt。

正確關機:

~]# systemctl poweroff

一樣,關機命令會向系統中的用戶發送消息,支持--no-wall選項不發送消息。

~]# systemctl poweroff --no-all

關機也能夠經過shutdown命令。雖然該命令也會調用systemctl來完成關機,可是它支持延時關機和取消延時關機。

~]# shutdown --poweroff hh:mm ~]# shutdown --halt +m ~]# shutdown -c

時間的參數,能夠修改成now,等同於+0,表示當即關機。

重啓

~]# systemctl reboot ~]# systemctl reboot --no-wall

懸掛和休眠

懸掛(suspend)指的是將系統的運行狀態保存在內存中同時伴隨內存模塊異常,並關閉機器中的大部分設備。當用戶回到計算機面前時,能夠從內存中恢復。因爲是從內存中恢復而且避免了再一次引導系統,所以它的恢復速度比休眠(hibernation)要快。

若是在懸掛期間電源出現故障,那麼系統的狀態就會丟失了。

~]# systemctl suspend

休眠(hibernate)和懸掛的做用類似,都是保存系統的狀態避免了再次從新引導系統,區別在於休眠是將系統的狀態保存在磁盤中。所以其恢復系統的速度較慢。

~]# systemctl hibernate

還有一個休眠並懸掛系統。

~]# systemctl hybrid-sleep

感受做爲運維,休眠和懸掛應該是不怎麼會在服務器上所使用的,所以瞭解下常見的關機和重啓操做便可。

 

建立和修改unit文件

建立和修改unit文件是理解systemd工做的重點和難點,對於服務的開發人員來講,應該是必備的技能。對於我目前的運維階段來講,只要達到會看便可,所以這裏先暫時留白,感興趣的能夠直接看開頭參考資料中的紅帽文檔。

Unit文件存在於文章開頭處提到的三個目錄,其中「/etc/systemd/system/」目錄是留給管理員自定義的,所以咱們自定義的unit文件建議放該目錄下。

Unit文件的文件名:

unit_name.type_extension

unit名和類型都是可替換的,合在一塊兒叫作完整(full)的unit文件名。

例如sshd有兩個常見的unit文件:sshd.service和sshd.socket。

若是咱們想對一個unit作選項補充的話,能夠新增一個「.d」目錄並在其下建立補充的配置文件。例如當咱們想爲sshd.service增長自定義的配置選項時,能夠建立sshd.service.d/custom.conf配置文件。詳見文檔

另外,還能夠存在「sshd.service.wants/」和「sshd.service.requires/」目錄,這些目錄下都是字符連接文件,連接到其餘的unit文件,以此來決定sshd.service的依賴關係。字符連接會自動產生,也可人爲建立。詳見文檔

瞭解unit文件的結構

Unit文件由典型的三部分構成:

  • [Unit]:包含通用的選項,不受unit類型所影響。這部分主要提供了unit的簡單描述信息,指定其行爲,定義其依賴關係。
  • [unit type]:這部分的選項,是和unit類型相關的。即若是是.service類的unit,就有其相關的特定選項。
  • [Install]:在經過systemctl enable或者disable的時候,所涉及到的選項。

[Unit]和[Install]的選項的完整參考手冊,可見systemd.unit(5);[unit type]的選項,則須要根據unit的類型來肯定。可經過如下命令查找對應的man手冊。

~]# man -k systemd ... systemd.scope (5) - Scope unit configuration systemd.service (5) - Service unit configuration systemd.slice (5) - Slice unit configuration systemd.snapshot (5) - Snapshot unit configuration systemd.socket (5) - Socket unit configuration ... systemd.swap (5) - Swap unit configuration systemd.target (5) - Target unit configuration ...

當編輯或者新建了unit的文件,須要使用該命令重載systemd,使其知曉。

~]# systemctl daemon-reload

 

總結

最後對於unit文件的具體描述比較少,在初級運維的時候可能就夠用了。可是在慢慢深刻後,對於系統的排錯或者須要開發服務的時候,就須要來了解這塊的內容了,到時候如有遇到再來補充。

相關文章
相關標籤/搜索