Создайте символическую ссылку на устройство с помощью udev на основе ответа устройства, а не информации об устройстве udev - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть три разных последовательных устройства, подключенных к трем последовательным USB-конвертерам (FTDI USB-RS232).Если я подключу их, я получу общие имена устройств / dev / ttyUSBx, как и ожидалось.Когда я пытаюсь написать некоторые правила udev, udevadm показывает мне одинаковый вывод для трех устройств, за исключением некоторых атрибутов серийного идентификатора устройства.

Эти серийные идентификаторы будут меняться на каждом устройстве, поэтому, если я использую другой usb-serialконвертер, мои правила больше не будут работать.Итак, мне нужен способ связи с конкретным устройством, подключенным к последовательным преобразователям, и идентификации его по его реакции.

«Написание правил udev» HOWTO , говорит следующее об использовании функции PROGRAM для вызова внешней программы для именования устройств:

PROGRAM используется для запуска программкоторые производят имена устройств (и они не должны делать ничего, кроме этого).Когда эти программы выполняются, узел устройства еще не был создан, поэтому воздействие на устройство каким-либо образом невозможно,

Пример правила: SUBSYSTEM=="usb", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"

, такЯ не могу написать / dev / ttyUSBx оттуда, чтобы идентифицировать устройство.Затем у меня есть функциональность RUN, но кажется, что он не может создать новый SYMLINK, поскольку udev не получит вывод RUN.

Пример правила: SUBSYSTEM=="usb", RUN="/bin/program"

Могу ли я проинструктироватьudev из этого сценария RUN для создания символической ссылки?Или я могу создать эту символическую ссылку оттуда вручную?

Спасибо

Ответы [ 2 ]

1 голос
/ 27 июля 2012

на самом деле можно создать символическую ссылку на устройство на основе ответа устройства, используя PROGRAM, несмотря на то, что сказано в документации.Это только для символических ссылок, а не имен устройств.

Имейте в виду, что каждое правило, которое соответствует ПОСЛЕ вашего и задает SYMLINK, должно быть таким,

SYMLINK+=

, так что ваша спецификация SIMLINKбудет соединен с новым.В другом случае ваша символическая ссылка будет удалена.

Лучший способ узнать, что происходит в udev, - настроить уровень журнала для отладки:

sudo udevadm control --log-priority=debug

Вы найдете эти журналы в/var/log/messages или /var/log/syslog, в зависимости от вашего дистрибутива.

1 голос
/ 28 декабря 2011

Слепой разговор по последовательному порту автоматически, когда он подключен к компьютеру, довольно страшная вещь.Вы уверены, что хотите это сделать?Прежде всего, это займет некоторое время, что приведет к задержке появления узла устройства, если udev придется ждать результата перед его созданием.Если устройство выключено или его последовательный порт отключен, вы не сможете правильно назвать его (и вам понадобится тайм-аут для обнаружения этого).Наконец, если подключено другое устройство, помимо одного из ожидаемых, возможно, вы отправляете ему мусор, который имеет непредвиденные последствия.

Возможно, вы захотите использовать серийные номера адаптеров, чтобы отличать их друг от друга, и связать каждое из них.адаптер для внешнего устройства в согласованном порядке.Если ваши адаптеры даже имеют действительные серийные номера вместо строк-заполнителей, таких как 00000000, то вам уже повезло!

Тем не менее, это то, как вы бы это сделали.

Как выПодозреваю, вы не можете использовать RUN, потому что это слишком поздно, узел устройства уже создан.Вы должны использовать PROGRAM.В вашей программе вам придется самостоятельно создавать узел устройства, используя mknod, потому что udev еще этого не сделал.Вам следует создать временный узел во временной папке и уничтожить его до выхода из программы.

### Create the temporary device node in /tmp
device="/tmp/udev_device_guesser.$$"
# Note: mknod does not appear to be vulnerable to a symlink attack
mknod "$device" c "$MAJOR" "$MINOR"

### Use this device node to query what's attached to the serial port
insert your code here

### Get rid of the temporary node
rm -f "$device"
exit 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...