Правило UDEV

Kubuntu, Xubuntu и другие

Модератор: Модераторы разделов

hayks
Сообщения: 13
ОС: debian 7

Правило UDEV

Сообщение hayks »

Добрый день. Появилась небольшая проблема. ОС Ubuntu 12.04.
Есть правило в udev, которое делает сим линк с ttyUSB* на ttyS4 (есть прикладной софт, который не умеет работать с USB, но умеет через COM порт).
Если запустить систему с включенным устройством (в данном случае касса), то сим линк сам не создается, перезапуск udev не помогает. А создается он только после выключения-включения устройства. Как бы так сделать, чтобы сим-линк создавался сразу при включении системы?
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Правило UDEV

Сообщение Hephaestus »

Вроде всё правильно. udev в данном случае отрабатывает в ответ на событие "в разъем воткнули что-то". Соответственно, если уже воткнуто, то событие не возникает.
Создавать сразу при включении системы можно, при условии, что устройство всегда подключено в разъем, иначе - сами понимаете, не создастся - нет источника.
Можно тем же udev. Правило так вот сходу не напишу - посмотрите правила для устройств типа CD-ROM. Как раз такая ситуация.
А можно и без udev.
Из Вашего поста не совсем ясно, сколько у Вас устройств подразумевается под ttyUSB*.
Если всегда одно, то проще. Воткните команду создания симлинка куда-нибудь в конец файла /etc/rc.local - и всех делов.
Команда такого примерно вида

Код: Выделить всё

ln -s /dev/ttyUSB1 /dev/ttyS4


Если имя ttyUSB* является переменным, значит устройство перетыкают из разъема в разъем, тогда вариант с созданием симлинка в rc.local не совсем подходит, то есть выглядеть будет несколько сложнее. Типа в цикле проверять наличие файлов вида /dev/ttyUSB* и для найденного файла создавать симлинк.
В общем, сформулируйте конкретнее условия задачи.

ПыСы. Симлинк в общем-то можно было бы руками создать один раз и будет он болтаться там всё время. Но поскольку это директория dev, которая сама наполняется динамически, то не получится. Можно постоянный симлинк создать где-нибудь в другом месте (не в /dev), если такой вариант допустим. В этом случае симлинк никуда не денется, но может быть дохлым - указывать на несуществующий источник (если устройство выключили, к примеру). При появлении соответствующего источника - оживет.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Как раз проблема в том, что много устройств и сим линк в rc.local не совсем то, что нужно. Сами правила

Код: Выделить всё

KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", SYMLINK="ttyS4", MODE="0666"

Код: Выделить всё

KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK="ttyS3", MODE="0666"
и т.д.
Может втыкаться 3-4 устройства и не выключаться из разъёма. На каждое, в зависимости от id, будет прописываться сим линк на разные ком порты. Щас почитаю правила на CD дисковод, надо посмотреть, подойдет ли.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Правило UDEV

Сообщение Hephaestus »

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

Внешние жесткие диски, флешки. Опять же, файлы устройств нормально создаются, независимо от момента подключения (до включения системы или после).

Посмотрите существующие правила для этих случаев. Наверняка, что-то найдется.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Ok, попробую что нить найти, если знаний хватит))))

Получается, нужно что-то добавить в правила, чтоб udev постоянно проверял наличия этих устройств - и если они есть, делал сим линк?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

Во-первых, самое правильное - пропатчить прикладной софт (если исходники есть, конечно). Костыли с udev - не решение.
Во-вторых, пишите что-нибудь типа SYMLINK+="ttyS2%n" - так возможных конфликтов избежите.
В-третьих, плохая идея использовать MODE="0666". Сделайте для пользователей, которым нужно это устройство, отдельную группу, и используйте GROUP="mygroup".

