systemd - unit ファイルの編集編

こんにちは、masm11 です。 systemd シリーズの第3回です。

blog.ingage.jp

blog.ingage.jp

前回は .service の書き方を説明しました。 unit ファイルには他にも種類がありますが、 ここで unit ファイルの書き換え方を説明したいと思います。

まるっと置き換える

OS のパッケージをインストールすると、unit ファイルは (/usr)/lib/systemd/system/ に置かれると思います。foo.service というファイル名だとしましょう。 この foo.service に手を加えたいとします。

その際、この (/usr)/lib/systemd/system/foo.service に直接手を加えてはいけません。パッケージマネージャが手動による編集を検出して、パッケージの更新ができなくなってしまいます。

代わりに、この foo.service を /etc/systemd/system/foo.service に コピーし、編集します。

こうすることで、/usr/lib/systemd/system/foo.service は無効になり、 代わりに /etc/systemd/system/foo.service が参照されるようになります。

drop-in ファイルを使う

/etc/systemd/system/foo.service にコピーして編集する方法では、 /usr/lib/systemd/system/foo.service が無視されます。 パッケージの更新によって /usr/lib/systemd/system/foo.service が 更新されても、無視され、/etc/systemd/system/foo.service が 使われ続けるのです。

これはあまり嬉しくありません。そこで、drop-in という機構を使います。

drop-in の場合はファイルのコピーはしません。 /etc/systemd/system/foo.service.d/ というディレクトリを作り、 その中に .conf で終わる適当なファイル名で差分のみを書きます。

…よくわからないと思うので、具体例で説明します。

/usr/lib/systemd/system/systemd-journal-flush.service:

[Unit]
Description=Flush Journal to Persistent Storage
Documentation=man:systemd-journald.service(8) man:journald.conf(5)
DefaultDependencies=no
Requires=systemd-journald.service
After=systemd-journald.service systemd-remount-fs.service
Before=systemd-tmpfiles-setup.service
RequiresMountsFor=/var/log/journal

[Service]
ExecStart=journalctl --flush
ExecStop=journalctl --smart-relinquish-var
Type=oneshot
RemainAfterExit=yes
TimeoutSec=90s

この中の After=Requires= に依存関係を追加したいとします。 その場合、

/etc/systemd/system/systemd-journal-flush.service.d/dependencies.conf:

[Unit]
Requires=zfs-mount.service
After=zfs-mount.service

と書きます。こうすることで、/usr/lib/systemd/system/systemd-journal-flush.service/etc/systemd/system/systemd-journal-flush.service.d/dependencies.conf の内容が融合され、解釈されるわけです。

この方法なら、パッケージの更新で /usr/lib/systemd/system/systemd-journal-flush.service が更新されても、ちゃんと反映されます。

まとめ

今回は unit ファイルの書き換え方を説明しました。

drop-in ファイルは便利です。/etc/systemd/*.conf も drop-in に対応しています。こちらも systemd の機能追加に従って項目が増えていきます。 直接編集すると、systemd パッケージの更新がうまくいかず、手間がかかるのですが、drop-in なら問題ありません。

個人的には /etc/passwd も drop-in に対応しないかな、と思っていたのですが、 いつの間にか systemd-homed なんてものができてたんですね。 これも使ってみたいと思います。

ではまた!