首頁 > 軟體

linux 系統程序管理工具systemd詳解(systemctl命令、建立自己的systemd服務)

2022-12-15 14:04:29

linux systemd

什麼是 systemd

Linux 系統在啟動過程中,核心完成初始化以後,由核心第一個啟動的程式便是 init 程式,路徑為 /sbin/init(為一個軟連線,連結到真實的 init 程序),其 PID 為1,它為系統裡所有程序的“祖先”,Linux 中所有的程序都由 init 程序直接或間接進行建立並執行,init 程序以守護行程的方式存在,負責組織與執行系統的相關初始化工作,讓系統進入定義好的執行模式,如命令列模式或圖形介面模式。

Systemd(系統管理守護行程),最開始以GNU GPL協定授權開發,現在已轉為使用GNU LGPL協定,它是如今討論最熱烈的引導和服務管理程式。如果你的Linux系統設定為使用Systemd載入程式,它取替傳統的SysV init,啟動過程將交給systemd處理。Systemd的一個核心功能是它同時支援SysV init的後開機啟動指令碼。

systemd是目前Linux系統上主要的系統守護行程管理工具,由於init一方面對於程序的管理是序列化的,容易出現阻塞情況,另一方面init也僅僅是執行啟動指令碼,並不能對服務本身進行更多的管理。所以從CentOS 7開始也由systemd取代了init作為預設的系統程序管理工具

systemd 是核心啟動後的第一個使用者程序,PID 為1,是所有其它使用者程序的父程序。

systemd 特點

  • 最新系統都採用systemd管理(RedHat7,CentOS7,Ubuntu20.04…)
  • CentOS7 支援開機並行啟動服務,顯著提高開機啟動效率
  • CentOS7關機只關閉正在執行的服務,而CentOS6,全部都關閉一次。
  • CentOS7服務的啟動與停止不再使用指令碼進行管理,也就是/etc/init.d下不在有指令碼。
  • CentOS7使用systemd解決原有模式缺陷,比如原有service不會關閉程式產生的子程序

unit(單元)

系統初始化需要做的事情非常多。需要啟動後臺服務,比如啟動 ssh 服務;需要做設定工作,比如掛載檔案系統。這個過程中的每一步都被 systemd 抽象為一個設定單元,即 unit。可以認為一個服務是一個設定單元,一個掛載點是一個設定單元,一個交換分割區的設定是一個設定單元等等。

下面是一些常見的 unit 型別:

  • service :代表一個後臺服務程序,比如 MySQLd。這是最常用的一類。
  • socket :此類設定單元封裝系統和網際網路中的一個通訊端 。當下,systemd 支援流式、資料包和 連續包的 AF_INET、AF_INET6、AF_UNIX socket 。每一個通訊端設定單元都有一個相應的服務設定單元 。相應的服務在第一個"連線"進入通訊端時就會啟動(例如:nscd.socket 在有新連線後便啟動 nscd.service)。
  • device :此類設定單元封裝一個存在於 Linux 裝置樹中的裝置。每一個使用 udev 規則標記的裝置都將會在 systemd 中作為一個裝置設定單元出現。
  • mount :此類設定單元封裝檔案系統結構層次中的一個掛載點。Systemd 將對這個掛載點進行監控和管理。比如可以在啟動時自動將其掛載;可以在某些條件下自動解除安裝。Systemd 會將 /etc/fstab 中的條目都轉換為掛載點,並在開機時處理。
  • automount :此類設定單元封裝系統結構層次中的一個自掛載點。每一個自掛載設定單元對應一個掛載設定單元 ,當該自動掛載點被存取時,systemd 執行掛載點中定義的掛載行為。
  • swap:和掛載設定單元類似,交換設定單元用來管理交換分割區。使用者可以用交換設定單元來定義系統中的交換分割區,可以讓這些交換分割區在啟動時被啟用。
  • target :此類設定單元為其他設定單元進行邏輯分組。它們本身實際上並不做什麼,只是參照其他設定單元而已。這樣便可以對設定單元做一個統一的控制。這樣就可以實現大家都已經非常熟悉的執行級別概念。比如想讓系統進入圖形化模式,需要執行許多服務和設定命令,這些操作都由一個個的設定單元表示,將所有這些設定單元組合為一個目標(target),就表示需要將這些設定單元全部執行一遍以便進入目標所代表的系統執行狀態。 (例如:multi-user.target 相當於在傳統使用 SysV 的系統中執行級別 5)
  • timer:定時器設定單元用來定時觸發使用者定義的操作,這類設定單元取代了 atd、crond 等傳統的定時服務。
  • snapshot :與 target 設定單元相似,快照是一組設定單元。它儲存了系統當前的執行狀態。
  • path:檔案系統中的一個檔案或目錄。
  • scope:用於 cgroups,表示從 systemd 外部建立的程序。
  • slice:用於 cgroups,表示一組按層級排列的單位。slice 並不包含程序,但會組建一個層級,並將 scope 和 service 都放置其中。
  **每個設定單元都有一個對應的組態檔,系統管理員的任務就是編寫和維護這些不同的組態檔,比如一個 MySQL 服務對應一個 mysql.service 檔案。**
  • .automount:用於控制自動掛載檔案系統,相當於 SysV-init 的 autofs 服務
  • .device:對於 /dev 目錄下的裝置,主要用於定義裝置之間的依賴關係
  • .mount:定義系統結構層次中的一個掛載點,可以替代過去的 /etc/fstab 組態檔
  • .path:用於監控指定目錄或檔案的變化,並觸發其它 Unit 執行
  • .scope:這種 Unit 檔案不是使用者建立的,而是 Systemd 執行時產生的,描述一些系統服務的分組資訊
  • .service:封裝守護行程的啟動、停止、重啟和過載操作,是最常見的一種 Unit 檔案
  • .slice:用於表示一個 CGroup 的樹,通常使用者不會自己建立這樣的 Unit 檔案
  • .snapshot:用於表示一個由 systemctl snapshot 命令建立的 Systemd Units 執行狀態快照
  • .socket:監控來自於系統或網路的資料訊息,用於實現基於資料自動觸發服務啟動
  • .swap:定義一個使用者做虛擬記憶體的交換分割區
  • .target:用於對 Unit 檔案進行邏輯分組,引導其它 Unit 的執行。它替代了 SysV-init 執行級別的作用,並提供更靈活的基於特定裝置事件的啟動方式
  • .timer:用於設定在特定時間觸發的任務,替代了 Crontab 的功能

systemd unit目錄

Unit 檔案按照 Systemd 約定,應該被放置指定的三個系統目錄之一中。這三個目錄是有優先順序的,如下所示,越靠上的優先順序越高。因此,在三個目錄中有同名檔案的時候,只有優先順序最高的目錄裡的那個檔案會被使用。

/etc/systemd/system:系統或使用者自定義的組態檔
/run/systemd/system:軟體執行時生成的組態檔
/usr/lib/systemd/system:系統或**第三方軟體安裝時新增的組態檔**。

Systemd 預設從目錄 /etc/systemd/system/ 讀取組態檔。但是,裡面存放的大部分檔案都是符號連結,指向目錄 /usr/lib/systemd/system/,真正的組態檔存放在那個目錄。

Unit 和 Target

Target 就是一個 Unit 組,包含許多相關的 Unit 。

Unit 是 Systemd 管理系統資源的基本單元,可以認為每個系統資源就是一個 Unit,並使用一個 Unit 檔案定義。在 Unit 檔案中需要包含相應服務的描述、屬性以及需要執行的命令。

Unit 檔案結構

systemd.service 中文手冊
參考URL:

每一個服務以.service結尾,一般會分為3部分:[Unit]、[Service]和[Install]

  • [Unit]:記錄unit檔案的通用資訊。
  • [Service]:記錄Service的資訊
  • [Install]:安裝資訊。

把自己的服務使用systemd管理需要書寫*.service檔案,如服務名xxx.service,下面我們介紹一下*.service檔案裡面具體的內容。
進入目錄 cd /etc/systemd/system/

cat << EOF > /etc/systemd/system/xxx.service
[Unit]
Description=Xxx Service
Documentation=https://www.secureweb3.com/
After=network-online.target
Wants=network-online.target