Upd. Да, по теме - мне всегда казалось, что правила должны отрабатывать и при загрузке с подключённым устройством. Похоже, что-то в Ubuntu намутили.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Bizdelnick писал(а):
21.04.2014 10:44
Во-первых, самое правильное - пропатчить прикладной софт (если исходники есть, конечно). Костыли с udev - не решение.
Во-вторых, пишите что-нибудь типа SYMLINK+="ttyS2%n" - так возможных конфликтов избежите.
В-третьих, плохая идея использовать MODE="0666". Сделайте для пользователей, которым нужно это устройство, отдельную группу, и используйте GROUP="mygroup".


По поводу первого пункта, вариантов решения не нашел. Старый софт, который работает под wine и видит только com порты. даже под виндой ставить usb-com драйвера приходится.
По поводу 2го пункта - спасибо, учту, как погуглю %n ))
А по поводу третьего - тоже как вариант, группа нужна только для простого пользователя user или user1.

Пока не нашел как можно сделать создания симлинка при запуске. Флешки как то по другому работают.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

Для wine рекомендуют делать ln -s /dev/tty/USB0 ~/.wine/dosdevices/com1. Сама программа и её возраст тут ни при чём, как и виндовые драйверы.
Я бы сделал пяток симлинков на устройства с разными номерами и оставил их навсегда, а udev не трогал.

hayks писал(а):
21.04.2014 10:53
группа нужна только для простого пользователя user или user1.

Если лень заморачиваться - можно просто добавить его в группу dialout (или кому там по умолчанию этот файл принадлежит).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

А сим-линк не будет исчезать, при выключении устройства? А если загрузка произойдет при выключенном устройстве и его включат только потом. Сим линк получается не создастся. По этому и хотелось бы нормальное правило.
Насчет ln -s /dev/tty/USB0 ~/.wine/dosdevices/com1 вообще не понятно)) выходит, что устройство будет в самом вайне уже как com1 определяться?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

hayks писал(а):
21.04.2014 11:29
А сим-линк не будет исчезать, при выключении устройства?

Нет. Откуда ему об этом знать? Это просто файл.

hayks писал(а):
21.04.2014 11:29
А если загрузка произойдет при выключенном устройстве и его включат только потом. Сим линк получается не создастся.

Вы его руками создайте. Один раз. Скажем, com10 - это ttyUSB0, com11 - ttyUSB1 и т. д., смотря сколько максимально устройств планируется подключать.

hayks писал(а):
21.04.2014 11:29
Насчет ln -s /dev/tty/USB0 ~/.wine/dosdevices/com1 вообще не понятно)) выходит, что устройство будет в самом вайне уже как com1 определяться?

Естественно, к COM-портам програма обращается через wine. А что за устройства он использует - см. ls -l ~/.wine/dosdevices/com*.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Только что попробовал способ с созданием симлинков в вайн, это пожалуй лучший способ. Вот только не могу понять. Есть несколько устройств, например 4. Они все включены и созданы сим линки, через них все работает. Как только одно из устройств выключается (либо еще и перезагрузка) - ttyUSB* по идее перескакивает на один номер ниже и сим линк другой берется. А в программе уже будет настроено это устройство на конкретный com порт и соответственно, работать перестанет. Как с этим быть?
И что будет, если подключать какие нить флешки, они же тоже ttyUSB станут и будет сим линк делаться? Просто не всегда кол-во устройств будет определяться точно, может 1, может 5
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

hayks писал(а):
21.04.2014 11:48
Как только одно из устройств выключается (либо еще и перезагрузка) - ttyUSB* по идее перескакивает на один номер ниже

Нет.

hayks писал(а):
21.04.2014 11:48
если подключать какие нить флешки, они же тоже ttyUSB станут

Нет.

hayks писал(а):
21.04.2014 11:48
Просто не всегда кол-во устройств будет определяться точно, может 1, может 5

Сделайте с запасом.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Bizdelnick писал(а):
21.04.2014 12:01
Сделайте с запасом.

