systemctl edit (drop-in snippet) を使う時は、"systemctl show" で確認すべし

サーバーに複数のIPアドレスを割り当てている場合に、明示的にListenIPアドレスを指定したい場合がある。
例えば、postfixで、

inet_interfaces = 127.0.0.1, 192.168.1.1

等を設定した場合、OS再起動するとpostfixが起動に失敗するケースに遭遇する。
ネットワークインターフェースがLinkUpする前に、postfixが起動してしまい、指定したIPアドレスの25/TCPポートを割当出来ない状態だ。

対応方法としては、systemdのユニットファイルを編集するのが一般的であろう。
今回はpostfix.service を例として、"systemctl edit postfix.service"でユニットファイルを編集する場合について。

"systemctl edit postfix.service"で

[Unit]
After=network-online.target

として保存すれば、今回の要件は完了する。

だがデフォルトでは、
After=syslog.target network.target
となっていて、syslog使ってないし、network-online.target があれば、
(他のサービスで立ち上がるはずなので)"network.target" 不要じゃないか!と
思った時、つまりは、デフォルトで記述されている場合を削除したい場合だ。

結論から言えば、著者は、"systemctl --full edit postfix.service"でしか対応しきれなかった。
--full オプションは、すべての設定項目を記述する。保存先は、/etc/systemd/system/postfix.service となる。

[Service] セクションであれば、例えば、
ExecStartPre=
ExecStartPre=hogehoge
と書けば、1行目のExecStartPre行でクリアされ、2行目の1行のみとなる。

同様の事を[Unit] セクションで行ったが、
[Unit]
After=
After=network-online.target
としても"network-online.target"が追記されるだけで、"syslog.target"も"network.target"も存在する。

だいぶん話が脱線してしまったが、これらの調査を行った際に利用したコマンドが、

〇 編集する場合

・ systemctl edit postfix.service

〇デフォルト設定部分を含んだユニットの設定内容を確認する場合

・ systemctl cat postfix.service

〇反映された設定内容を確認したい場合

・systemctl show postfix.service -p After

ちなみに、"systemctl show postfix.service"とすると、ユニットファイルに記述していない項目も出てくるので、
-p オプションで After とか、ExecStartPre とか書けば、その行が表示される。
ま、grep しても良いが・・・

man を見ると、"systemctl edit" で編集保存すると、"systemctl daemon-reload"を(自動)実行してくれるようだ。

確認環境
Rocky Linux release 8.9 (Green Obsidian)