こんにちは、masm11 です。 systemd シリーズの第3回です。
前回は .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 なんてものができてたんですね。 これも使ってみたいと思います。
ではまた!