А нельзя никак сделать, чтобы определенное устройство на определенный com порт падало, кроме как udevом пользоваться?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

Нельзя.
Если очень хочется добиться постоянного номера порта, можно в udev прописать SYMLINK+="mydevice" и сделать симлинк ~/.wine/dosdevices/com10 -> /dev/mydevice. Тогда конфликтов с другими устройствами избежите. При условии, конечно, что к компьютеру не будут одновременно подключаться два устройства с одинаковыми VID:PID.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

а не делает udev сим линк при старте системы. отсюда и все проблемы. так бы и правила оставить можно было
но, как правильно заметил ув. fflatx флешки и принтеры работают из коробки, может в ubuntu что-то не хватает, т.к. в 6 дебиане все вроде нормально работало
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Правило UDEV

Сообщение Hephaestus »

hayks писал(а):
21.04.2014 12:48
а не делает udev сим линк при старте системы. отсюда и все проблемы. так бы и правила оставить можно было
но, как правильно заметил ув. fflatx флешки и принтеры работают из коробки, может в ubuntu что-то не хватает, т.к. в 6 дебиане все вроде нормально работало
Точно не знаю, могу только предположить.
Для устройства типа флешки при горячем подключении отрабатывает правило соответствующего usb-порта (куда её воткнули), а ещё одно правило отрабатывает для самого устройства (блочное это устройство или ещё какое...) и вот это же правило срабатывает, если флешка уже вставлена в порт при включении системы.
Таким образом, эта ситуация обрабатывается как минимум, двумя правилами.
Вот и стоит посмотреть, какие именно это правила.

А Вы, насколько я понимаю, создавали правила только на горячее подключение. То есть обработали только один вариант.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Ну получается именно так. В общем-то, как сделать что-то посерьезнее не в курсе. По логике, когда система загружается, она сканирует подключенные устройства, и по идее должно сработать правило. Но даже когда все включилось, перезапуск правил или службы udev все равно не работает. Хотя ttyUSB0 есть в системе. Может сделать какой нить скрипт, который отключает все USB устройства и заного подключает, чтобы правила начали работать, может в эту сторону копать?
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Правило UDEV

Сообщение Hephaestus »

hayks писал(а):
21.04.2014 14:55
Ну получается именно так. В общем-то, как сделать что-то посерьезнее не в курсе. По логике, когда система загружается, она сканирует подключенные устройства, и по идее должно сработать правило. Но даже когда все включилось, перезапуск правил или службы udev все равно не работает. Хотя ttyUSB0 есть в системе. Может сделать какой нить скрипт, который отключает все USB устройства и заного подключает, чтобы правила начали работать, может в эту сторону копать?
А чем не устраивает вариант с набором постоянных симлинков, предложенный выше?
Проще и надежней.
И главное, прозрачно - без всяких премудростей.
А то вот поди ж ты, догадайся, какие правила там в UDEV отработали и в каком порядке, а какие - нет.
Эти правила отлаживать - довольно трудоёмкое занятие.
А если ещё учесть, что действительно в дистре могли чего-то поломать, то становится совсем грустно.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Просто, как мне кажется, будет неразбериха. Если устройства поменяют местами с одного USB на другой, ttyUSB точно станет не с другой цифрой? Как мне сделать симлинки, если нет под рукой других устройств?
Может есть какая-то команда/скрипт который переподключает usb устройства, чтобы правило можно было запустить?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

hayks писал(а):
21.04.2014 15:40
Если устройства поменяют местами с одного USB на другой, ttyUSB точно станет не с другой цифрой?

При подключении устройство получает меньший из незанятых номеров.

hayks писал(а):
21.04.2014 15:40
Как мне сделать симлинки, если нет под рукой других устройств?

Shell

