我有一套相当简单的自定义规则:
ACTION=="add", SUBSYSTEM=="usb", ENV{ID_MODEL_ID}=="0748", ENV{ID_VENDOR_ID}=="05e3", TAG+="my-card-reader"
TAGS=="my-card-reader", ENV{DEVTYPE}=="disk", ENV{ID_INSTANCE}=="0:1", SYMLINK+="sdcard"
TAGS=="my-card-reader", ENV{ID_INSTANCE}=="0:1", ENV{DEVTYPE}=="partition", SYMLINK+="sdcard%n"
我正在尝试识别我的 USB 读卡器,然后在 /dev 中为 microSD 卡指定众所周知的名称。这组规则在 16.04 中有效,但在 18.04 中无效。
检查后udevadm monitor -p
,我可以看到 USB 读卡器已被识别:
UDEV [1832291.742219] add /devices/pci0000:00/0000:00:14.0/usb4/4-2 (usb)
ACTION=add
[…]
SUBSYSTEM=usb
TAGS=:my-card-reader:
[…]
但是当我稍后使用检查 sysfs 路径时udevadm info /sys/devices/pci0000:00/0000:00:14.0/usb4/4-2
,我的 TAG 不再显示 - 事实上,E: TAGS
根本没有可用的条目。
对于其他设备,例如我的 microSD 卡上的分区,Ubuntu 的默认systemd
TAG 仍然可用:
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host3/target3:0:0/3:0:0:2/block/sdf
N: sdf
[…]
E: SUBSYSTEM=block
E: TAGS=:systemd:
[…]
更新 1
我一直在运行,udev_log="debug"
同时拔下并重新插入读卡器和 SD 卡,突然到现在只有一次,我的规则是应用。但是,查看来自 udev 的 journalctl 调试日志并进行比较,除了内核日志、udev 守护进程日志和分叉的 udev 工作进程之间的竞争以及序列号之外,我看不到其他区别。
更新 2
我几乎已经解决了这个问题。启动期间连接 USB 读卡器时,标签可用。当我稍后(重新)连接它时,标签不见了。
我错过了什么?
答案1
最有可能的是,该标签已被另一条规则覆盖。
- Ubuntu 18.04 获得了更新的规则.. 检查
grep -r TAG
系统规则文件夹中的使用,请参阅man udev
。 - 自定义规则文件给定低数字..使用
udevadm test ...
和udevadm trigger ...
来验证针对该事件处理哪些规则。
答案2
显然,事情正在发生:https://github.com/systemd/systemd/issues/7587
长话短说:TAGS 仅对每个事件有效,且不会持久化。ACTION=="add",
从我的规则文件中删除后,它就可以正常工作了