为什么 udevadm 不提供磁盘序列号,而 hdparm 可以提供?

为什么 udevadm 不提供磁盘序列号,而 hdparm 可以提供?

比较:

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>是块设备的名称,例如sdanvme0n1

相关内容