% ls /dev/ttyUSB0 ls: невозможно получить доступ к /dev/ttyUSB0: Нет такого файла или каталога % ln -s /dev/ttyUSB0 /tmp/com1 % ls -l /tmp/com1 lrwxrwxrwx 1 user user 12 Апр 21 11:36 /tmp/com1 -> /dev/ttyUSB0 %


hayks писал(а):
21.04.2014 15:40
Может есть какая-то команда/скрипт который переподключает usb устройства, чтобы правило можно было запустить?

udevadm trigger
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

Bizdelnick писал(а):
21.04.2014 15:59
udevadm trigger


Устройства пересоздаются, правило не отрабатывает

на debian 7 все отлично работает. т.е. это косяк в самой убунте, либо я что-то сломал

дома попробую на чистой ubuntu 12.04

попробовал на чистых ubuntu 12.04 и ubuntu 13.10 - тот же самым эффект

можно ли откатить udev без каких либо серьезных последствий?
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1147
Статус: Slacker!
ОС: Slackware64-current

Re: Правило UDEV

Сообщение yars »

можно ли откатить udev без каких либо серьезных последствий?

Если правила создавали в /etc/udev/rules.d, то просто удалите или переименуйте созданные вами файлы, убрав расширение имени .rules, затем перезапустите udev:

Код: Выделить всё

# /etc/init.d/udev reload
Slackware64-current/Xfce/Xiaomi Mi Notebook Pro 15.6 | Arch Linux/Xfce/Lenovo G580
-------------
Registered Linux User #557010
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

В смысле на более раннюю версию)
Спасибо сказали:
hayks
Сообщения: 13
ОС: debian 7

Re: Правило UDEV

Сообщение hayks »

В общем наверно я решил свою проблему.

Сделал так:

В правиле поменял SYMLINK=ttyS4 на NAME=disp, дальше создал руками симлинк с disp в .wine/dosdevices/com2. Правило при старте срабатывает.

По идее это должно решить мою проблему, посмотрим, как пойдет))


А потом еще раз переделал)) поправил name на symlink+=, а после руками сделал симлинк в dosdevices com2
Спасибо сказали:
Lorte
Сообщения: 325

Re: Правило UDEV

Сообщение Lorte »

Я столкнулся с аналогичной проблемой и сделал такое правило:

Код: Выделить всё

KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="com2", MODE="0666", RUN+="/bin/ln -s /dev/com2 /home/USERNAME/.wine/dosdevices/com2"

Правило в каталоге /dev создаёт симлинк с именем com2 и запускает команду ln -s, которая в свою очередь создаёт симлинк в среде Wine. Его нужнопрописать несколько раз для других переходников с другими VID:PID.
Почему сделал именно так:
1) я заметил, что в некоторых системах сразу после установки заняты все COM-порты ttyS0 - ttyS31, а драйвера работают максимум до порта COM9, поэтому симлинк на ttyS32 бессмысленно, в этом случае нужно делать напрямую в среду Wine;
2) UDEV корректно создаёт симлинк только в каталоге /dev, я пробовал создавать правило для симлинков в других каталогах, симлинки создавались, но получались битыми;
3) можно обойтись и без SYMLINK+="com2", но если переходник будет извлечён и вставлен другой, то правило может не сработать, поскольку после извлечения остаётся битый симлинк в среде Wine, который нужно будет удалять руками ии создавать отдельное правило на его удаление при извлечени переходника.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21251
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Правило UDEV

Сообщение Bizdelnick »

Lorte
Почему не так?

Код: Выделить всё

KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", RUN+="/bin/ln -sf %p /home/USERNAME/.wine/dosdevices/com2"
Хотя я бы не поленился и написать
Lorte писал(а):
25.08.2014 01:11
отдельное правило на его удаление при извлечени переходника.

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Lorte
Сообщения: 325

Re: Правило UDEV

Сообщение Lorte »

Да можно и без него, просто лишний раз перестраховался. А вместо %p лучше прописать /dev/%k, иначе правило будет создавать битый симлинк.
Спасибо сказали: