systemd服務內容詳解

2021-09-08 05:17:28 字數 4745 閱讀 5188

systemd服務內容詳解

systemd是linux下的一種init軟體,由lennart poettering帶頭開發,並在lgpl 2.1及其後續版本許可證下開源發布。其開發目標是提供更優秀的框架以表示系統服務間的依賴關係,並依此實現系統初始化時服務的並行啟動,同時達到降低shell的系統開銷的效果,最終代替現在常用的system v與bsd風格init程式。

傳統的system v是序列啟動,即在啟動下乙個指令碼前,上乙個指令碼必須執行完,這樣在啟動時間上會有很大的浪費。在這個時間就是金錢的年代,這種啟動方式必將被淘汰。 首先是ubuntu 最先造反,啟用了自己的upstart啟動方式,upstart基於事件觸發,但還是序列啟動,但是對於沒有必要的服務就不會啟動。

這時 systemd出現了,主要優點就是並行啟動,節約啟動時間,systemd作者曾口出狂言,最快2秒啟動

相比以前的system v啟動方式有以下優化:

• 採用socket啟用式與匯流排啟用式服務,以提高相互依賴的各服務的並行執行效能;

• 用cgroups代替pid來追蹤程序,以此即使是兩次fork之後生成的守護程序也不會脫離systemd的控制

一:傳統的啟動是核心啟動完後,首先執行的第乙個程序是/sbin/init。

如果要以systemd方式啟動,則首先讓核心執行的第乙個程序是/lib/systemd/systemd或者/usr/lib/systemd/systemd.

方法是在grub介面輸入init=/lib/systemd/systemd

二:systemd啟動後,首先會去三個目錄下找相應的配置檔案,按優先順序從高到底為/etc/systemd/,/usr/lib/systemd/

和/lib/systemd/,優先順序高的配置檔案會覆蓋優先順序低的配置檔案

三:systemd的配置檔案又叫unit檔案,主要有以下幾種

service :守護程序的啟動、停止、重啟和過載是此類 unit 中最為明顯的幾個型別。

socket :此類 unit 封裝系統和網際網路中的乙個 socket 。當下,systemd 支援流式、資料報和連續包的 af_inet、af_inet6、af_unix socket 。也支援傳統的 fifos 傳輸模式。每乙個 socket unit 都有乙個相應的服務 unit 。相應的服務在第乙個「連線」進入 socket 或 fifo 時就會啟動(例如:nscd.socket 在有新連線後便啟動 nscd.service)。

device :此類 unit 封裝乙個存在於 linux 裝置樹中的裝置。每乙個使用 udev 規則標記的裝置都將會在 systemd 中作為乙個裝置 unit 出現。udev 的屬性設定可以作為配置裝置 unit 依賴關係的配置源。

mount :此類 unit 封裝系統結構層次中的乙個掛載點。

automount :此類 unit 封裝系統結構層次中的乙個自掛載點。每乙個自掛載 unit 對應乙個已掛載的掛載 unit (需要在自掛載目錄可以訪問的情況下盡早掛載)。

target :此類 unit 為其他 unit 進行邏輯分組。它們本身實際上並不做什麼,只是引用其他 unit 而已。這樣便可以對 unit 做乙個統一的控制。(例如:multi-user.target 相當於在傳統使用 sysv 的系統中執行級別5);bluetooth.target 只有在藍芽介面卡可用的情況下才呼叫與藍芽相關的服務,如:bluetooth 守護程序、obex 守護程序等)

snapshot :與 target unit 相似,快照本身不做什麼,唯一的目的就是引用其他 unit 。

四:systemd啟動的第乙個unit檔案為/lib/systemd/system/下的default.target檔案(這裡的default.target一般為鏈結文

件,這樣default.target指向不同的檔案,可達到不同的啟動等級)

例: root@archiso /lib/systemd/system # ls default.target –al

lrwxrwxrwx 1 root root 16 may 30 12:55 default.target -> graphical.target

可以看到,default.target指向graphical.target這個檔案,graphical.target表示圖形介面這個等級

graphical.target其內容如下:

# this file is part of systemd.

[unit]

description=graphical inte***ce

documentation=man:systemd.special(7)

requires=multi-user.target

wants=display-manager.service

conflicts=rescue.service rescue.target

after=multi-user.target rescue.service rescue.target display-manager.service

allowisolate=yes

description= :一些描述,顯示給使用者介面看的,可以是任何字串,一般是關於服務的說明。

documentation=  :指定參考文件的列表。

requires=   :指定graphical.target依賴於multi-user.target這個服務,如果graphical.target被啟用,那麼 requires 後面

