比较:
root@home:~# hdparm -I /dev/sdb | grep Serial
Serial Number: WCJ025C8
Transport: Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
root@home:~#
到:
root@home:~# udevadm info -a -p $(udevadm info -q path -n /dev/sdb) | grep -i serial
ATTRS{serial}=="0123456789ABCDEF"
ATTRS{serial}=="0000:00:14.0"
root@home:~#
我0123456789ABCDEF
在 udev 中经常看到这种情况,但它是假的,而hdparm
的输出与驱动器上的物理号码完全匹配。
因此,我无法创建与我的 4 个 USB 驱动器按序列号匹配的 udev 规则。
我正在运行 ubuntu 16.04 LTE。
非常感谢您的建议。
答案1
最后我选择了这个,这有点 hack :
KERNEL=="sd?", SUBSYSTEM=="block", PROGRAM="/root/get_disk_serial.sh %k", SYMLINK+="disk/by-serial/%c"
然后是这样的快速脚本:
#!/bin/bash
/sbin/hdparm -I /dev/$1 | grep 'Serial Number' | awk '{print $3}'
虽然不漂亮,但是确实管用...
答案2
根据这个SUSE 知识库文章,这些设备属性中的一些(或可能全部)由 来设置60-persistent-storage.rules
。由于 udev 会延迟执行 udev 规则,直到所有.rules
文件都已评估,因此这些属性是例如,在RUN
分配键值对中可用,但在评估匹配键值对时不可用。
简而言之,要在匹配的键值对中使用这些属性,你的 udev 规则文件的名称必须大于“ 60-persistent-storage.rules
”,例如“ 80-set-storage-permissions.rules
”。这将确保它仅在 之后进行评估60-persistent-storage.rules
。
以下步骤帮助我通过分区表 UUID 或序列号匹配驱动器:
# Match by partition table UUID.
SUBSYSTEM="block", \
ACTION="add", \
ENV{ID_PART_TABLE_UUID}="00000000-0000-0000-0000-000000000000", \
RUN+="<command>"
# Match by serial number.
SUBSYSTEM="block", \
ACTION="add", \
ENV{ID_SERIAL}="WD00000000_0000000000", \
RUN+="<command>"
要获得可匹配的属性的完整列表,请运行udevadm info /sys/block/<kernel>
,其中<kernel>
是块设备的名称,例如sda
,nvme0n1
。