libmtp udev 规则从自定义 udev 规则中删除符号链接

libmtp udev 规则从自定义 udev 规则中删除符号链接

我使用 Ubuntu 20.04 LTS,并在 /etc/udev/rules.d/ 中编写了自定义 udev 规则,如果连接了特定的外部 USB 硬盘,该规则会创建一个名为“mybackup”的符号链接,并向 syslog/journalctl 写入一条简短消息。我的 udev 规则名为 99-datensicherung.rules:

ENV{DEVTYPE}=="usb_device", \
SUBSYSTEM=="usb", \
ATTRS{idVendor}=="174c", \
ATTRS{idProduct}=="55aa", \
ATTRS{bcdDevice}=="0100", \
SYMLINK+="mybackup", \
ACTION=="add", \
RUN+="/usr/bin/logger MY DEVICE CONNECTED."

如果我查看系统日志,我会发现记录器的消息并看到符号链接已创建:

Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: /etc/udev/rules.d/99-datensicherung.rules:9 LINK 'mybackup'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: /etc/udev/rules.d/99-datensicherung.rules:9 RUN '/usr/bin/logger MY DEVICE CONNECTED.'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Handling device node '/dev/bus/usb/002/055', devnum=c189:182
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Setting permissions /dev/bus/usb/002/055, uid=0, gid=0, mode=0664
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Creating symlink '/dev/char/189:182' to '../bus/usb/002/055'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Creating symlink '/dev/mybackup' to 'bus/usb/002/055'

但过了很短的时间,系统日志告诉我:

Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: /usr/lib/udev/rules.d/69-libmtp.rules:2685 Running PROGRAM 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Starting 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: Successfully forked off '(spawn)' as PID 185132.
Okt 15 11:22:46 SWPITSLNB mtp-probe[185132]: checking bus 2, device 55: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-4"
Okt 15 11:22:46 SWPITSLNB mtp-probe[185132]: bus: 2, device: 55 was not an MTP device
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55'(out) '0'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Process 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55' succeeded.
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Updating old name, '/dev/mybackup' no longer belonging to '/devices/pci0000:00/0000:00:14.0/usb2/2-4'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: No reference left, removing '/dev/mybackup'

如何防止其他 udev 规则删除我的符号链接?非常感谢!

完整系统日志:https://pastebin.com/k5q1uuB0

答案1

我目前无法测试这一点,但我怀疑您应该使用ACTION!="remove"- 通过 udev 规则设置的某些内容不会在事件之间保持不变,因此您不仅应该匹配“添加”,还应该匹配“绑定”、“更改”等等。

不要只需将“add”替换为“bind”,因为您无法保证这两个事件总是按照完全相同的顺序发生。)


但是,如果您的目标是像磁盘一样,则您尝试匹配的设备将不会非常有用mount。'usb_device' 设备类型是处理原始 USB 数据包的“低级”设备 - 操作系统将在其上分层 usb_interface,然后是 scsi_host,然后可能是 SCSI 目标和 LUN 之类的东西,只有这样您才能获得 'sda' 作为可以安装或分区的抽象“块设备”。

要真正获得有用的东西,您需要匹配SUBSYSTEM=="block"(涵盖“sda”和“sdaX”),并且可选地使用 devtype"disk""partition"缩小范围。

此外,这些块设备实际上已经有预定义的各种符号链接/dev/disk/by-xxx– 其中一些还涉及文件系统 ID、分区 ID 和硬件序列号。

相关内容