udev для назначения известных символических ссылок для идентичных последовательных устройств USB

У меня есть два (и, возможно, в будущем, больше) последовательные USB-устройства, которые идентичны (вплоть до серийного номера, к сожалению) – они на самом деле являются шахтерами BTC. В настоящее время они заканчиваются как ttyUSBX где X – 0, 1 или 2, так как есть еще одно несвязанное USB-устройство (также не нужно беспокоиться).

Я хотел бы написать правило udev, которое будет назначать им предсказуемые имена в /dev , например /dev/miner0 где нуль является инкрементирующим целым числом. Меня не волнует, какая из них заканчивается, но мне нужно, чтобы они находились в пределах предсказуемого диапазона, который не изменится.

В настоящее время у меня есть:

 SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="miner%n" 

Это довольно близко, так как я в конечном итоге с именами, как я хочу. Единственная проблема заключается в том, что шахтеры и третье устройство иногда могут появляться в произвольном порядке, я мог бы получить два из miner0 , miner1 и miner2 , но я никогда не знаю, какие два (без ручного поиска). Если я добавлю больше неинтернетных последовательных устройств (что возможно), это усугубит проблему.

Я нашел ссылку на %e которая выглядела так, как будто она сделала именно то, что я хотел, но она больше не существует .

Как я могу назвать эти устройства предсказуемыми именами? Я бы предпочел не привязывать их к их местоположению на шине USB, если это возможно.


Дополнительная информация / справочная информация

Стоит отметить, что я не беспокоился о том, что такое имена, просто они известны и остаются неизменными, даже если / когда устройство подключается к другому USB-разъему. Я просто забуду всю вещь udev и использую записи в /dev/serial/by-id , но поскольку у них одинаковый серийный номер, есть только один из них!

Также стоит упомянуть, что причина для этого заключается в том, что в программном обеспечении для горного дела должен быть указан список устройств для зондирования и поиска. Я могу просто заставить его делать все (в основном он просто находит всех действительных шахтеров в диапазоне ttyUSB* ), но это раздражает не-miner-устройство. Поэтому мне нужны имена известных шахтеров заранее, поэтому я могу настроить его, чтобы использовать только те. К сожалению, он не примет подстановочный знак (так что просто говорить об использовании /dev/miner* похоже, не может быть и речи), следовательно, эта проблема.

2 Solutions collect form web for “udev для назначения известных символических ссылок для идентичных последовательных устройств USB”

Это непроверено в сочетании:

Добавьте правило udev в IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM" для ваших шахтеров.

Тогда вы можете использовать простой сценарий оболочки, что-то вроде этой несколько проверенной программы:

 #!/bin/sh if [ $# -ne 3 ]; then echo "Usage: $0 data-file initial var-name" >&2 exit 1 fi datfile="$1" lockfile="$1.lck" initial=$2 key="$3" ( flock -x 9 num=$initial if [ -e "$datfile" ]; then read -r num < "$datfile" fi next=`expr $num + 1`; echo $next > "$datfile" echo "$key=$num" ) 9> "$lockfile" 

Затем вы можете использовать эту переменную окружения udev, чтобы назвать своих шахтеров.

Вопрос уже имеет принятый ответ, но я решил поделиться своим вариантом решения, предоставленного derobert .

Мои требования были несколько разными – в дополнение к предоставлению «инкрементных» номеров индексов новым устройствам – я хотел восстановить индексы, которые были оставлены устройствами, которые были удалены из системы.

Правило udev для настройки переменной окружения будет выглядеть примерно так:

 IMPORT{program}="/usr/local/sbin/unique-num /dev miner MINER_NUM" 

В моем решении я не использую файл для отслеживания индекса, я просто перебираю существующую символическую ссылку и нахожу первый доступный индекс:

/usr/local/sbin/unique-num :

 #!/bin/bash if [ $# -ne 3 ]; then echo "Usage: $0 location prefix var-name" >&2 exit 1 fi location="$1" prefix="$2" key="$3" needindex=1 index=0 while [ $needindex -eq 1 ] do if [ ! -e $location/$prefix$index ]; then needindex=0 echo "$key=$index" else (( index++ )) fi done 

Это, конечно же, распечатает var-name с первым доступным индексом, например, если эта символьная ссылка уже существует:

 miner0 miner1 miner2 

и затем miner1 отсоединяется от системы – мы остаемся с:

 miner0 miner2 

Запуск скрипта вернется:

 MINER_NUM=1 

… так как это теперь первый доступный индекс .

  • Как подключить USB-накопитель без root или fstab?
  • Обновление Linux Mint без доступа в Интернет
  • Пересылка USB для контейнеров LXC
  • Linux HID-драйвер для беспроводных клавиатур Primax
  • Как настроить два хоста Linux, подключенных через кроссовый кабель USB 3.0, и действовать так, как если бы это было устройство
  • Поддержка множества частот дискретизации при воспроизведении и записи в приложении, таком как Audacity
  • как получить идентификатор шины устройства USB
  • Как предотвратить добавление / удаление цикла udev
  • монтаж съемных USB-дисков с nodev, noexec, nosuid
  • Клавиатура USB (HID) не отвечает в Linux, а в grub
  • Как заблокировать доступ USB Stick на рабочей станции Linux?
  • Linux и Unix - лучшая ОС в мире.