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、InstallUnitsection有不少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