Как определить отключающееся USB-устройство с помощью правил udev?

У меня есть два ЖК-дисплея, использующих функцию xinerama Xorg. Каждый ЖК-экран имеет сенсорный экран, который подключен к соответствующим линиям 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, кажется, сбрасывается (или что-то странное), и мои два сенсорных экрана переворачиваются (нажимаю левый ЖК-дисплей, и мышь перемещается вправо, и если я нажимаю правый ЖК-дисплей, мышь перемещается на левый).

Чтобы попытаться отладить проблему, я попытался написать правило udev для регистрации, когда мои устройства сбрасываются/отключаются (или что-то еще). Но кажется, что udev сообщит полную информацию (продукт, производитель, idProduct, idVendor и т. д.) об устройстве при его подключении, но не даст вам ничего, кроме нескольких номеров шины, когда оно будет удалено. Почему это?

Когда я получаю правило ACTION=="remove", KERNEL=="input*", я никак не могу узнать, какое это устройство! Кто-нибудь знает способ обойти это?


person Jeach    schedule 24.09.2009    source источник
comment
Это должно быть связано с ошибкой сервера.   -  person Paul Wagland    schedule 19.01.2010
comment
@PaulWagland нет, это не должно быть ошибкой сервера! К серверам это не имеет никакого отношения. В то время это была активная разработка встроенного продукта командой разработчиков (программистов). И я также могу гарантировать, что десяткам программистов понадобится такая информация для своего развития. Вероятно, было бы полезно, если бы вопрос был «расшарен» или «клонирован» с помощью Server Vault (если это было возможно).   -  person Jeach    schedule 24.02.2019


Ответы (3)


я бы предложил в первую очередь проверить события 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"

В вашем случае я бы посоветовал проверить $DEVPATH внутри usbdevgone.sh, так как они должны отличаться для ваших двух в остальном идентичных устройств. Также вы можете передать devpath (это путь в файловой системе /sys/) в качестве аргумента вашего скрипта следующим образом (см. man udev список доступных substitutions):

SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh $devpath"

Не забудьте уведомить udevd о новом или измененном правиле с помощью udevadm control --reload-rules

person mz0    schedule 10.06.2014

Я столкнулся с той же проблемой в Linux. Информация, отправляемая при удалении, минимальна и не может использоваться для однозначной идентификации удаляемого устройства. Раньше я использовал PHYDEVPATH (уникальный при подключении и отключении для данной машины и USB-порта), но, к сожалению, это было устарело в более поздних версиях udev.

person Phil    schedule 19.01.2010

Я писал приложение с аналогичными функциями, и я решил проблему реализации демона с единственной задачей хранения udev_device подключенных. Поэтому, когда я обнаруживаю какое-то remove даже из udev_monitor, я проверяю, отсутствует ли какое-то устройство в списке устройств демона. Чего не хватает, так это отключенного устройства. Таким образом я могу получить данные отключенных устройств.

person Raydel Miranda    schedule 23.05.2014