Рейтинг:1

правило udev для похожих устройств

флаг ve

Я изо всех сил пытаюсь создать правила udev для некоторых подобных устройств (последовательный USB-порт). Вот вывод детали одного из них:

$ udevadm info --name=/dev/ttyACM0 --attribute-walk 

Информация Udevadm начинается с устройства, указанного devpath, а затем
поднимается по цепочке родительских устройств. Он печатает для каждого устройства
найдены все возможные атрибуты в формате ключа правил udev.
Правило для сопоставления может быть составлено из атрибутов устройства.
и атрибуты одного родительского устройства.

  глядя на устройство '/devices/pci0000:00/0000:00:15.0/usb1/1-3/1-3:1.0/tty/ttyACM0':
    ЯДРО=="ttyACM0"
    ПОДСИСТЕМА=="терминал"
    ВОДИТЕЛЬ==""

  просмотр родительского устройства '/devices/pci0000:00/0000:00:15.0/usb1/1-3/1-3:1.0':
    ЯДРА=="1-3:1.0"
    ПОДСИСТЕМЫ=="USB"
    ДРАЙВЕРЫ=="cdc_acm"
    АТТР{iad_bFunctionClass}=="02"
    ATTRS{iad_bInterfaceCount}=="02"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{iad_bFunctionSubClass}=="02"
    ATTRS{iad_bFirstInterface}=="00"
    АТТРС{bInterfaceSubClass}=="02"
    ATTRS{авторизованный}=="1"
    ATTRS{iad_bFunctionProtocol}=="00"
    АТТР{bmCapabilities}=="6"
    ATTRS{supports_autosuspend}=="1"
    АТТРС{bInterfaceClass}=="02"
    АТТР{bNumEndpoints}=="01"

  глядя на родительское устройство '/devices/pci0000:00/0000:00:15.0/usb1/1-3':
    ЯДРА=="1-3"
    ПОДСИСТЕМЫ=="USB"
    ДРАЙВЕРЫ=="USB"
    ATTRS{maxchild}=="0"
    АТТР{busnum}=="1"
    ATTRS{скорость}=="12"
    ATTRS{avoid_reset_quirk}=="0"
    АТТР{rx_lanes}=="1"
    АТТР{bDeviceSubClass}=="02"
    ATTRS{idVendor}=="2341"
    ATTRS{devnum}=="6"
    АТТР{bNumInterfaces}==" 2"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{причуды}=="0x0"
    ATTRS{devpath}=="3"
    ATTRS{bMaxPower}=="100 мА"
    ATTRS{bDeviceClass}=="ef"
    АТТР{tx_lanes}=="1"
    ATTRS{версия}==" 2.00"
    ATTRS{производитель}=="Ардуино"
    ATTRS{ltm_capable}=="нет"
    ATTRS{удаляемый}=="неизвестно"
    ATTRS{product}=="Nano 33 BLE"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{idProduct}=="805a"
    АТТР{bNumConfigurations}=="1"
    ATTRS{авторизованный}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{серийный}=="F594686789F67DE5"
    АТТР{bcdDevice}=="0101"
    ATTRS{конфигурация}==""
    АТТР{urbnum}=="13"
    АТТР{bmAttributes}=="c0"

  глядя на родительское устройство '/devices/pci0000:00/0000:00:15.0/usb1':
    ЯДРА=="usb1"
    ПОДСИСТЕМЫ=="USB"
    ДРАЙВЕРЫ=="USB"
    ATTRS{bDeviceClass}=="09"
    ATTRS{maxchild}=="8"
    ATTRS{ltm_capable}=="нет"
    АТТР{urbnum}=="85"
    ATTRS{производитель}=="Linux 5.11.0-38-универсальный xhci-hcd"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{причуды}=="0x0"
    ATTRS{product}=="хост-контроллер xHCI"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{devpath}=="0"
    АТТР{devnum}=="1"
    АТТР{rx_lanes}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{авторизованный_по умолчанию}=="1"
    ATTRS{скорость}=="480"
    АТТР{busnum}=="1"
    ATTRS{версия}==" 2.00"
    ATTRS{bConfigurationValue}=="1"
    АТТР{bNumInterfaces}==" 1"
    АТТР{idProduct}=="0002"
    ATTRS{авторизованный}=="1"
    ATTRS{bMaxPower}=="0 мА"
    ATTRS{серийный номер}=="0000:00:15.0"
    ATTRS{конфигурация}==""
    ATTRS{удаляемый}=="неизвестно"
    АТТР{bNumConfigurations}=="1"
    ATTRS{idVendor}=="1d6b"
    ATTRS{bmAttributes}=="e0"
    АТТР{bcdDevice}=="0511"
    АТТР{tx_lanes}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{interface_authorized_default}=="1"

  просмотр родительского устройства '/devices/pci0000:00/0000:00:15.0':
    ЯДРА=="0000:00:15.0"
    ПОДСИСТЕМЫ=="PCI"
    ДРАЙВЕРЫ=="xhci_hcd"
    ATTRS{редакция}=="0x0d"
    АТТР{ирк}=="126"
    ATTRS{driver_override}=="(null)"
    АТТР{dma_mask_bits}=="64"
    ATTRS{устройство}=="0x5aa8"
    ATTRS{subsystem_vendor}=="0x8086"
    ATTRS{включить}=="1"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{вендор}=="0x8086"
    ATTRS{subsystem_device}=="0x5aa8"
    ATTRS{power_state}=="D0"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{dbc}=="отключено"
    ATTRS{класс}=="0x0c0330"
    АТТР{ari_enabled}=="0"
    ATTRS{local_cpus}=="f"
    ATTRS{broken_parity_status}=="0"
    ATTRS{numa_node}=="-1"
    АТТР{msi_bus}=="1"
    АТТР{d3cold_allowed}=="1"

  глядя на родительское устройство '/devices/pci0000:00':
    ЯДРА=="pci0000:00"
    ПОДСИСТЕМЫ==""
    ДРАЙВЕРЫ==""

