règle udev pour affecter des liens symboliques connus pour des périphériques série usb identiques

J'ai deux (et peut-être à l'avenir, plus) périphériques série USB qui sont identiques (jusqu'au numéro de série, malheureusement) – ils sont en réalité des mineurs CTB. Actuellement, ils se terminent par ttyUSBX où X est 0, 1 ou 2, car il existe un autre périphérique série non-apparenté (qui ne doit pas être inquiété ici).

Je voudrais écrire une règle udev qui leur assignera des noms prévisibles dans /dev , comme /dev/miner0 où le zéro est un entier incrémental. Je me fiche de savoir lequel d'entre eux finit par le faire, mais j'ai besoin que ces derniers se situent dans une fourchette prévisible qui ne changera pas.

Actuellement, j'ai ceci:

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

C'est assez proche, car je me retrouve avec des noms comme je veux. Le seul problème est que, puisque les mineurs et le troisième appareil peuvent parfois apparaître dans un ordre random, je pourrais finir avec deux de miner0 , miner1 et miner2 , mais je ne sais jamais lesquels (sans chercher manuellement). Si j'ajoute d'autres périphériques série non-mineur (ce qui est une possibilité), cela exacerbera le problème.

J'avais trouvé reference à %e qui semblait avoir fait exactement ce que je voulais, mais il ne semble plus exister .

Comment pourrais-je donner à ces appareils des noms prévisibles? Je préférerais ne pas les attacher à leur location sur le bus USB aussi bien que possible.


Informations complémentaires / arrière-plan

Il vaut la peine de mentionner que je ne suis pas dérangé par les noms, juste qu'ils soient connus et immuables même si / quand l'appareil est branché sur une autre prise USB. Je voudrais simplement oublier tout ce qui se passe dans udev et utiliser des inputs dans /dev/serial/by-id , mais comme ils ont le même numéro de série, il n'y en a qu'un seul!

Il convient également de mentionner que la raison en est que le logiciel d'exploitation doit être informé d'une list de périphériques à explorer et à find. Je peux juste le faire tout (il suffit de find tous les mineurs valides dans la gamme ttyUSB* ), mais cela agace le dispositif non-mineur. J'ai donc besoin des noms des mineurs connus à l'avance afin que je puisse les configurer pour les utiliser. Malheureusement, il n'acceptera pas un caractère générique (donc il suffit de lui dire d'utiliser /dev/miner* semble être hors de question), d'où ce problème.

Ceci n'est pas testé en combinaison:

Ajoutez une règle udev pour IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM" pour vos mineurs.

Ensuite, vous pouvez utiliser un script shell simple, quelque chose comme ce programme quelque peu testé:

 #!/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" 

Ensuite, vous pouvez utiliser cette variable d'environnement udev pour nommer vos mineurs.

La question a déjà une réponse acceptée, mais j'ai décidé de partager ma variante de la solution fournie par derobert .

Mes exigences étaient légèrement différentes – en plus de fournir des numéros d'index incrémentaux aux nouveaux périphériques – je voulais récupérer les numéros d'index qui ont été abandonnés par les périphériques qui ont été retirés du système.

La règle udev pour la configuration de la variable d'environnement ressemblerait à ceci:

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

Dans ma solution, je n'utilise pas de file pour suivre l'index, je boucle simplement le lien symbolique existant et trouve le premier index disponible:

/usr/local/sbin/unique-num script:

 #!/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 

Cela va bien sûr imprimer le nom-var avec le premier index disponible, par exemple si ces liens existent déjà:

 miner0 miner1 miner2 

et miner1 est détaché du système – il nous rest:

 miner0 miner2 

L'exécution du script returnnera:

 MINER_NUM=1 

… car c'est maintenant le premier index disponible .