regola udev per l'assegnazione di collegamenti simbolici noti a dispositivi seriali USB identici


8

Ho due (e forse in futuro, altri) dispositivi seriali USB identici (fino al numero seriale, sfortunatamente) - in realtà sono minatori BTC. Attualmente finiscono come ttyUSBXdove X è 0, 1 o 2, in quanto esiste anche un altro dispositivo seriale USB non correlato (che non deve essere preoccupato qui).

Vorrei scrivere una regola udev che assegnerà loro nomi prevedibili all'interno /dev, come /dev/miner0dove lo zero è un numero intero incrementale. Non mi interessa quale di essi finisca come quale, ma ho bisogno che siano entro un intervallo prevedibile che non cambierà.

Attualmente ho questo:

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

Questo è abbastanza vicino, perché finisco con nomi come voglio. L'unico problema è che, poiché i minatori e il terzo dispositivo possono talvolta apparire in un ordine casuale, potrei finire con due di miner0, miner1e miner2, ma non so mai quali due (senza guardare manualmente). Se aggiungo altri dispositivi seriali USB non minerari (che è una possibilità), aggraverà il problema.

Avevo trovato un riferimento a quello %eche sembrava fare esattamente quello che volevo, ma non sembra più esistere .

Come potrei dare a questi dispositivi nomi prevedibili? Preferirei non legarli alla loro posizione sul bus USB, se possibile.


Ulteriori informazioni / informazioni

Vale la pena ricordare che non sono così infastidito da quali siano i nomi, solo che siano conosciuti e immutabili anche se / quando il dispositivo viene collegato a una presa USB diversa. Vorrei semplicemente dimenticare l'intera cosa udev e usare le voci in /dev/serial/by-id, ma dato che hanno lo stesso numero di serie, ce n'è solo uno lì dentro!

Vale anche la pena ricordare che la ragione di ciò è che al software di mining è necessario comunicare un elenco di dispositivi da sondare e trovare. Posso solo fare tutto (fondamentalmente trova solo tutti i minatori validi nella ttyUSB*gamma), ma questo infastidisce il dispositivo non miner. Quindi ho bisogno dei nomi dei minatori conosciuti in anticipo in modo da poterlo configurare per usare solo quelli. Purtroppo non accetterà un carattere jolly (quindi solo dirgli di usarlo /dev/miner*sembra essere fuori questione), quindi questo problema.


2
(commentando da un telefono, quindi non riesco a guardare): dai un'occhiata al codice della tua distribuzione che gestisce i collegamenti / dev / cdrom, ecc. Dovresti essere in grado di scorrere l'approccio. Utilizza un file per mantenere le modifiche, ma può probabilmente eliminarlo o usarne uno cancellato all'avvio.
derobert,

Grazie, è stata una buona idea che non mi è venuta in mente. L'ho appena esaminato e sembra davvero piuttosto complesso. Penso che potrebbe essere uno sforzo eccessivo dato l'attuale problema, ma forse qualcosa che guarderei se avessi a che fare con decine di dispositivi piuttosto che con cifre singole.
Mark Embling,

Mi sono preso una pausa e ho dato un'altra occhiata ed è sconcertante. Vedo che persiste in un file e hai ragione nel non volerlo. Non riesco a capire la logica di come sia disponibile il prossimo disponibile, dato che sembra leggere il file prima che sia scritto e poi scriverlo dopo aver usato l'output. Assolutamente sconcertante. E gli script bash non sono i più facili da seguire nel migliore dei casi.
Mark Embling,

La maggior parte dei software Unix non accetta jolly, la shell viene utilizzata per espanderli. Puoi usare un altro strumento per espandere i caratteri jolly.
ctrl-alt-delor,

@richard non ne sono sicuro. Dato quello che ho dalla risposta qui sotto, non è essenziale in quanto ho una sequenza ragionevole per la quale aggiungo manualmente i flag nello script che avvia il software. Comunque idealmente per risolvere anche questa parte, dovrei passare dal jolly (che sarebbe simile /dev/btcminer/*) a un elenco come questo: -S /dev/btcminer/0 -S /dev/btcminer/1 <and so on if present>quali sono i parametri che il software accetta.
Mark Embling,

Risposte:


4

Questo non è testato in combinazione:

Aggiungi una regola udev a IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM"per i tuoi minatori.

Quindi potresti usare un semplice script di shell, qualcosa come questo programma un po 'testato:

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

Quindi puoi usare quella variabile d'ambiente udev per nominare i tuoi minatori.


Questo ha aiutato immensamente, grazie. L'ho modificato un po 'in modo che il programma restituisca solo il numero (e prenda solo i primi due argomenti) e quindi lo ho usato all'interno dell'opzione PROGRAM nella mia regola udev, il cui output è usato per creare il nome del collegamento simbolico. Ora ho /dev/btcminer/0e /dev/btcminer/1che è (una versione leggermente modificata di) quello che stavo cercando. Grazie per questo! :-)
Mark Embling,

Dovrei anche menzionare che dovevo cambiare anche lo shebang #!/bin/bash. Per qualche motivo, ha shaffermato che c'era un errore di sintassi ("parola inattesa"). Non so perché o cosa shc'è sotto Ubuntu, ma questo ha risolto.
Mark Embling,

1
@MarkEmbling Risulta che SUS richiede solo numeri fino a 9 per essere supportato. Quindi, se cambi quelle due 16s in 9s, allora funzionerà /bin/sh. Almeno con trattino. (/ bin / sh su questo sistema è bash per qualche motivo)
derobert il

È perfetto, ora funziona perfettamente con / bin / sh. Grazie ancora per questo, ho imparato molto negli ultimi due giorni. Mai toccato udev prima di ieri :-)
Mark Embling,

2

La domanda ha già una risposta accettata, ma ho deciso di condividere la mia variante della soluzione fornita da derobert .

Le mie esigenze erano leggermente diverse - oltre a fornire "incrementare" i numeri di indice ai nuovi dispositivi - volevo riacquistare i numeri di indice che erano stati abbandonati dai dispositivi che erano stati rimossi dal sistema.

La regola udev per l'impostazione della variabile di ambiente sarebbe simile a questa:

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

Nella mia soluzione, non uso un file per tenere traccia dell'indice, semplicemente giro sull'esistente e trova il primo indice disponibile:

/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

Questo, ovviamente, stamperà il nome var con il primo indice disponibile, ad esempio se questi esistono già:

miner0
miner1
miner2

e poi miner1viene staccato dal sistema - ci rimane:

miner0
miner2

L'esecuzione dello script restituirà:

MINER_NUM=1

... poiché questo è ora il primo indice disponibile .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.