udevadmを使用してinitramfs内でscsiスキャンが完了するのを待ちますか?

udevadmを使用してinitramfs内でscsiスキャンが完了するのを待ちますか?

問題はどこにありますか? 私はArchzfsでArchLinuxを使用していますが、ZFSで使用されているすべてのディスクのSCSIスキャンが完了する前に、initramfsのzfsフックが早期にプールを取得しようとして失敗することがあります。これにより、zfs がマイシステムのルートファイルシステムとしても使用されるため、起動が失敗します。この問題を解決するために、scsiスキャンが完了するまでzfsフックが実行されないようにするいくつかのコマンドを探しています(ashinitramfsイメージ内に保存され実行されるスクリプトのみ)。

これはudevadmとどのような関係がありますか? 3.6より前のLinuxカーネルを使用している場合は、modprobe scsi_wait_scan ; rmmod scsi_wait_scan ;scsiスキャンが完了するまでブロックzfsフックを追加するだけです。しかし、私は4.4カーネルを使用していますが、このモジュールは使用できません。使用を検討していますが、udevadm settle実際にこの目的に適しているかどうかはわかりません。これは、ArchLinux に zfs フックの前に実行され、次を実行する udev フックがすでに存在するためです。

run_hook() { msg ":: Triggering uevents..." udevadm trigger --action=add --type=subsystems udevadm trigger --action=add --type=devices udevadm settle }

だから以下にhttps://bugs.launchpad.net/ironic-python-agent/+bug/1551300zfsフックに2行を追加することにしました(zfsをインポートする前)。

# Force udev to list all devices, will block until scsi scan is completed udevadm trigger --verbose --dry-run --type=devices --subsystem-match=scsi_disk udevadm settle

これは言う?それとも何か他のことを試してみるべきですか?ソリューションテストの問題は、問題が散発的にのみ発生することです。つまり、再確認せずにコンピュータを何度も再起動しても問題が解決したという保証はありません。したがって、ここで尋ねる質問は、initramfs私の問題を解決するためのものではなく、udevadmscsiスキャンが完了するのを待つことが使用可能かどうか、および使用可能であればどのように確認(または拒否)することです。

答え1

興味深いことに、udevadm setはSCSIデバイススキャンが完了するまでzfsがロードされるのを防ぐことができないようです。最後に、このような同期scsiスキャンを強制することで問題を解決しました。

bronek@gdansk ~ % cat /etc/modprobe.d/zfs.conf
# Enforce synchronous scsi scan, to prevent zfs driver loading before disks are available
options scsi_mod scan=sync

関連情報