systemd unit file を symbolic link する (失敗)

こんにちは、masm11 です。

自分でサーバとか運用してると時々小さなトラブルにつまずきますよね。 今回はそんなトラブルの一つをご紹介します。

経緯

最近、自分の日記を全文検索する g2diary というツールを作成しました。 家庭内サーバ (以下、mike2 とします) でも動いています。

ただ、なんでか reboot 後に起動してくれないんですよね…

mike2:~ % sudo systemctl status g2diary-stg.service
Unit g2diary-stg.service could not be found.
mike2:~ % 

ほら、unit file を見つけられてないです。 こういう時は daemon-reload してやるとうまくいくようになります。

mike2:~ % sudo systemctl daemon-reload             
mike2:~ % sudo systemctl status g2diary-stg.service
○ g2diary-stg.service - Diary Search Service
     Loaded: loaded (/etc/systemd/system/g2diary-stg.service; enabled; preset: disabled)
     Active: inactive (dead)
mike2:~ % 

が、reboot すると、元の木阿弥です。何が起きてるのでしょう?

思い当たること

unit file はこれまでにもいくつか作ってきました。こんな症状は初めてです。 いつもと違うことと言えば… symbolic link であることくらいでしょうか…

mike2:~ % ls -l /etc/systemd/system/g2diary-stg.service 
lrwxrwxrwx 1 root root 41  7月 12 21:10 /etc/systemd/system/g2diary-stg.service -> /home/service/g2diary/g2diary-stg.service
mike2:~ % 

こんなことくらいで、うまく動かなくなるもんでしょうか?

symbolic link を使うには、何か指定が必要だったりするのでしょうか?

systemctl のマニュアルを当たる

systemctl(1) というマニュアルがありまして、link という subcommand があることがわかります。

これを読むと、symbolic link を張ってくれるらしいこと、 削除するには disable という subcommand を使えば良いこと、 がわかります。

なんだ、symbolic link 使えるんじゃん。なんでうまくいかないんだろう…?

ただ…、その先に気になることが書いてありますね。

ナニナニ? systemd が起動した時に既に filesystem は mount されてなきゃいけない?

まぁそりゃそうでしょうね。symbolic link だけあってもその実体がないことには ファイルが読めないですから。

そういえば実体は zfs 中だった気が…

起動シーケンスを確認する

まだ望みはあります。systemd 起動までに zfs が mount されてればいいわけです。

Linux は小さい RAM ディスクをロードして最低限の初期化、その後に systemd を起動して いろいろ起動、という手順を踏むことがあります。今回私が使っている Arch Linux もその一つです。 その「最低限の初期化」の中に zfs の mount が含まれてれば OK、ということです。

その「最低限の初期化」で何をするかは、Arch Linux では /etc/mkinitcpio.conf に 書いてあります。

HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck)

zfs の mount をする場合、↑この中に zfs があるはずなのです。ありませんでした…

つまり、systemd 起動時には zfs は mount されておらず、従って unit file の実体は存在しない、ということですね。

がーーん!

おとなしく、コピーします…