我在 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