如何对未分区的本地磁盘应用udev规则?

如何对未分区的本地磁盘应用udev规则?

我在 udev 中做了这个配置:

KERNEL=="sdd", SYMLINK+="QUORUML", OWNER="test", GROUP="gtest", MODE="0660"
KERNEL=="sde", SYMLINK+="QUORUMR", OWNER="test", GROUP="gtest", MODE="0660"

之后,我添加了其他磁盘,新磁盘变成了,/dev/sde旧磁盘/dev/sde变成了/dev/sdf,因此上面的 udev 规则变得错误,因为名称sde已更改为sdf。如何确保磁盘正确?还有其他的id吗?我尝试过类似的方法blkid,但由于没有分区,它不会返回任何 id。

[root@dbnode1 rules.d]# blkid /dev/sdd
[root@dbnode1 rules.d]#

我寻找类似的东西,当有 iscsi 磁盘时,我们可以使用 iscsi id 来做到这一点:

KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="360014054187384e668f45e58d036f19a", SYMLINK+="disk4", OWNER="xxxx", GROUP="xxxx", MODE="0660"

答案1

无论如何,您应该匹配SUBSYSTEM=="block", ENV{ID_SERIAL}=="xxx"(品牌/型号和序列号)。或者ENV{ID_SERIAL_SHORT}(仅序列号)。或者ENV{ID_WWN}(驱动器的全局唯一标识符)。或者可能ENV{ID_PART_TABLE_UUID}

我倾向于使用它,ID_SERIAL_SHORT因为它足够独特,可以满足我的需求(驱动器制造商往往不会重复使用序列号,并且不同制造商的序列号有不同的样式),而且我将其打印在粘性标签上,以便我可以轻松识别我的驱动器中的驱动器。热插拔托架。我不使用 WWN,因为在我看来,它们看起来太相似了,很难区分彼此。

明确不保证设备名称在重新启动后持续存在 - 它们通常确实保持数月甚至数年不变,但依赖于此并不安全。内核开发人员已多次记录并声明,不能保证它们在下次启动时不会更改。为什么?由于驱动器可能会死掉(或者在内核扫描设备时需要更长的时间来旋转或响应),因此您可能会添加或删除驱动器,新的内核版本可能会以不同的顺序检测设备,或者任意数量的其他原因。这就是为什么建议许多现在已经有几年了“不要在 中使用 /dev/sdX 名称/etc/fstab。使用 UUID 或 LABEL”。同样的建议(使用唯一标识符)也适用于 udev 规则。

您可以使用 查找任何给定驱动器的属性udevadm info /dev/sdX。那里有很多有趣且有用的属性/属性,但现在我只对序列号感兴趣。

例如,我的系统上有一个 8TB 希捷硬盘,目前为/dev/sda.我可以通过以下方式找到它的短序列号:

$ udevadm info -q property --property=ID_SERIAL_SHORT /dev/sda 
ID_SERIAL_SHORT=ZA9EL9YL

要将其与 udev 规则一起使用,如下所示:

SUBSYTEM=="block", ENV{ID_SERIAL_SHORT}=="ZA9EL9YL", SYMLINK+="QUORUML", OWNER="test", GROUP="gtest", MODE="0660"

请注意,==对于前两个属性,它们是比较而不是赋值(请参阅 参考资料man 7 udev,尤其是Operators小节)。

如果我想要完整的序列号和型号等,我可以使用以下内容:

$ udevadm info -q property --property=ID_SERIAL /dev/sda 
ID_SERIAL=ST8000VN0022-2EL112_ZA9EL9YL

udev 规则如下:

SUBSYTEM=="block", ENV{ID_SERIAL}=="ST8000VN0022-2EL112_ZA9EL9YL", SYMLINK+="QUORUML", OWNER="test", GROUP="gtest", MODE="0660"

如果我为一个特定设备(或设备类型)制定 udev 规则,我发现在规则文件中添加注释掉的输出版本很有用udevadm info /dev/name,以防万一我需要它以供将来参考。用于#评论。


顺便说一句,如果需要,您可以使用awk或等工具单独提取值(不带属性名称) cut

$ udevadm info -q property --property=ID_SERIAL_SHORT /dev/sda | awk -F= '{print $2}'
ZA9EL9YL

$ udevadm info -q property --property=ID_SERIAL_SHORT /dev/sda | cut -d= -f2
ZA9EL9YL

相关内容