在Linux系統中創建和修改systemd單元文件教程

來源:文萃谷 6.73K

在Linux系統中創建和修改systemd單元文件教程

在Linux系統中創建和修改systemd單元文件教程

(1)單元文件概述

單元文件包含單元的指令和行為信息。在後台systemctl命令和單元文件一起工作。為了出色而正確的完成工作,系統管理員必須能夠手工編輯單元文件。一般系統管理員手工創建的單元文件建議存放在/etc/systemd/system/目錄下面。

單元配置文件的格式是:

unit__extension

這裏的unit_name代表單元名稱,type_extension代表單元類型。

單元文件可以作為附加的文件放置到一個目錄下面,比如為了定製ice服務,可以創建ice.d/文件,在文件中做一些自定義的配置。

同樣的,可以創建s/和ires/目錄。這些目錄包含sshd服務關聯服務的軟連接,在系統安裝的時候,這些軟連接或自動創建,也可以手工創建軟連接。

許多單元配置文件可以使用單元説明符--通配的字符串,可以在單元文件被引導的時候動態的被變量替換。這使創建一些通用的單元配置模版成為可能。

(2)理解單元文件結構

典型的單元文件包含三節:

[Unit]節,包含不依賴單元類型的一般選項,這些選型提供單元描述,知道單元行為,配置單元和其他單元的依賴性。

[unittype]節,如果單元有特定的類型指令,在unittype節這些指令被組織在一起。舉個例子,服務單元文件包含[Service]節,裏面有經常使用的服務配置。

[Install]節,包含systemctlenable或者disable的命令安裝信息。

1)[Unit]節選項

Description單元描述信息,這些文字信息在systemclstatus命令是會輸出。

Documentation單元文檔信息的URLs。

After定義在那些單元之後啟動,本單元只在制定的單元啟動之後啟動,不像Requires選項,After選項不明確激活特定的單元,Before選項則是有相反的功能。

Requires配置單元的依賴性,在Requires選項中的單元需要一起被激活,如果有一個單元啟動失敗,其他單元都不會被啟動。

Wants比Requires選項依賴性要弱很多,如果列表之中的的單元啟動失敗,不會對其他單元造成影響,這是推薦的建立自定義單元依賴性的方式。

Conflicts定義單元衝突關係,和Requires相反。

2)[unittype]類型是[Service]時的選項

Type配置單元進程在啟動時候的類型,影響執行和關聯選項的功能,可選的關鍵字是:

simple默認值,進程和服務的主進程一起啟動;

forking進程作為服務主進程的一個子進程啟動,父進程在完全啟動之後退出。

oneshot同simple相似,但是進程在啟動單元之後隨之退出。

dbus同simple相似,但是隨着單元啟動後只有主進程得到D-BUS名字。

notify同simple相似,但是隨着單元啟動之後,一個主要信息被sd_notify()函數送出。

idle同simple相似,實際執行進程的二進制程序會被延緩直到所有的單元的任務完成,主要是避免服務狀態和shell混合輸出。

ExecStart指定啟動單元的命令或者腳本,ExecStartPre和ExecStartPost節指定在ExecStart之前或者之後用户自定義執行的腳本。Type=oneshot允許指定多個希望順序執行的用户自定義命令。

ExecStop指定單元停止時執行的命令或者腳本。

ExecReload指定單元重新加載是執行的命令或者腳本。

Restart這個選項如果被允許,服務重啟的時候進程會退出,會通過systemctl命令執行清除並重啟的操作。

RemainAfterExit如果設置這個選擇為真,服務會被認為是在激活狀態,即使所以的進程已經退出,默認的值為假,這個選項只有在Type=oneshot時需要被配置。

3)[Install]節選項

Alias為單元提供一個空間分離的附加名字。

RequiredBy單元被允許運行需要的一系列依賴單元,RequiredBy列表從Require獲得依賴信息。

WantBy單元被允許運行需要的弱依賴性單元,Wantby從Want列表獲得依賴信息。

Also指出和單元一起安裝或者被協助的單元。

DefaultInstance實例單元的限制,這個選項指定如果單元被允許運行默認的實例。

4)一個postfix服務的例子:

單元文件位於/usr/lib/systemd/system/ice,內容如下:

[Unit]

Description=PostfixMailTransportAgent

After=et

Conflicts=ice

[Service]

Type=forking

PIDFile=/var/spool/postfix/pid/

EnvironmentFile=-/etc/sysconfig/network

ExecStartPre=-/usr/libexec/postfix/aliasesdb

ExecStartPre=-/usr/libexec/postfix/chroot-update

ExecStart=/usr/sbin/postfixstart

ExecReload=/usr/sbin/postfixreload

ExecStop=/usr/sbin/postfixstop

[Install]

WantedBy=et

(3)創建自定義的單元文件

以下幾種場景需要自定義單元文件:

希望自己創建守護進程;

為現有的服務創建第二個實例;

引入SysV init腳本。

另外一方面,有時候需要修改已有的單元文件。

下面介紹創建單元文件的步驟:

1)準備自定義服務的執行文件。

