使用 udevadm 等待 scsi 扫描在 initramfs 内完成?

使用 udevadm 等待 scsi 扫描在 initramfs 内完成?

问题出在哪里: 我将 ArchLinux 与 archzfs 一起使用,在 ZFS 使用的所有磁盘的 SCSI 扫描完成之前,我的 initramfs 中的 zfs 钩子有时会过早尝试(并失败)导入池。这会导致启动失败,因为 zfs 在我的系统中也用作根文件系统。为了解决这个问题,我正在寻找一些命令来阻止 zfs hook 执行(它只是一个ash脚本,在 initramfs 映像内存储和执行),直到 scsi 扫描完成。

这与 udevadm 有什么关系: 如果我使用 3.6 之前的 Linux 内核,我会简单地添加modprobe scsi_wait_scan ; rmmod scsi_wait_scan ;阻止 zfs 钩子执行,直到 scsi 扫描完成。但是我使用的是 4.4 内核,这个模块不可用。我正在考虑使用udevadm settle它,但我不太确定它是否真的适合这种用途。这是因为在 ArchLinux 中已经有 udev hook,它在 zfs hook 之前执行并执行以下操作:

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/1551300我决定向 zfs hook 添加两行(在 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我修复我的问题,而是确认(或否认)是否udevadm可以用于等待 scsi 扫描完成,如果可以,如何使用。

答案1

有趣的是,udevadm set 似乎不会阻止 zfs 在 SCSI 设备扫描完成之前加载。我终于通过强制同步 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

相关内容