的multi-user.target服務也會被啟用,反之,如果 requires 後面的multi-user.target服務被停止或無法啟動,則graphical.target

服務也會停止。這個選項可以指定多次,那麼就要求所有指定的服務都被啟用。

after= :表示啟動完multi-user.target後,再啟動graphical.target。同時還有before= :表示啟動完本服務後,再啟動before後面

的服務。

conflicts= :配置乙個依賴衝突,當rescue.target服務啟動時,graphical.target服務停止,反過來,graphical.target服務啟動,

那麼rescue.targe就會停止。

wants= :相對弱化的 requires= ,display-manager.target會被啟動,但如果無法啟動或無法新增到事務處理,並不影

響graphical.target服務做為乙個整體的啟動。

allowisolate= :布林值。如果是真值,則此服務可以使用 systemctl isolate 命令進行操作。否則會拒絕此操作。預設值是假。

alias=  :在安裝使用應該使用的別名。名字必須和服務本身有同樣的字尾(即同樣的型別)。這個選項可以指定多次,所有的

名字都起作用,當執行 systemctl enable 命令時,會建立相當的鏈結

服務檔案還可能包含乙個 [install] 段,這個段的內容服務的安裝資訊。它不在 systemd 的執行期間使用。只在使用 systemctl enable 和 systemctl disable 命令啟用/禁用服務時有用。

alias=  :在安裝使用應該使用的額外名字(即別名)。名字必須和服務本身有同樣的字尾(即同樣的型別)。這個選項可以指定多次,所有的名字都起作用,當執行 systemctl enable 命令時,會建立相當的鏈結。

wantedby=, requiredby= :在 .wants/ 或 .requires/ 子目錄中為服務建立相應的鏈結。這樣做的效果是當列表中的服務啟動,本服務也會啟動。 在  bar.service 中的 wantedby=foo.service  和 alias=foo.service.wants/bar.service 基本是乙個意思。

also=  :當此服務安裝時同時需要安裝的附加服務。 如果使用者請求安裝的服務中配置了此項,則 systemctl enable 命令執行時會自動安裝本項所指定的服務。

在 [install] 段使用這些字串有特定含義: %n, %n, %p, %i, %u, %u, %m, %h, %b. 詳細資訊看下一段。、

特殊字串

許多設定支援使用特殊的字串,可以在執行或載入時替換成特定的內容。下表是支援的字串。

字串 簡介 詳細資訊

%n 完整的服務名稱

%n 不轉義的完整服務名稱

%p 字首名 對於例項化的服務,這是前@前面的部分,對於其它的服務,是指去掉字尾(即型別)的部分。

%p 不轉義的字首名

%i 例項名稱 對於例項化的服務,這是指 @和字尾之間的部分。

%i 不轉義的例項名。

%f 不轉義的檔名。 這可以不轉義的例項名(如果可用)或字首名,帶有/字首。

%c 服務的控制組路徑。?

%r systemd 的根控制組路徑。?

%r systemd 的根控制組路徑的父目錄。

%t 執行時 socket 目錄。 這可以是 /run (系統管理器) 或 $xdg_runtime_dir (使用者管理器).

%u 使用者名稱 這是服務配置的使用者或systemd執行例項的使用者(如果沒有配置的話)。

%u 使用者 uid 這是服務配置的使用者uid或systemd執行例項的使用者uid(如果沒有配置的話)

%h 使用者家目錄 這是服務配置的使用者家目錄或systemd執行例項的使用者家目錄(如果沒有配置的話)

%s 使用者shell 這是服務配置的使用者shell或systemd執行例項的使用者shell(如果沒有配置的話)

%m 機器 id 執行系統的機器 id ,格式是乙個字串。

%b 啟動 id 執行系統的啟動 id ,格式是乙個字串。.

%h 主機名 執行系統的主機名。

%% 轉義 % 乙個單百分號.

Systemd 自帶服務檢測重啟

1.最簡單的自動檢測重啟 vim etc systemd system mysqld.service unit description mysql server by xdd after network.target after syslog.target install wantedby mult...

使用systemd管理swoole服務

systemd 是 linux 系統中新一代的初始化系統 init 它主要的設計目標是克服 sysvinit 固有的缺點,提高系統的啟動速度。很多新的linux發行版已經使用systemd取代了init,作為初始守護程序。swoole的伺服器程式可以編寫一段service指令碼,交由systemd進...

使用systemd 指令碼設定服務keepalive

systemd是linux下的一種init軟體,由lennart poettering帶頭開發,其開發目標是提供更優秀的框架以表示系統服務間的依賴關係,並依此實現系統初始化時服務的並行啟動,同時達到降低shell的系統開銷的效果,最終代替現在常用的system v與bsd風格init程式。傳統sys...