如果我有一个磁盘:sdi,并且其中有三个条目/dev/disk/by-id
:
scsi-SATA_WDC_WD6001FSYZ-_WD-WXB1HB4SFS7W -> ../../sdi
ata-WDC_WD6001FSYZ-01SS7B0_WD-WXB1HB4SFS7W -> ../../sdi
wwn-0x50014ee004032d28 -> ../../sdi
现在我使用zpool import -d /dev/disk/by-id zpoolname
。zpool 如何决定这三个条目的顺序?我执行命令,它选择ata-WDC_WD6001FSYZ-01SS7B0_WD-WXB1HB4SFS7W
。但我想知道怎么做。
我检查代码:https://github.com/zfsonlinux/zfs/blob/master/lib/libzfs/libzfs_import.c#L1387
好像用了readdir
?但是readdir
不能保证扫描顺序,对吧?我觉得这没什么意义。
谢谢。
答案1
好吧,您已经看过代码,它确实使用了readdir
,但它不能保证读出条目的顺序。
但最后这一点并不重要。
ZFS 并不关心设备节点是否以某种方式被引用。它关心的是磁盘上的数据是否可以通过它访问。如果不能,那么该特定目录条目无论如何都不会成为池导入的候选,因此没有任何区别。
唯一的原因你为什么会关心是如果您希望在输出中显示某个特定名称zpool status
。在这种情况下,您不应该从 /dev/disk/by-id 导入(正如您所指出的,它有多种引用同一分区的方式),而是设置 /etc/zfs/vdev_id.conf,然后从 /dev/disk/by-vdev 导入。(您可能需要先重新运行udevadm trigger
。)
一般来说,除非您确实需要实现细节,否则不要考虑实现细节,因为下一个版本可能会完全改变您所看到的行为。相反,请使用文档化的接口来获得您想要的效果。
当然,如果有人将类型放入单独的路径组件中,这种情况是可以避免的,这样我们就会有类似 /dev/disk/by-id/scsi/SATA_WDC_WD6001FSYZ-_WD-WXB1HB4SFS7W、/dev/disk/by-id/ata/WDC_WD6001FSYZ-01SS7B0_WD-WXB1HB4SFS7W 和 /dev/disk/by-id/wwn/0x50014ee004032d28 的东西。但是,唉。您可以在自己的系统上这样做,但这会让其他人和他们的脚本感到困惑……