一般的なUbuntu 18.04システムでzfsを使用しています。通常のマウントポイントを使用してファイルシステムを作成およびマウントすると、すべてが正常に機能します。
ただし、私は、ブート時に自動的にマウントされるレガシーマウントを使用できる場合に役立つユースケースがあります。
レガシーマウントをnoauto
に設定し、起動後に手動でマウントすると、すべて正常に動作します。
しかし、noauto
を削除すると、起動時に自動的にマウントできません。問題が何であるかは明らかです-起動中、ドライブをマウントする試みがZFSモジュールがロードされる前に行われています:
$ systemctl status home-vagrant.mount
● home-vagrant.mount - /home/vagrant
Loaded: loaded (/etc/fstab; generated)
Active: failed (Result: exit-code) since Thu 2020-04-30 11:41:07 PDT; 24s ago
Where: /home/vagrant
What: vagrant
Docs: man:fstab(5)
man:systemd-fstab-generator(8)
Process: 464 ExecMount=/bin/mount vagrant /home/vagrant -t zfs (code=exited, status=2)
Apr 30 11:41:07 ubuntu mount[464]: The ZFS modules are not loaded.
Apr 30 11:41:07 ubuntu mount[464]: Try running '/sbin/modprobe zfs' as root to load them.
Apr 30 11:41:07 ubuntu systemd[1]: home-vagrant.mount: Mount process exited, code=exited status=2
Apr 30 11:41:07 ubuntu systemd[1]: home-vagrant.mount: Failed with result 'exit-code'.
Apr 30 11:41:07 ubuntu systemd[1]: Failed to mount /home/vagrant.
もちろん、ブートプロセスの後半でZFSモジュールがロードされ、適切にマウントできます。ブートプリントアウトで2つのイベントを確認できます。問題が何であるかは明白ですが、修正はできません。
私はこれに対処するための簡単なハウツーを見つけることができませんでした。私が見ることができるものから、zfs-initramfsをインストールすることはこれを助けるために思われているようです-しかし、どうやって?
そこに浮かんでいる小さな情報は、主にルートファイルシステムにzfsを使用することに関係しているようで、多くの場合、それははるかに複雑です。
ユースケースの一部で、レガシーマウントが必要な理由が明らかになる場合があります。ZFSファイルシステムにマウントされているバインドマウントがあります。したがって、回避策はマウントの代わりにリンクを使用することです-そして、私がこの問題を解決できない場合は、私がやることです。
しかし、これは実行可能なはずです!
[〜#〜] edit [〜#〜]:ブートへのzfsモジュールの挿入を確認する方法は3つあります。カーネルブートコマンドラインでのmodules_load=zfs
、または追加zfs行を/etc/modules-load.d/modules.conf
に変更するか、その行で/etc/modules-load.d/zfs.conf
を作成します。
これらが存在する場合、「Inserted module zfs」という行が表示されますが、それはafterドライブのマウントに失敗した試みです。
これらの3行がなければ、「挿入されたモジュールzfs」行は表示されませんが、モジュールがインストールされた後に来る「ZFS:ロードされたモジュール」行が表示されます。
とにかく、初期のモジュールロードを強制するこれらすべての試みは効果的ではないようです。
EDIT2:/ etc/initramfs-tools/moduleにzfsを追加し、次にupdate-initramfs -c -k allを実行してからupdate-grubを実行すると、動作が変化します。
これで、ZFSモジュールdoesのようになり、systemdモジュールローダーサービスモジュールの前に、mountコマンドの前にロードされます。
データセットを開くことができませんメッセージが表示され、マウントは引き続き失敗します。
これは、モジュールがロードされていても、他のZFSサービスがまだ開始されていないことが原因であると思われます。早い段階で 'kernel:ZFSL Loaded module'が表示されますが、 'systemd [1]:Starting Install ZFS Kernel module'が表示されるのは(マウント失敗後)ずっと後のことです。モジュールはすでに起動しているので、意味のない出力ですが、それはさまざまなzfsサービスが起動したときです。
これらのサービスが起動プロセスの早い段階でどのように開始するかはわかりませんが、zfsルートドライブから起動するシステムがあるため、それを実行する方法がいくつかあります...
解決策?:
@Gordan Bobicからのfstabエントリで_netdevを使用するという提案は機能しました。これは最もエレガントな解決策ではなく、ジョブに間違ったツールを使用していますが、問題を回避するのに十分な時間、マウントを遅らせます。
私はそのアイデアを取り入れ、noauto,x-systemd.automount
を使用してみましたが、これは私のユースケースではもう少し信頼できると思います。さらにテストが必要ですが、うまくいくようです。
これが正しい解決策かどうかはわかりませんが、これは私にとってはうまくいきました。
systemctl edit home-vagrant.mount
[Unit]
Requires=zfs-import.target
After=zfs-import.target
[〜#〜] edit [〜#〜]:次のいずれかの方法も機能する可能性があります。
<pool/dataset> /var/log zfs x-systemd.after=var.mount
<pool/data> /home zfs x-systemd.before=zfs-mount.service
/ etc/modules-load.d 、または modules_loadとrd.modules-loadを使用するカーネルブートコマンドライン でzfsを追加してみてください。
失敗した場合は、_netdevをfstabオプションに追加してください。これにより、ネットワークスタックが初期化されるまでマウントが延期されます。これにより、zfsプールインポートサービスが読み込まれるまでの時間が長くなります。