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 

  • Правило UDEV не запускается
  • Как найти доступные сетевые интерфейсы?
  • Использование udevadm для ожидания сканирования scsi для завершения внутри initramfs?
  • Нет / dev / ttyusb * в Linux
  • В чем разница в использовании xinput и synclient для деактивации сенсорной панели в X
  • Как использовать правила udev для управления / dev / xxx при работе в контейнере
  • Постоянное изменение владельца (или группы) объема LVM
  • Нет ttyUSB при подключении USB-RS485 к Beaglebone Black
  • 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 
    Interesting Posts

    Драйвер сенсорного экрана не инициализируется при первой загрузке, однако последующие загрузки

    Преобразуйте ps в pdf с помощью ps2pdf, но файл pdf не очень хорош

    Имитировать файлы bitrot / corrupt (для BTRFS)

    Предложения, необходимые для отладки, почему ps -ef застрял

    Команда для отображения использования памяти, использования диска и загрузки процессора

    Поиск того, какие дистрибутивные компакт-диски Debian содержат определенный пакет

    Как создать демона, который будет прослушивать dbus и сценарий пожара в сообщении

    Шведские символы юникода в xdm / xlogin

    с двумя головками с NVIDIA Quadro FX3450 / 4000 на Centos 6.2

    Создание большого файла со случайным содержимым: короткое сокращение путем копирования?

    логин с xdm и umlaut в пароле

    Как вернуть направление для последнего ярлыка параметра?

    Символическая ссылка на ~ / вместо ~ /

    Передача параметров SSH для git-clone

    Найти все слова, начинающиеся с Q

    Linux и Unix - лучшая ОС в мире.