Вопрос или проблема
Я использую приложение, которому нужно работать через usb-serial кабель, используя /dev/ttyUSB0.
Как /dev/ttyUSB0, так и пользователь, владеющий процессом, находятся в группе dialout, и права на порт установлены правильно (насколько я могу судить).
Тем не менее, моё приложение работает только в том случае, если я изменяю права на порт:
sudo chmod 666 /dev/ttyUSB0
. Я не хочу делать это вручную каждый раз.
Приложение – Node-RED. Я использую его для обмена данными с PLC Mitsubishi (не с Arduino). getent group dialout
действительно показывает правильного пользователя.
Другие вещи, которые я пробовал:
После перезагрузки связь не возобновляется автоматически.
Перезагрузка PLC не помогает. Однако, когда я перезапускаю процесс Node-RED (node-red-restart
), связь волшебным образом восстанавливается. Я подозревал, что первый процесс node-red мог иметь другого владельца, но это не так, я проверил.
Я уже не уверен, что это проблема с правами, но проблема все еще существует …
$ /bin/ls -l $( type -p node-red )
lrwxrwxrwx 1 root root 35 17 авг 15:09 /usr/bin/node-red -> ../lib/node_modules/node-red/red.js
$ id
uid=1000(jw) gid=1000(jw) groups=1000(jw),4(adm),20(dialout),24(cdrom),27(sudo),30(dip),46(plugdev),4120(lpadmin),130(lxd),131(sambashare)
$ getent group dialout
dialout:x:20:jw
$ ls -la /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 26 сен 15:17 /dev/ttyUSB0
$ ps aux | grep node-red
jw 1383 10.1 6.2 896816 62012 ? RNsl 25 сен 6:02 node-red
jw 2154 0.0 0.2 9040 2492 pts/0 S+ 00:51 0:00 grep --color=auto node-red
Я предполагаю, что вы используете Arduino или какое-то подобное устройство. Вероятно, вам нужно, чтобы у вашего пользователя были права dialout, а не у вашего устройства. Дайте вашему пользователю права с помощью этой команды sudo usermod -a -G dialout $USER
Также вам может быть интересно узнать о Arduino Stack Exchange
Поскольку я не был уверен, является ли это проблемой Linux или проблемой Node-RED, я задал тот же вопрос на их форуме.
Моя проблема, оказывается, решается, если я немного задержу запуск node-red при загрузке.
Для описания следуйте по ссылке
Ответ или решение
Проблема с применением прав группы dialout в Node-RED для USB-serial связи
Когда вы сталкиваетесь с ситуацией, когда ваше приложение Node-RED не может установить соединение с устройством через USB-кабель, несмотря на то, что пользователь и устройство находятся в группе dialout
, важно тщательно проанализировать несколько возможных причин этой проблемы. Давайте разберем вашу ситуацию более детально.
Состояние системы
Вы указали, что:
- Устройство
/dev/ttyUSB0
принадлежит группеdialout
и имеет правильные права доступа:crw-rw----
. - Ваш пользователь
jw
также является членом группыdialout
(по командеgetent group dialout
). - Приложение работает только после изменения прав доступа к порту на
666
, что непосредственно указывает на потенциальные проблемы с правами доступа.
Возможные причины проблемы
-
Задержка старта Node-RED: Обнаружено, что ваше приложение восстанавливает связь при перезапуске процесса Node-RED. Это может указывать на то, что при автозагрузке вашего приложения Node-RED не распознает устройство, так как оно может еще не быть инициализировано системой. Вы можете решить эту проблему, добавив небольшую задержку перед стартом Node-RED, чтобы обеспечить завершение инициализации устройства.
-
Управление правами доступа: Хотя ваш пользователь входит в группу
dialout
, есть вероятность, что членство в группе обновляется только при следующем входе в систему. Чтобы гарантировать, что права доступа используются корректно, вам стоит убедиться, что после добавления пользователя в группуdialout
, вы или ваша сессия перезапускается. Запустите следующую команду для обновления членов групп:newgrp dialout
-
Проблемы с правами подключения: Если USB-устройство подключается с изменяющимися правами доступа, это может быть проблемой udev правил. Проверьте, существуют ли специальные правила для вашего устройства в каталоге
/etc/udev/rules.d/
или/lib/udev/rules.d/
. Вы можете создать правило для установки правильных прав на ваш порт при его подключении. Например, создайте файл/etc/udev/rules.d/99-usb-serial.rules
со следующим содержимым:KERNEL=="ttyUSB[0-9]*", MODE="0660", GROUP="dialout"
-
Почтовая адресация /dev/ttyUSB0: Убедитесь, что Node-RED настроен для правильного использования порта. Проверьте конфигурацию узлов в Node-RED и убедитесь, что указано корректное имя устройства.
Рекомендации
-
Добавьте паузу к запуску Node-RED: Вы можете использовать систему инициализации, чтобы добавить задержку в старте Node-RED. Например, если вы используете
systemd
, вы можете добавитьExecStartPre
с командой ожидания:[Service] ExecStartPre=/bin/sleep 10 ExecStart=/usr/bin/node-red
-
Мониторинг и диагностика: Используйте утилиты для просмотра логов (
journalctl -u node-red.service
), чтобы получить информацию о том, что происходит при запуске Node-RED и инициализации оборудования. -
Регулярно проверяйте обновления приложения и зависимостей: Возможно, проблема исправлена в более поздних версиях Node-RED или пакетов, связанных с работой с последовательными портами.
Заключение
Проблемы с правами доступа и инициализацией оборудования часто могут быть решены через правильное управление группами и настройку запуска приложений. Убедитесь, что все настройки выполнены корректно, и используйте подходящие средства для диагностики, чтобы вам было легче находить первопричину проблемы. Если ваша проблема остается нерешенной, обратитесь к сообществу Node-RED или ресурсам, связанным с udev, для дальнейшей поддержки.