Udev规则可匹配任何USB存储设备


10

如何udev为插入的任何USB大容量存储设备而不只是特定设备实施规则?什么应该改变的idVendor,和idProduct

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

Answers:


7

block子系统中有一个存储设备,因此您需要SUBSYSTEM=="block"遵循以下规则:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

如果您使用systemd,则systemd每次添加USB存储设备时都可以运行一个设备。创建单位文件,例如/etc/systemd/system/my-usb-rule.service

[Service]
Type=oneshot
ExecStart=/path/to/script

和规则,例如/etc/udev/rules.d/85-my-usb-rule.rules

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

现在,udevmy-usb-rule.service在任何USB存储设备添加事件上触发(依次执行脚本)。


编辑规则/单位后,请不要忘记重新加载配置:

udevadm control --reload
systemctl daemon-reload

添加USB大容量存储设备时,我想对它包含的分区进行操作。在udev级别,我可以看到来自4个子系统的事件:usb,scsi,bdi和block(按此顺序)。前三个不可用,因为该分区尚不知道。阻止事件的ID_BUS = scsi,而不是您的代码示例中的usb。我在block事件中看不到任何合适的属性,它可以告诉我是否是USB大容量存储。(使用udevadm监视器和udevadm信息进行的调查)。除非我可以相信ID_BUS = scsi除了USB大容量存储设备外别无其他选择。
Uwe Geuder

@UweGeuder-没有什么可以阻止您使用设备名称作为程序的参数,并基于对分区的操作...
don_crissti

好吧,在USB事件中,设备名称类似于/ dev / bus / usb / 002/040。不知道该如何处理我的程序。在阻止事件中,设备名称类似于/ dev / sdb或/ dev / sdb1。那就是我想要的,但是现在我回到ID_BUS = scsi的问题。我再进一步一点:有一个规则文件80-udisk2,它添加了一个属性ID_DRIVE_THUMB。不确定它的功能如何强大,列出的供应商似乎很少。我的规则文件名为70- *,因此按预期,我的/ dev / sdb不匹配。尽管我的规则首先运行,但足够令人奇怪的/ dev / sdb1匹配。
Uwe Geuder

1
啊,我只是注意到最初的问题是任何 USB大容量存储驱动器。这应该符合规则SUBSYSTEM=="block", SUBSYSTEMS=="usb"(注意与S的区别)。我怀疑它始终可以ENV{ID_BUS}=="usb"在原始答案中使用,因为我在这里看到了scsi的价值。但是,我正在解决一个与最初询问的问题稍有不同的问题,我需要任何USB记忆棒(pendrive),但没有外部驱动器。
Uwe Geuder

1
实际上,一个令人讨厌的事实是,ENV{ID_BUS}在所有系统上价值都不相同。昨天,我正在使用udev 210开发较旧的系统(我相信。由于机器不在Internet上,所以现在无法检查),值是scsi。现在,我在使用udev 228的较新计算机上,值是usb。对于同一个USB记忆棒,我将其随身携带。(不确定udev版本是否是此处的相关因素,也可以是内核或安装udev规则的任何其他软件包,例如udisks2)SUBSYSTEM=="block", SUBSYSTEMS=="usb"(请注意 S)仍可移植且安全。
Uwe Geuder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.