Правило UDEV
Модератор: Модераторы разделов
-
- Сообщения: 13
- ОС: debian 7
Правило UDEV
Добрый день. Появилась небольшая проблема. ОС Ubuntu 12.04.
Есть правило в udev, которое делает сим линк с ttyUSB* на ttyS4 (есть прикладной софт, который не умеет работать с USB, но умеет через COM порт).
Если запустить систему с включенным устройством (в данном случае касса), то сим линк сам не создается, перезапуск udev не помогает. А создается он только после выключения-включения устройства. Как бы так сделать, чтобы сим-линк создавался сразу при включении системы?
Есть правило в udev, которое делает сим линк с ttyUSB* на ttyS4 (есть прикладной софт, который не умеет работать с USB, но умеет через COM порт).
Если запустить систему с включенным устройством (в данном случае касса), то сим линк сам не создается, перезапуск udev не помогает. А создается он только после выключения-включения устройства. Как бы так сделать, чтобы сим-линк создавался сразу при включении системы?
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Правило UDEV
Вроде всё правильно. udev в данном случае отрабатывает в ответ на событие "в разъем воткнули что-то". Соответственно, если уже воткнуто, то событие не возникает.
Создавать сразу при включении системы можно, при условии, что устройство всегда подключено в разъем, иначе - сами понимаете, не создастся - нет источника.
Можно тем же udev. Правило так вот сходу не напишу - посмотрите правила для устройств типа CD-ROM. Как раз такая ситуация.
А можно и без udev.
Из Вашего поста не совсем ясно, сколько у Вас устройств подразумевается под ttyUSB*.
Если всегда одно, то проще. Воткните команду создания симлинка куда-нибудь в конец файла /etc/rc.local - и всех делов.
Команда такого примерно вида
Если имя ttyUSB* является переменным, значит устройство перетыкают из разъема в разъем, тогда вариант с созданием симлинка в rc.local не совсем подходит, то есть выглядеть будет несколько сложнее. Типа в цикле проверять наличие файлов вида /dev/ttyUSB* и для найденного файла создавать симлинк.
В общем, сформулируйте конкретнее условия задачи.
ПыСы. Симлинк в общем-то можно было бы руками создать один раз и будет он болтаться там всё время. Но поскольку это директория dev, которая сама наполняется динамически, то не получится. Можно постоянный симлинк создать где-нибудь в другом месте (не в /dev), если такой вариант допустим. В этом случае симлинк никуда не денется, но может быть дохлым - указывать на несуществующий источник (если устройство выключили, к примеру). При появлении соответствующего источника - оживет.
Создавать сразу при включении системы можно, при условии, что устройство всегда подключено в разъем, иначе - сами понимаете, не создастся - нет источника.
Можно тем же udev. Правило так вот сходу не напишу - посмотрите правила для устройств типа CD-ROM. Как раз такая ситуация.
А можно и без udev.
Из Вашего поста не совсем ясно, сколько у Вас устройств подразумевается под ttyUSB*.
Если всегда одно, то проще. Воткните команду создания симлинка куда-нибудь в конец файла /etc/rc.local - и всех делов.
Команда такого примерно вида
Код: Выделить всё
ln -s /dev/ttyUSB1 /dev/ttyS4
Если имя ttyUSB* является переменным, значит устройство перетыкают из разъема в разъем, тогда вариант с созданием симлинка в rc.local не совсем подходит, то есть выглядеть будет несколько сложнее. Типа в цикле проверять наличие файлов вида /dev/ttyUSB* и для найденного файла создавать симлинк.
В общем, сформулируйте конкретнее условия задачи.
ПыСы. Симлинк в общем-то можно было бы руками создать один раз и будет он болтаться там всё время. Но поскольку это директория dev, которая сама наполняется динамически, то не получится. Можно постоянный симлинк создать где-нибудь в другом месте (не в /dev), если такой вариант допустим. В этом случае симлинк никуда не денется, но может быть дохлым - указывать на несуществующий источник (если устройство выключили, к примеру). При появлении соответствующего источника - оживет.
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Как раз проблема в том, что много устройств и сим линк в rc.local не совсем то, что нужно. Сами правила
и т.д.
Может втыкаться 3-4 устройства и не выключаться из разъёма. На каждое, в зависимости от id, будет прописываться сим линк на разные ком порты. Щас почитаю правила на CD дисковод, надо посмотреть, подойдет ли.
Код: Выделить всё
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 дисковод, надо посмотреть, подойдет ли.
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Правило UDEV
Вообще есть устройства, которые работают по похожей схеме. Принтеры, например. Если принтер уже включен при включении системы, то все файлы устройств создаются корректно, равно как и при горячем подключении по USB. Но здесь я не уверен, что дело обходится только UDEV, возможно, что и драйвер принтера играет роль.
Внешние жесткие диски, флешки. Опять же, файлы устройств нормально создаются, независимо от момента подключения (до включения системы или после).
Посмотрите существующие правила для этих случаев. Наверняка, что-то найдется.
Внешние жесткие диски, флешки. Опять же, файлы устройств нормально создаются, независимо от момента подключения (до включения системы или после).
Посмотрите существующие правила для этих случаев. Наверняка, что-то найдется.
Спасибо сказали:
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Ok, попробую что нить найти, если знаний хватит))))
Получается, нужно что-то добавить в правила, чтоб udev постоянно проверял наличия этих устройств - и если они есть, делал сим линк?
Получается, нужно что-то добавить в правила, чтоб udev постоянно проверял наличия этих устройств - и если они есть, делал сим линк?
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
Во-первых, самое правильное - пропатчить прикладной софт (если исходники есть, конечно). Костыли с udev - не решение.
Во-вторых, пишите что-нибудь типа SYMLINK+="ttyS2%n" - так возможных конфликтов избежите.
В-третьих, плохая идея использовать MODE="0666". Сделайте для пользователей, которым нужно это устройство, отдельную группу, и используйте GROUP="mygroup".
Upd. Да, по теме - мне всегда казалось, что правила должны отрабатывать и при загрузке с подключённым устройством. Похоже, что-то в Ubuntu намутили.
Во-вторых, пишите что-нибудь типа SYMLINK+="ttyS2%n" - так возможных конфликтов избежите.
В-третьих, плохая идея использовать MODE="0666". Сделайте для пользователей, которым нужно это устройство, отдельную группу, и используйте GROUP="mygroup".
Upd. Да, по теме - мне всегда казалось, что правила должны отрабатывать и при загрузке с подключённым устройством. Похоже, что-то в Ubuntu намутили.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Bizdelnick писал(а): ↑21.04.2014 10:44Во-первых, самое правильное - пропатчить прикладной софт (если исходники есть, конечно). Костыли с udev - не решение.
Во-вторых, пишите что-нибудь типа SYMLINK+="ttyS2%n" - так возможных конфликтов избежите.
В-третьих, плохая идея использовать MODE="0666". Сделайте для пользователей, которым нужно это устройство, отдельную группу, и используйте GROUP="mygroup".
По поводу первого пункта, вариантов решения не нашел. Старый софт, который работает под wine и видит только com порты. даже под виндой ставить usb-com драйвера приходится.
По поводу 2го пункта - спасибо, учту, как погуглю %n ))
А по поводу третьего - тоже как вариант, группа нужна только для простого пользователя user или user1.
Пока не нашел как можно сделать создания симлинка при запуске. Флешки как то по другому работают.
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
Для wine рекомендуют делать ln -s /dev/tty/USB0 ~/.wine/dosdevices/com1. Сама программа и её возраст тут ни при чём, как и виндовые драйверы.
Я бы сделал пяток симлинков на устройства с разными номерами и оставил их навсегда, а udev не трогал.
Если лень заморачиваться - можно просто добавить его в группу dialout (или кому там по умолчанию этот файл принадлежит).
Я бы сделал пяток симлинков на устройства с разными номерами и оставил их навсегда, а udev не трогал.
Если лень заморачиваться - можно просто добавить его в группу dialout (или кому там по умолчанию этот файл принадлежит).
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
А сим-линк не будет исчезать, при выключении устройства? А если загрузка произойдет при выключенном устройстве и его включат только потом. Сим линк получается не создастся. По этому и хотелось бы нормальное правило.
Насчет ln -s /dev/tty/USB0 ~/.wine/dosdevices/com1 вообще не понятно)) выходит, что устройство будет в самом вайне уже как com1 определяться?
Насчет ln -s /dev/tty/USB0 ~/.wine/dosdevices/com1 вообще не понятно)) выходит, что устройство будет в самом вайне уже как com1 определяться?
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
Нет. Откуда ему об этом знать? Это просто файл.
Вы его руками создайте. Один раз. Скажем, com10 - это ttyUSB0, com11 - ttyUSB1 и т. д., смотря сколько максимально устройств планируется подключать.
Естественно, к COM-портам програма обращается через wine. А что за устройства он использует - см. ls -l ~/.wine/dosdevices/com*.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Только что попробовал способ с созданием симлинков в вайн, это пожалуй лучший способ. Вот только не могу понять. Есть несколько устройств, например 4. Они все включены и созданы сим линки, через них все работает. Как только одно из устройств выключается (либо еще и перезагрузка) - ttyUSB* по идее перескакивает на один номер ниже и сим линк другой берется. А в программе уже будет настроено это устройство на конкретный com порт и соответственно, работать перестанет. Как с этим быть?
И что будет, если подключать какие нить флешки, они же тоже ttyUSB станут и будет сим линк делаться? Просто не всегда кол-во устройств будет определяться точно, может 1, может 5
И что будет, если подключать какие нить флешки, они же тоже ttyUSB станут и будет сим линк делаться? Просто не всегда кол-во устройств будет определяться точно, может 1, может 5
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
Нет.
Нет.
Сделайте с запасом.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
А нельзя никак сделать, чтобы определенное устройство на определенный com порт падало, кроме как udevом пользоваться?
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
Нельзя.
Если очень хочется добиться постоянного номера порта, можно в udev прописать SYMLINK+="mydevice" и сделать симлинк ~/.wine/dosdevices/com10 -> /dev/mydevice. Тогда конфликтов с другими устройствами избежите. При условии, конечно, что к компьютеру не будут одновременно подключаться два устройства с одинаковыми VID:PID.
Если очень хочется добиться постоянного номера порта, можно в udev прописать SYMLINK+="mydevice" и сделать симлинк ~/.wine/dosdevices/com10 -> /dev/mydevice. Тогда конфликтов с другими устройствами избежите. При условии, конечно, что к компьютеру не будут одновременно подключаться два устройства с одинаковыми VID:PID.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
а не делает udev сим линк при старте системы. отсюда и все проблемы. так бы и правила оставить можно было
но, как правильно заметил ув. fflatx флешки и принтеры работают из коробки, может в ubuntu что-то не хватает, т.к. в 6 дебиане все вроде нормально работало
но, как правильно заметил ув. fflatx флешки и принтеры работают из коробки, может в ubuntu что-то не хватает, т.к. в 6 дебиане все вроде нормально работало
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Правило UDEV
Точно не знаю, могу только предположить.
Для устройства типа флешки при горячем подключении отрабатывает правило соответствующего usb-порта (куда её воткнули), а ещё одно правило отрабатывает для самого устройства (блочное это устройство или ещё какое...) и вот это же правило срабатывает, если флешка уже вставлена в порт при включении системы.
Таким образом, эта ситуация обрабатывается как минимум, двумя правилами.
Вот и стоит посмотреть, какие именно это правила.
А Вы, насколько я понимаю, создавали правила только на горячее подключение. То есть обработали только один вариант.
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Ну получается именно так. В общем-то, как сделать что-то посерьезнее не в курсе. По логике, когда система загружается, она сканирует подключенные устройства, и по идее должно сработать правило. Но даже когда все включилось, перезапуск правил или службы udev все равно не работает. Хотя ttyUSB0 есть в системе. Может сделать какой нить скрипт, который отключает все USB устройства и заного подключает, чтобы правила начали работать, может в эту сторону копать?
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Правило UDEV
А чем не устраивает вариант с набором постоянных симлинков, предложенный выше?hayks писал(а): ↑21.04.2014 14:55Ну получается именно так. В общем-то, как сделать что-то посерьезнее не в курсе. По логике, когда система загружается, она сканирует подключенные устройства, и по идее должно сработать правило. Но даже когда все включилось, перезапуск правил или службы udev все равно не работает. Хотя ttyUSB0 есть в системе. Может сделать какой нить скрипт, который отключает все USB устройства и заного подключает, чтобы правила начали работать, может в эту сторону копать?
Проще и надежней.
И главное, прозрачно - без всяких премудростей.
А то вот поди ж ты, догадайся, какие правила там в UDEV отработали и в каком порядке, а какие - нет.
Эти правила отлаживать - довольно трудоёмкое занятие.
А если ещё учесть, что действительно в дистре могли чего-то поломать, то становится совсем грустно.
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Просто, как мне кажется, будет неразбериха. Если устройства поменяют местами с одного USB на другой, ttyUSB точно станет не с другой цифрой? Как мне сделать симлинки, если нет под рукой других устройств?
Может есть какая-то команда/скрипт который переподключает usb устройства, чтобы правило можно было запустить?
Может есть какая-то команда/скрипт который переподключает usb устройства, чтобы правило можно было запустить?
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
При подключении устройство получает меньший из незанятых номеров.
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
%
udevadm trigger
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
Устройства пересоздаются, правило не отрабатывает
на debian 7 все отлично работает. т.е. это косяк в самой убунте, либо я что-то сломал
дома попробую на чистой ubuntu 12.04
попробовал на чистых ubuntu 12.04 и ubuntu 13.10 - тот же самым эффект
можно ли откатить udev без каких либо серьезных последствий?
-
- Сообщения: 1147
- Статус: Slacker!
- ОС: Slackware64-current
Re: Правило UDEV
можно ли откатить 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
-------------
Registered Linux User #557010
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
В смысле на более раннюю версию)
-
- Сообщения: 13
- ОС: debian 7
Re: Правило UDEV
В общем наверно я решил свою проблему.
Сделал так:
В правиле поменял SYMLINK=ttyS4 на NAME=disp, дальше создал руками симлинк с disp в .wine/dosdevices/com2. Правило при старте срабатывает.
По идее это должно решить мою проблему, посмотрим, как пойдет))
А потом еще раз переделал)) поправил name на symlink+=, а после руками сделал симлинк в dosdevices com2
Сделал так:
В правиле поменял SYMLINK=ttyS4 на NAME=disp, дальше создал руками симлинк с disp в .wine/dosdevices/com2. Правило при старте срабатывает.
По идее это должно решить мою проблему, посмотрим, как пойдет))
А потом еще раз переделал)) поправил name на symlink+=, а после руками сделал симлинк в dosdevices com2
-
- Сообщения: 325
Re: Правило UDEV
Я столкнулся с аналогичной проблемой и сделал такое правило:
Правило в каталоге /dev создаёт симлинк с именем com2 и запускает команду ln -s, которая в свою очередь создаёт симлинк в среде Wine. Его нужнопрописать несколько раз для других переходников с другими VID:PID.
Почему сделал именно так:
1) я заметил, что в некоторых системах сразу после установки заняты все COM-порты ttyS0 - ttyS31, а драйвера работают максимум до порта COM9, поэтому симлинк на ttyS32 бессмысленно, в этом случае нужно делать напрямую в среду Wine;
2) UDEV корректно создаёт симлинк только в каталоге /dev, я пробовал создавать правило для симлинков в других каталогах, симлинки создавались, но получались битыми;
3) можно обойтись и без SYMLINK+="com2", но если переходник будет извлечён и вставлен другой, то правило может не сработать, поскольку после извлечения остаётся битый симлинк в среде Wine, который нужно будет удалять руками ии создавать отдельное правило на его удаление при извлечени переходника.
Код: Выделить всё
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, который нужно будет удалять руками ии создавать отдельное правило на его удаление при извлечени переходника.
-
- Модератор
- Сообщения: 21251
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Правило UDEV
Lorte
Почему не так?
Хотя я бы не поленился и написать
Почему не так?
Код: Выделить всё
KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", RUN+="/bin/ln -sf %p /home/USERNAME/.wine/dosdevices/com2"
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 325
Re: Правило UDEV
Да можно и без него, просто лишний раз перестраховался. А вместо %p лучше прописать /dev/%k, иначе правило будет создавать битый симлинк.