可執行文件可以是腳本,也可以是軟件提供者的的程序,如果需要,為自定義服務的主進程準備一個PID文件,一保證PID保持不變。另外還可能需要的配置環境變量的腳本,確保所以腳本都有可執行屬性並且不需要交互。

2)在/etc/systemd/system/目錄創建單元文件,並且保證只能被root用户編輯:

touch/etc/systemd/system/icechmod664/etc/systemd/system/ice

文件不需要執行權限。

3)打開ice文件,添加服務配置,各種變量如何配置視所添加的服務類型而定,下面是一個依賴網絡服務的配置例子:

[Unit]

Description=service_description

After=et

[Service]

ExecStart=path_to_executable

Type=forking

PIDFile=path_to_pidfile

[Install]

WantedBy=et

4)通知systemd有個新服務添加:

systemctldaemon-reload

ice

(4)創建ice例子:

1)創建文件,並確保正確權限:

~]#touch/etc/systemd/system/ice

~]#chmod664/etc/systemd/system/ice

2)添加配置信息:

[Unit]

Description=Emacs:theextensible,self-documentingtexteditor

[Service]

Type=forking

ExecStart=/usr/bin/emacs--daemon

ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)"

Environment=SSH_AUTH_SOCK=%t/keyring/ssh

Restart=always

[Install]

WantedBy=et

3)通知systemd並開啟服務:

~]#systemctldaemon-reload

~]#ice

(5)創建第二個sshd服務的例子

1)拷貝sshd_config文件

]#cp/etc/ssh/sshd{,-second}_config

2)編輯sshd-second_config文件,添加22220的端口,和PID文件:

Port22220

PidFile/var/run/

如果還需要修改其他參數,請閲讀幫助。

3)拷貝單元文件:

~]#cp/usr/lib/systemd/system/sshd{,-second}ice

4)編輯單元文件ice

修改描述字段

Description=OpenSSHserversecondinstancedaemon

添加ice服務在After關鍵字之後:

After=ice

移除sshdkey創建:

ExecStartPre=/usr/sbin/sshd-keygen

移除這一行

在執行腳本里,添加第二sshd服務的配置文件:

ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config$OPTIONS

修改後的ice文件內容如下:

[Unit]

Description=OpenSSHserversecondinstancedaemon

After=et e ice ice

[Service]

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config$OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=et

5)如果使用SELinux,添加tcp端口,負責第二sshd服務的端口就會被拒絕綁定:

~]#semanage port -a -tssh_port_t -p tcp22220

6)設置開機啟動並測試:

~]#systemctl enable ice

~]$ssh -p 22220 user@server

確保防火牆端口也開放。

(6)修改已經存在的單元文件

systemd單元配置文件默認保存在/usr/lib/systemd/system/目錄,系統管理員不建議直接修改這個目錄下的文件,自定義的文件在/etc/systemd/system/目錄下,如果有擴展的需求,可以使用以下方案:

創建一個目錄/etc/systemd/system/unit.d/,這個是最推薦的`一種方式,可以參考初始的單元文件,通過附件配置文件來擴展默認的配置,對默認單元文件的升級會被自動升級和應用。

從/usr/lib/systemd/system/拷貝一份原始配置文件到/etc/systemd/system/,然後修改。複製的版本會覆蓋原始配置,這種方式不能增加附件的配置包,用於不需要附加功能的場景。

如果需要恢復到默認的配置文件,只需要刪除/etc/systemd/system/下的配置文件就可以了,不需要重啟機器,使用如下命令應用改變就可以:

systemctl daemon-reload

daemon-reload選項重新加載所以單元文件並重新創建依賴書,在需要立即應用單元文件改變的時候使用。另外,也可以使用下面的命令達到同樣的目的:

init q

還有,如果修改的是一個正在運行服務的單元文件,服務需要被重啟下:

systemct lrestart ice

(7)擴展默認單元配置文件配置

為了擴展默認的單元文件配置,需要先在/etc/systemd/system/下創建一個目錄,用root執行類似下面的命令:

mkdir/etc/systemd/system/ice.d

在剛才創建的目錄之下創建配置文件,必須以文件結尾。

例如創建一個自定義的依賴文件,內容如下:

[Unit]

Requires=new_dependency

After=new_dependency

另外一個例子,可以配置重啟的時候,在主進程退出後30秒在重啟,配置例子如下:

[Service]

Restart=always

RestartSec=30

推薦每次只產生一個小文件,每個文件只聚焦完善一個功能,這樣配置文件很容易被移除或者鏈接到其他服務對的配置目錄中。

為了應用剛才的修改,使用root執行以下操作:

systemctldaemon-reload

ice

例子:擴展ice服務配置

為了是httpd服務啟動的時候執行用户自定義的腳本,需要修改httpd的單元配置文件,執行以下幾步操作,首先創建一個自定義文件的目錄及自定義文件:

~]#mkdir/etc/systemd/system/ice.d

~]#touch/etc/systemd/system/ice.d/custom_

假設自定義文件位置在/usr/local/bin/,將這個信息添加到custom_自定義腳本中:

[Service]

ExecStartPost=/usr/local/bin/

應用更改:

~]#systemctldaemon-reload

~]#ice

熱門標籤