こんにちは、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 は必須なのかもしれませんね。
弊社ではエンジニアを募集しています。詳細は以下のページへどうぞ。
ではまた!