iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
Software Development

系統與服務雜談系列 第 17

設定檔格式INI + Service的管理工具Systemd簡介

INI

INI, 全名是Initialization File
早期用來當設定檔用的一種文件格式. 有64kb的大小限制
結構非常簡單, 用``[section]當第一層,key=value```做第二層

[section name]
key_name = value_name

支持的data type只有

  • bool
  • decimal
  • hex
  • string
  • path

    至今還是不少服務用ini做設定檔, 像是MySQL、systemd等等的.
    優點就好寫好懂吧
    缺點就太過簡單, 導致要描述複雜的結構或更多資料類型的支持時, 幾乎就很麻煩, 或是做不到.

Systemd

在Linux系統下, 現在的發行版本都採用systemd做為service的管理工具,
它提供了強大的systemctl這命令工具.
但我沒要深入systemd這工具, 而只是講一下設定文件

cat /usr/lib/systemd/system/docker.service
輸出其內容如下

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
Wants=containerd.service
​
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
​
[Install]
WantedBy=multi-user.target

能清楚的看到有3個section: Unit、Service、Install
Unitsection有不少key, 就是簡單用來描述這服務
像是Document就是說明該服務的文件位子
After用來說明Docker service需要在這些服務後面啟動, 一樣預設的分隔符號是空格;
對應的當然有Before, 就說明該服務要在哪些服務之前啟動. 這樣的方式來描述彼此的啟動依賴順序.

Wants則是用來描述, 服務的生命週期的依賴, 以這裡為例,
表示network-online.target在Docker service啟動時, 會嘗試幫你先啟動network-online.target,
但若是啟動不起來, 或者是啟動成功, 都不影響Docker serivice的啟動.

Requires跟Wants就反過來了, 描述的是服務的生命週期的依賴,
以這裡為例,
表示docker.socket在Docker service啟動時, 會嘗試幫你先啟動docker.socket,
但若是啟動不起來, 當前的這Unit(Docker service), 也不會被啟動.
要requires對象們都成功啟動, 當前的unit service才會啟動.

Service這區塊就主要描述怎啟動這Unit, 和其他狀態的命令, 以及Retry策略
太多, 再請各位看參考文件的連結

Install這區塊主要就是描述, 如何安裝這配置文件了
WantedBy是描述, 這服務在執行start命令後, 它的symbolic link會被放在哪個分類下
這裡描述的是放在multi-user.target這target底下

這些都寫好後, 可以透過systemctl來啟動

systemctl start xxxx

又或者能設置成開機啟動

systemctl enable xxxx


來看看systemd怎顯示服務的依賴關係,
首先來看看sytemd目前運行的target

systemctl get-default 
> graphical.target

此時顯示的是graphical.target而不是docker所在的multi-user.target, 但docker service還是有被啟動?

此時能透過systemctl的另一個命令list-dependencies

systemctl list-dependencies graphical.target 
graphical.target
> ● ├─accounts-daemon.service
> ● ├─grub-common.service
> ● ├─systemd-update-utmp-runlevel.service
> ● └─multi-user.target
> ●   ├─cron.service
> ●   ├─docker.service

能看到multi-user.target是依賴在graphical.target底下的, 而multi-user.target有我們註冊的docker.service

來看看docker.service的symbolic link是否在multi-user.target分類下

cd /etc/systemd/system/multi-user.target.wants
ls | grep 'docker'
> docker.service

參考資料

鳥哥的Linux私房菜 認識系統服務 (daemons)
Understanding Systemd Units and Unit Files


上一篇
xargs - Linux裡好用的工具
下一篇
設定檔格式 YAML
系列文
系統與服務雜談32

尚未有邦友留言

立即登入留言