Правило Udev для переименования USB-устройства, похоже, не работает.

Вопрос или проблема

На Raspberry Pi 4 с установленным Ubuntu 20.04 на aarch64 у меня есть USB ZWave устройство, которое я хочу обозначить под определенным именем, поэтому я написал простое правило udev для этого, но, похоже, оно не работает.

Идентификатор производителя и продукта: 0658:0200

Мое правило:

ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", NAME="ttyZWAVE0"

Тем не менее, устройство продолжает отображаться как ttyACM0.

Если я использую следующее правило, которое имеет такие же критерии соответствия, чтобы создать символическую ссылку вместо этого, символическая ссылка отображается правильно:

ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="ttyZWAVE0"

Вот мой вывод udevadm --name=/dev/ttyACM0 --attribute-walk до создания правила:

  looking at parent device '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1':
    KERNELS=="1-1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bcdDevice}=="0000"
    ATTRS{version}==" 2.00"
    ATTRS{rx_lanes}=="1"
    ATTRS{devpath}=="1.1"
    ATTRS{removable}=="unknown"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{idVendor}=="0658"
    ATTRS{bmAttributes}=="80"
    ATTRS{ltm_capable}=="no"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{idProduct}=="0200"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{busnum}=="1"
    ATTRS{urbnum}=="12"
    ATTRS{configuration}==""
    ATTRS{speed}=="12"
    ATTRS{tx_lanes}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{devspec}=="(null)"
    ATTRS{devnum}=="3"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceClass}=="02"

Почему правило для прямого переименования не работает, ни с помощью udev trigger, ни при полном перезагрузке системы, в то время как правило для добавления символической ссылки работает? Я упускаю что-то простое?

Я не вижу ничего полезного в journalctl (буквально ничего даже не упоминается, ни ошибок, ни о чем).

Редактирование для добавления:

Похоже, это также не работает таким же образом на моем ноутбуке, работающем под управлением Ubuntu 20.04 на amd64, с точно такими же результатами (естественно, с разными путями к родительским устройствам).

udevadm test /sys/path/to/device тоже не дает очевидных ответов о том, почему это не делает то, что я ожидаю. Он показывает, что он читает мои правила и ошибок нет…

Это просто не допускается согласно документации udev. Как показано в нескольких других вопросах, которые я нашел с тех пор, как опубликовал этот, это упоминается в страницах man. Я не нашел это уточнение, пока не назвал свое правило таким образом, чтобы оно выполнялось последним, что вызвало ошибку в udevadm test, указывающую мне в правильном направлении.

Это задокументировано на официальном сайте и в udev.7.

https://www.freedesktop.org/software/systemd/man/udev.html

Ответ или решение

Ваша проблема с использованием правил udev для переименования USB-устройства является распространённой среди пользователей Linux, и решение оказывается проще, чем кажется на первый взгляд. Давайте внимательно рассмотрим причину, по которой ваше правило не срабатывает для переименования устройства и как это можно исправить.

Анализ проблемы

Вы указали, что у вас есть USB-устройство с идентификатором производителя и продукта 0658:0200, и вы хотите переименовать его в ttyZWAVE0 с помощью следующего правила udev:

ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", NAME="ttyZWAVE0"

Однако устройство продолжает появляться как ttyACM0. В то же время, создание символьной ссылки с аналогичными критериями срабатывает корректно:

ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="ttyZWAVE0"

Причины неполадок

Согласно документации udev, переименование устройств с использованием директивы NAME= имеет специфические ограничения. Основная проблема заключается в том, что udev не допускает переименования устройств, которые уже имеют предопределённые имена (например, ttyACM0, ttyUSB0 и т.д.), поскольку это может нарушить логику работы системы и привести к конфликтам.

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

Решение проблемы

Для корректного переименования вашего ZWave устройства вы можете:

  1. Использовать подход с символьной ссылкой, который оказался у вас работоспособным. Например, используя правило символьной ссылки, вы можете получить доступ к устройству через /dev/ttyZWAVE0, что обеспечит аналогичную функциональность без фактического переименования устройства.

  2. Если вы настаиваете на использовании конкретного имени устройства, вам нужно будет создать правило с приоритетом в его обработке. Убедитесь, что ваше правило udev добавлено в файл, название которого начинается с цифры (например, 99-usb.rules). Это задаст более высокий приоритет для вашего правила в ряду правил udev, но имейте в виду, что это не гарантирует успеха переименования.

Рекомендации

  • Проверьте, есть ли другие правила udev, которые могут перезаписывать ваше. Используйте команду udevadm info для получения информации о конфликтах.

  • Рассмотрите возможность использования других методов управления такими устройствами, например, настройку вашего программного обеспечения (например, Home Assistant, Domoticz и т.д.) для работы с устройством через символьную ссылку.

Заключение

В конечном итоге, вопрос с переименованием USB-устройства с помощью udev связан с ограничениями системы, а не с неправильной настройкой правил. Производите управление устройствами с использованием символьных ссылок для избежания конфликтов в будущем. Не забывайте также консультироваться с документацией, чтобы избежать недопонимания функциональности правил udev.

Оцените материал
Добавить комментарий

Капча загружается...