Вопрос или проблема
На 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.
Ответ или решение
Ваша проблема с использованием правил 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 устройства вы можете:
-
Использовать подход с символьной ссылкой, который оказался у вас работоспособным. Например, используя правило символьной ссылки, вы можете получить доступ к устройству через
/dev/ttyZWAVE0
, что обеспечит аналогичную функциональность без фактического переименования устройства. -
Если вы настаиваете на использовании конкретного имени устройства, вам нужно будет создать правило с приоритетом в его обработке. Убедитесь, что ваше правило
udev
добавлено в файл, название которого начинается с цифры (например,99-usb.rules
). Это задаст более высокий приоритет для вашего правила в ряду правилudev
, но имейте в виду, что это не гарантирует успеха переименования.
Рекомендации
-
Проверьте, есть ли другие правила
udev
, которые могут перезаписывать ваше. Используйте командуudevadm info
для получения информации о конфликтах. -
Рассмотрите возможность использования других методов управления такими устройствами, например, настройку вашего программного обеспечения (например, Home Assistant, Domoticz и т.д.) для работы с устройством через символьную ссылку.
Заключение
В конечном итоге, вопрос с переименованием USB-устройства с помощью udev
связан с ограничениями системы, а не с неправильной настройкой правил. Производите управление устройствами с использованием символьных ссылок для избежания конфликтов в будущем. Не забывайте также консультироваться с документацией, чтобы избежать недопонимания функциональности правил udev
.