udev: Как вы определяете физическое устройство, к которому принадлежит устройство sys?

У меня есть несколько USB-модемов, каждая из которых имеет несколько конечных точек: много TTY, сетевой интерфейс, порт cdc-wdm и некоторые другие вещи. Я пытаюсь сгруппировать их вместе, чтобы я знал, например, ttyUSB3, ttyUSB4, wwan1 и cdc-wdm1 все принадлежат одному физическому USB-устройству.

Я думал, что $id должен был идентифицировать физическое устройство, поэтому я попробовал добавить $id к среде с ENV{id}=$id . Это похоже на сетевые интерфейсы и последовательные порты, но не порты cdc-wdm (для этих портов не установлен ID).

Вот некоторые примеры данных после добавления правил ENV{id}=$id :

правило: SUBSYSTEM=="net", ATTRS{idVendor}=="106c", ATTRS{idProduct}=="3718", ENV{id}="$id"

 # udevadm info --query=all --path=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1- 1.3:1.5/net/wwan0 P: /devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/net/wwan0 E: DEVPATH=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/net/wwan0 E: DEVTYPE=wwan E: ID_BUS=usb E: ID_MODEL=PANTECH_UML290 E: ID_MODEL_ENC=PANTECH\x20UML290 E: ID_MODEL_ID=3718 E: ID_REVISION=0000 E: ID_SERIAL=Pantech__Incorporated_PANTECH_UML290 E: ID_TYPE=generic E: ID_USB_DRIVER=qmi_wwan E: ID_USB_INTERFACES=:020201:0a0000:ffffff:fffdff:fffeff:fff1ff: E: ID_USB_INTERFACE_NUM=05 E: ID_VENDOR=Pantech__Incorporated E: ID_VENDOR_ENC=Pantech\x2c\x20Incorporated E: ID_VENDOR_ID=106c E: IFINDEX=5 E: INTERFACE=wwan0 E: SUBSYSTEM=net E: USEC_INITIALIZED=174833330 E: id=1-1.3 

правило: SUBSYSTEM=="usb", KERNEL=="*cdc-wdm*", ENV{id}="$id"

 # udevadm info --query=all --path=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1- 1.3:1.5/usb/cdc-wdm0 P: /devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/usb/cdc-wdm0 N: cdc-wdm0 E: DEVNAME=/dev/cdc-wdm0 E: DEVPATH=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/usb/cdc-wdm0 E: MAJOR=180 E: MINOR=176 E: SUBSYSTEM=usb E: USEC_INITIALIZED=174788259 

One Solution collect form web for “udev: Как вы определяете физическое устройство, к которому принадлежит устройство sys?”

Хорошо, сначала я понимаю, что означает документация для $id

Имя устройства согласовано при поиске devpath вверх для SUBSYSTEMS, KERNELS, DRIVERS и ATTRS.

… и это не то, что я думал (что было сформировано из-за неспособности понять документацию в сочетании с некоторыми экспериментами).

Под «именем устройства» речь идет о том же, что и ключ KERNEL . В документации говорится о ключе KERNEL :

Сопоставьте имя устройства события.

Так вы знаете, что «имя» и «KERNEL» связаны.

«Совпадение при поиске в devpath вверх для SUBSYSTEMS, KERNELS, DRIVERS и ATTRS» означает, что если вы укажете соответствие «SUBSYSTEMS, KERNELS, DRIVERS или ATTRS» в правиле, оно поднимет дерево устройств, пока не найдет совпадение; будет использоваться имя соответствующего устройства.

Итак, в моем первом правиле он соответствовал клавише ATTRS, и это устройство оказалось физическим USB-устройством.

