如何使用 udev 规则识别断开连接的 USB 设备?
Posted
技术标签:
【中文标题】如何使用 udev 规则识别断开连接的 USB 设备?【英文标题】:How to identify a disconnecting USB device using udev rules? 【发布时间】:2010-12-01 05:59:24 【问题描述】:我有两个使用 Xorg 的 xinerama 功能的 LCD。每个 LCD 屏幕都有一个触摸屏,连接到各自的 USB 线。
查看“/var/log/messages”文件,我看到以下内容:
kernel: input: Analog Resistive as /class/input/input0
kernel: input: USB HID v1.01 Mouse [Analog Resistive] on usb-0000:00:1d.3-1
kernel: input: Analog Resistive as /class/input/input1
kernel: input: USB HID v1.01 Mouse [Analog Resistive] on usb-0000:00:1d.3-2
出于某种原因,在某个时间点,USB 总线似乎重置(或某些奇怪的东西)并且我的两个触摸屏被反转(按下左侧 LCD,鼠标向右移动,如果我按下右侧 LCD,鼠标向左移动)。
为了尝试调试问题,我尝试编写一个 udev 规则来记录我的设备何时重置/断开连接(或其他)。但似乎 udev 在连接时会报告设备上的完整详细信息(产品、制造商、idProduct、idVendor 等),但在移除时只给您一些总线编号。这是为什么呢?
当我得到一个 ACTION=="remove", KERNEL=="input*" 规则时,我无法知道它是哪个设备!有谁知道解决这个问题的方法吗?
【问题讨论】:
这应该是服务器故障。 @PaulWagland 不,它不应该是服务器故障!这与服务器无关。当时,这是一个开发团队(程序员)积极开发的嵌入式产品。而且我还可以保证,数十名程序员将需要此类信息来进行开发。如果问题与 Server Vault “共享”或“克隆”(如果可能的话),这可能会很有用。 【参考方案1】:我建议首先通过运行例如检查设备“删除”事件上的 udev 事件。 udevadm monitor --kernel --property --subsystem-match=usb
并依次断开设备并比较输出。
在一次鼠标断开连接时,我得到两个事件:
KERNEL[6680.737678] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0
DEVTYPE=usb_interface
INTERFACE=3/1/2
MODALIAS=usb:v09DAp000Ad0034dc00dsc00dp00ic03isc01ip02in00
PRODUCT=9da/a/34
SEQNUM=2835
SUBSYSTEM=usb
TYPE=0/0/0
KERNEL[6680.739577] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
ACTION=remove
BUSNUM=002
DEVNAME=/dev/bus/usb/002/006
DEVNUM=006
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
DEVTYPE=usb_device
MAJOR=189
MINOR=133
PRODUCT=9da/a/34
SEQNUM=2836
SUBSYSTEM=usb
TYPE=0/0/0
您可以编写规则来调用脚本,该脚本在检查某些特定环境变量后应该完成一些工作。一条规则可能很简单
SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh"
在您的情况下,我建议在 usbdevgone.sh 中检查 $DEVPATH,因为它们对于您的两个其他相同的设备应该有所不同。
您也可以像这样将devpath
(这是/sys/ 文件系统中的路径)作为参数传递给您的脚本(有关可用substitutions
的列表,请参阅man udev
):
SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh $devpath"
不要忘记通过udevadm control --reload-rules
通知 udevd 您的新规则或更改的规则
【讨论】:
【参考方案2】:我在 Linux 中也遇到过同样的问题。删除时发送的信息很少,不能用于唯一标识要删除的设备。我曾经使用PHYDEVPATH
(对于给定的机器和USB端口,它在插入和拔出时是唯一的),但非常不幸的是,它一直是deprecated in later versions of udev
。
【讨论】:
【参考方案3】:我正在编写一个具有相似功能的应用程序,我解决了实现守护程序的问题,其唯一任务是存储连接的udev_device
。因此,当我甚至从udev_monitor
中检测到一些remove
时,我会检查守护进程的设备列表中是否缺少某些设备。缺少的是设备已断开连接。这样我就可以获取断开设备的数据了。
【讨论】:
以上是关于如何使用 udev 规则识别断开连接的 USB 设备?的主要内容,如果未能解决你的问题,请参考以下文章