INI, 全名是Initialization File
早期用來當設定檔用的一種文件格式. 有64kb的大小限制
結構非常簡單, 用``[section]當第一層,
key=value```做第二層
[section name]
key_name = value_name
支持的data type只有
在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、InstallUnit
section有不少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