Сначала я хочу создать правило для этого устройства, не используя сериал атрибут (см. ниже).

В /etc/udev/rules.d я создал 10-жест.правила с этим содержанием:

SUBSYSTEM=="tty",SUBSYSTEMS=="usb",DRIVERS=="cdc_acm",ATTRS{idVendor}=="2341",ATTRS{idProduct}=="805a",SYMLINK+="жест"

тогда:

$ sudo chmod 0644 10-жест.правила
$ udevadm control --reload-rules && триггер udevadm

но симлинк не создается. Я также пытался:

$ sudo udevadm control --log-priority=debug
$ журналctl -f

но я не нахожу ничего подходящего.

Первый вопрос: Я наверняка сделал что-то не так в правиле.Можете ли вы помочь мне узнать, что?

я не хочу использовать сериал атрибут, потому что мне нужно подключить несколько таких устройств. Я не буду знать их серийное имя (кстати, фактические устройства могут меняться), поэтому я буду полагаться на тип устройства (ПОДСИСТЕМА, ПОДСИСТЕМЫ, ВОДИТЕЛИ и idVendor/idProduct атрибуты).

Второй вопрос: как создать символическую ссылку с прогрессивным номером (например, «жест1», «жест2») для всех устройств, соответствующих правилу? Порядок не важен.

Убунту 20.04

Рейтинг:1
флаг ng
  • 10-жест.правила 10 очень рано для таких устройств и это правило как раз для создания симлинков.

    Попробуйте использовать большое число 90~99, только если вы знаете правила, которые вы хотите переопределить (полностью или частично) или повлиять на его действия позже)

  • udev поддерживает подстановку переменных, поэтому вы можете использовать некоторые атрибуты в имени символической ссылки. В противном случае создайте скрипт, который проверяет предыдущие символические ссылки (или сохраняет последний номер в файле), увеличивает и использует его с ВЫПОЛНИТЬ+="" действие.

флаг ve
Я попробую ваш совет, а затем вернусь с отзывом. Я установил его на `10-`, потому что каталог `/etc/udev/rules.d` был пуст, поэтому я предположил, что более ранних правил не было...
user.dz avatar
флаг ng
@Mark, вам нужно знать, что существует несколько местоположений правил, и udev сканирует их все вместе, см. https://unix.stackexchange.com/a/205738/12209. Рекомендуется хранить ваши пользовательские правила в `/etc/udev/rules.d` и следить за аналогичными номерами и именами в других папках, чтобы вы знали порядок и избегали непреднамеренного переопределения. Также вы можете проверить, используя `udevadm test ...`, чтобы увидеть все загруженные правила и какие действия запускаются.
флаг ve
Понял, спасибо! Но, к сожалению, даже перенос правил на `99-` не сработал. Я изменил правило на `KERNEL=="ttyACM*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", SYMLINK+="ttyGesture%n", GROUP="dialout ", MODE="0666"`, и таким образом он срабатывает. Но я не уверен, что это правильный подход.
user.dz avatar
флаг ng
@Mark Хорошо, ваш подход хорош, если у вас нет подобного устройства, которое может мешать. Хотя он более строгий, чем предыдущий, возможно, символическая ссылка переписывается несколько раз в предыдущей настройке!
флаг ve
Есть ли способ показать эти перезаписи? Было бы полезно для отладки
user.dz avatar
флаг ng
@Mark, один из способов — добавить сценарий ведения журнала с помощью `RUN+=""`, другой - использовать `udevadm trigger ...` и `udevadm monitor -u` . Однажды я возобновил такие подсказки в https://unix.stackexchange.com/a/207712/12209, я использовал «выводить» строку в файл журнала каждый раз, когда срабатывает правило, и записывать имя узла и/или путь.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.