こんにちは、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 の実体は存在しない、ということですね。
がーーん!
おとなしく、コピーします…