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 

  • Как отключить звуковое устройство usb с udev
  • постоянное имя сетевого интерфейса и kvm
  • Как я могу скрывать сообщения udev?
  • Как определить, когда монитор подключен или отключен?
  • Почему сетевые интерфейсы не работают в / dev как другие устройства?
  • Как заставить udisksctl действовать для другого пользователя?
  • правила udev не различают
  • Ubuntu 14.04 - Несколько ручек Powermate для технологии Griffin
  • 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 
    Linux и Unix - лучшая ОС в мире.