Теперь для моего другого правила мне пришлось посмотреть на дерево и найти что-то, что соответствовало бы физическому устройству, но ничто не под ним. Вот мое дерево устройств:

 # udevadm info --attribute-walk --name=/dev/cdc-wdm0 Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5/usb/cdc-wdm0': KERNEL=="cdc-wdm0" SUBSYSTEM=="usb" DRIVER=="" looking at parent device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5': KERNELS=="1-1.7.2:1.5" SUBSYSTEMS=="usb" DRIVERS=="qmi_wwan" ATTRS{bInterfaceNumber}=="05" ATTRS{bAlternateSetting}==" 0" ATTRS{bNumEndpoints}=="03" ATTRS{bInterfaceClass}=="ff" ATTRS{bInterfaceSubClass}=="f1" ATTRS{bInterfaceProtocol}=="ff" ATTRS{supports_autosuspend}=="1" looking at parent device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2': KERNELS=="1-1.7.2" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="Pantech, Incorporated" ATTRS{bNumInterfaces}==" 6" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="c0" ATTRS{bMaxPower}=="500mA" ATTRS{urbnum}=="496" ATTRS{idVendor}=="106c" ATTRS{idProduct}=="3718" ATTRS{bcdDevice}=="0000" ATTRS{bDeviceClass}=="02" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{speed}=="480" ATTRS{busnum}=="1" ATTRS{devnum}=="12" ATTRS{devpath}=="1.7.2" ATTRS{version}==" 2.00" ATTRS{maxchild}=="0" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{authorized}=="1" ATTRS{manufacturer}=="Pantech, Incorporated" ATTRS{product}=="PANTECH UML290" looking at parent device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7': KERNELS=="1-1.7" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="" ATTRS{bNumInterfaces}==" 1" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="e0" ATTRS{bMaxPower}=="100mA" ATTRS{urbnum}=="188" ATTRS{idVendor}=="1a40" ATTRS{idProduct}=="0101" ATTRS{bcdDevice}=="0111" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="01" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{speed}=="480" ATTRS{busnum}=="1" ATTRS{devnum}=="3" ATTRS{devpath}=="1.7" ATTRS{version}==" 2.00" ATTRS{maxchild}=="4" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{authorized}=="1" ATTRS{product}=="USB 2.0 Hub" looking at parent device '/devices/platform/atmel-ehci/usb1/1-1': KERNELS=="1-1" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="" ATTRS{bNumInterfaces}==" 1" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="e0" ATTRS{bMaxPower}=="100mA" ATTRS{urbnum}=="53" ATTRS{idVendor}=="1a40" ATTRS{idProduct}=="0201" ATTRS{bcdDevice}=="0100" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="02" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{speed}=="480" ATTRS{busnum}=="1" ATTRS{devnum}=="2" ATTRS{devpath}=="1" ATTRS{version}==" 2.00" ATTRS{maxchild}=="7" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{authorized}=="1" ATTRS{product}=="USB 2.0 Hub [MTT]" looking at parent device '/devices/platform/atmel-ehci/usb1': KERNELS=="usb1" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="" ATTRS{bNumInterfaces}==" 1" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="e0" ATTRS{bMaxPower}==" 0mA" ATTRS{urbnum}=="26" ATTRS{idVendor}=="1d6b" ATTRS{idProduct}=="0002" ATTRS{bcdDevice}=="0206" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{speed}=="480" ATTRS{busnum}=="1" ATTRS{devnum}=="1" ATTRS{devpath}=="0" ATTRS{version}==" 2.00" ATTRS{maxchild}=="3" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{authorized}=="1" ATTRS{manufacturer}=="Linux 2.6.39.4-acnbfx100 ehci_hcd" ATTRS{product}=="Atmel EHCI UHP HS" ATTRS{serial}=="atmel-ehci" ATTRS{authorized_default}=="1" looking at parent device '/devices/platform/atmel-ehci': KERNELS=="atmel-ehci" SUBSYSTEMS=="platform" DRIVERS=="atmel-ehci" ATTRS{companion}=="" looking at parent device '/devices/platform': KERNELS=="platform" SUBSYSTEMS=="" DRIVERS=="" 

Устройство, которое я хочу сопоставить, это /devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2' . Вы можете видеть, что DRIVERS для этого устройства – «usb», и ничто ниже этого не будет соответствовать этому. Следующее правило решает мою проблему, должно быть даже общее решение, так как я уверен, что конечная точка устройства не будет обрабатываться драйвером usb.

 DRIVERS=="usb", KERNEL=="*cdc-wdm*", ENV{id}="$id", RUN="/usr/local/bin/modem_setup.sh" 

И это результат, который я искал все время:

 # udevadm info --query=all --name=/dev/cdc-wdm0 P: /devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5/usb/cdc-wdm0 N: cdc-wdm0 E: DEVNAME=/dev/cdc-wdm0 E: DEVPATH=/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5/usb/cdc-wdm0 E: MAJOR=180 E: MINOR=176 E: SUBSYSTEM=usb E: USEC_INITIALIZED=12243969 E: id=1-1.7.2 
  • UDEV выполняет скрипт bash только частично
  • Разница между / dev и / sys / class?
  • Как установить скорость повторения клавиатуры USB с помощью udev?
  • BunsenLabs (Deerrivative) не отключится (не удалось запустить poweroff.target: транзакция разрушительна)
  • Правило Udev для соответствия USB-устройству нескольких узлов
  • Зависимость не удалась для монтирования после dist-upgrade
  • Правило Udev для монтирования диска не работает
  • Что может привести к изменению скорости порта USB?
  • Правило Udev, позволяющее известным устройствам usb не обнаруживать мои хабы
  • Как получить udev для идентификации устройства USB, независимо от того, какой USB-порт подключен?
  • предотвращение перезаписи символики udev
  • Как предотвратить использование HID-устройства на некоторых USB-портах
  • Linux и Unix - лучшая ОС в мире.