systemd で zfs legacy mount の問題を解決する

f:id:masm11:20211020212947p:plain

こんにちは、masm11 です。

ZFS に関連した mount で苦労したのでご紹介したいと思います。

ZFS の mountpoint 設定とは

ZFS は自前で mountpoint を管理しています。

zfs set mountpoint=/home/service zroot/svc

などとして mountpoint を設定しておくと、OS 起動時に

zfs mount -a

で自動的に mount してくれます。

ZFS の legacy mount とは

ですが、この機能にも限界があります。

私の場合、ZFS 内のディレクトリを bind mount しようとして、できませんでした。

bind mount ってのは、

mount --bind /home/service/storage/music /exports/music

とすることで、/home/service/storage/music が /exports/music でも見える、というやつです (シンボリックリンクと違って、cd .. でちゃんと元の場所に戻れます)。

そこで、ZFS に mountpoint を設定するのをやめました。つまり、以下のようにします。

zfs set mountpoint=legacy zroot/svc

こうすることで、/etc/fstab に記述して mount する方法に切り替えることができます。

うまくいかない

で、やってみました。/etc/fstab には以下のように書きました。

zroot/svc  /home/service  zfs  defaults 0 0

しかし、うまく起動してくれません。

10月 20 20:23:45 mike2 systemd[1]: Failed to mount /home/service.

なにかがうまく行ってないようです。

10月 20 20:23:46 mike2 systemd[1]: Starting Import ZFS pools by cache file...
10月 20 20:23:49 mike2 systemd[1]: Finished Import ZFS pools by cache file.
10月 20 20:23:49 mike2 systemd[1]: Reached target ZFS pool import target.
10月 20 20:23:49 mike2 systemd[1]: Starting Mount ZFS filesystems...
10月 20 20:23:49 mike2 systemd[1]: Starting Wait for ZFS Volume (zvol) links in /dev...
10月 20 20:23:49 mike2 systemd[1]: Finished Wait for ZFS Volume (zvol) links in /dev.
10月 20 20:23:49 mike2 systemd[1]: Reached target ZFS volumes are ready.
10月 20 20:23:49 mike2 systemd[1]: Reached target ZFS startup target.
10月 20 20:23:49 mike2 systemd[1]: Finished Mount ZFS filesystems.

ZFS はちゃんと処理されてるようです。

何がまずいんでしょう?

解決

ふと気づきました。

mount 失敗の方が、ログの上の方にある…??

なるほど、mount しようとした時に、ZFS がまだ準備できてないんですね。

ZFS の準備ができるまで mount を待たせることはできないでしょうか…

闇雲に systemd.mount(5) のマニュアルを探したところ、ありました!

x-systemd.requires=
    Configures a Requires= and an After= dependency between the created
    mount unit and another systemd unit, such as a device or mount
    unit. ...

これを使うと、自動生成される home-service.mount に Requires= が 追加されるようです。そこに zfs.target を追加できそうです。

さっそく /etc/fstab に追加してみました。

zroot/svc  /home/service  zfs  x-systemd.requires=zfs.target  0 0

これで再起動したところ、

10月 20 20:39:03 mike2 systemd[1]: Mounting /home/service...
10月 20 20:39:03 mike2 systemd[1]: Mounted /home/service.

めでたく mount できるようになりました!

まとめ

さすが systemd。fstab にまで拡張を加えるとは、やりすぎです。

そして、journal は読みづらいです。 journal の最後の方を見ても、OS 起動に失敗した理由は載ってません。 上の方を見て赤い文字を探さないといけません。 並列実行の弊害ですね。 (この辺は、プログラムのビルドに使う make コマンドも同様ですが)

自動生成される *.mount に助けられる日が来るとは思ってませんでした…

というか、legacy を使うということは、何か面倒ごとを抱え込んでいるということなので、 その場合は x-systemd.requires は必須なのかもしれませんね。

弊社ではエンジニアを募集しています。詳細は以下のページへどうぞ。

https://ingage.co.jp/recruit/

ではまた!