[Service]
User=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=+$APPROOT/xxx
Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target
EOF

  • Description:描述這個 Unit 檔案的資訊
  • Documentation:指定服務的檔案,可以是一個或多個檔案的 URL 路徑
  • Requires:依賴的其它 Unit 列表,列在其中的 Unit 模板會在這個服務啟動時的同時被啟動。並且,如果其中任意一個服務啟動失敗,這個服務也會被終止
  • Wants:與 Requires 相似,但只是在被設定的這個 Unit 啟動時,觸發啟動列出的每個 Unit 模組,而不去考慮這些模板啟動是否成功
  • After:與 Requires 相似,但是在後面列出的所有模組全部啟動完成以後,才會啟動當前的服務
  • network-online.target是主動等待直到網路“啟動”的target,其中“啟動”的定義

network.target代表有網路,network-online.target代表一個連通著的網路。

[service]

  • User: 指定使用者執行CapabilityBoundingSet: 能力邊界設定,可以設定哪些能力
  • capability

美: [ˌkeɪpəˈbɪləti]
英: [.keɪpə’bɪləti]
n. 能力;才能;(國家的)軍事力量
網路 效能;容量;才幹

bound
美: [baʊnd]
英: [baʊnd]
n. 邊界;跳躍;範圍;界限
v. 跳躍;鄰接;“bind”的過去分詞和過去式;限制
adj. 打算;要往(某處)去的;被束縛的;理應…的
網路 彈跳;邊邊界框;彈跳力

CAP_NET_ADMIN
執行各種與網路相關的操作:
* 介面設定;
* 管理 IP 防火牆、偽裝和
會計;
* 修改路由表;
*繫結到任何地址以進行透明代理;
* 設定服務型別 (TOS);
* 清除驅動程式統計資訊;
* 設定混雜模式;
*啟用多播;
* 使用setsockopt(2)設定以下通訊端選項:
SO_DEBUG、SO_MARK、SO_PRIORITY(對於優先順序外
範圍 0 到 6)、SO_RCVBUFFORCE和SO_SNDBUFFORCE。

   CAP_NET_BIND_SERVICE
          將通訊端繫結到 Internet 域特權埠(埠
          小於 1024 的數位)。
  • NoNewPrivileges=true
  • ExecStart: 定義啟動程序時執行的命令
  • Restart= 設為on-failure, on-watchdog, on-abnormal, always 之一, 可以實現在失敗狀態下的自動重啟該服務。
  • RestartPreventExitStatus中列出的退出碼或者訊號永遠不會導致該服務被重啟。

[Install]

  • WantedBy欄位:表示該服務所在的 Target。

Target的含義是服務組,表示一組服務。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。

這個設定非常重要,因為執行systemctl enable sshd.service命令時,sshd.service的一個符號連結,就會放在/etc/systemd/system目錄下面的multi-user.target.wants子目錄之中。

一般來說,常用的 Target 有兩個:一個是multi-user.target,表示多使用者命令列狀態;另一個是graphical.target,表示圖形使用者狀態,它依賴於multi-user.target。

Linux命令——systemctl

Systemd 入門教學:實戰篇
參考URL: https://www.jb51.net/article/269756.htm
Linux命令——systemctl
參考URL:https://www.jb51.net/article/269756.htm

systemd對應的程序管理命令就是systemctl。

systemctl   [command]    [unit](設定的應用名稱)
 
command可選項· 
start:啟動指定的unit         systemctl start nginx
stop:關閉指定的unit          systemctl stop nginx
restart:重啟指定unit         systemctl restart nginx
reload:過載指定unit          systemctl reload nginx
enable:系統開機時自動啟動指定unit,前提是組態檔中有相關設定 systemctl enable nginx
disable:開機時不自動執行指定unit  systemctl disable nginx
status:檢視指定unit當前執行狀態   systemctl status nginx

參考

Systemd 入門教學:實戰篇
參考URL: https://www.jb51.net/article/269756.htm

到此這篇關於linux 系統程序管理工具systemd詳解(systemctl命令、建立自己的systemd服務)的文章就介紹到這了,更多相關linux 程序管理工具systemd內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com