udev-Regel zum Zuweisen bekannter Symlinks für identische serielle USB-Geräte

8

Ich habe zwei (und möglicherweise in Zukunft weitere) serielle USB-Geräte, die identisch sind (leider bis auf die Seriennummer) - sie sind tatsächlich BTC-Miner. Derzeit ttyUSBXist X 0, 1 oder 2, da es auch ein anderes nicht verwandtes serielles USB-Gerät gibt (worüber Sie sich hier keine Sorgen machen müssen).

Ich möchte eine udev - Regel schreiben , die sie vorhersehbar Namen innerhalb zuweisen /dev, wie , /dev/miner0wo die Null eine ansteigende Ganzzahl. Es ist mir egal, welcher von ihnen als welcher endet, aber ich brauche sie in einem vorhersehbaren Bereich, der sich nicht ändert.

Derzeit habe ich Folgendes:

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

Das ist ziemlich nah, da ich am Ende Namen habe, wie ich will. Das einzige Problem ist, da die Bergleute und die dritte Einrichtung kann manchmal in zufälliger Reihenfolge angezeigt werden , könnte ich bis mit zwei enden miner0, miner1und miner2, aber ich weiß nie , welche zwei (ohne manuell suchen). Wenn ich weitere serielle Nicht-Miner-USB-Geräte hinzufüge (was eine Möglichkeit ist), wird das Problem dadurch verschärft.

Ich hatte einen Hinweis gefunden, %eder genau das tat, was ich wollte, aber er scheint nicht mehr zu existieren .

Wie kann ich diesen Geräten vorhersehbare Namen geben? Ich würde es vorziehen, sie möglichst nicht an ihren Standort auf dem USB-Bus zu binden.


Weitere Informationen / Hintergrund

Es ist erwähnenswert, dass es mich nicht so stört, wie die Namen lauten, sondern dass sie bekannt sind und sich nicht ändern, selbst wenn das Gerät an eine andere USB-Buchse angeschlossen wird. Ich würde einfach die ganze udev-Sache vergessen und Einträge in verwenden /dev/serial/by-id, aber da sie die gleiche Seriennummer haben, ist nur eine davon drin!

Erwähnenswert ist auch, dass der Grund dafür darin besteht, dass der Mining-Software eine Liste der zu prüfenden und zu findenden Geräte mitgeteilt werden muss. Ich kann einfach alles machen lassen (es findet im Grunde nur alle gültigen Miner im ttyUSB*Bereich), aber das nervt das Nicht-Miner-Gerät. Ich brauche also die Namen der Bergleute, die im Voraus bekannt sind, damit ich sie so konfigurieren kann, dass nur diese verwendet werden. Leider wird ein Platzhalter nicht akzeptiert (daher /dev/miner*scheint es nicht in Frage zu kommen, ihn nur zu verwenden ), daher dieses Problem.

Mark Embling
quelle
2
(Kommentieren von einem Telefon aus, damit ich nicht schauen kann): Sehen Sie sich den Code Ihrer Distribution an, der / dev / cdrom-Links usw. verarbeitet. Sie sollten in der Lage sein, diesen Ansatz zu wischen. Es verwendet eine Datei, um Änderungen beizubehalten, kann diese aber wahrscheinlich entfernen oder eine beim Booten gelöschte verwenden.
Derobert
Danke, das war ein guter Gedanke, der mir nicht in den Sinn kam. Ich habe es mir gerade angesehen und es scheint wirklich ziemlich komplex zu sein. Ich denke, es könnte angesichts des aktuellen Problems zu viel Aufwand sein, aber vielleicht etwas, das ich mir ansehen würde, wenn ich mich eher mit Dutzenden von Geräten als mit einstelligen Zahlen befassen würde.
Mark Embling
Hatte eine Pause und warf einen weiteren Blick und es ist verwirrend. Ich sehe, dass es in einer Datei bestehen bleibt und Sie haben Recht damit, dass ich das nicht möchte. Ich kann die Logik nicht herausfinden, wie es das nächste verfügbare herausfindet, da es die Datei vor dem Schreiben zu lesen scheint und dann nach dem Verwenden der Ausgabe darauf zu schreiben scheint. Äußerst verwirrend. Und Bash-Skripte sind nicht immer am einfachsten zu befolgen.
Mark Embling
Die meisten Unix-Programme akzeptieren keine Platzhalter, die Shell wird verwendet, um sie zu erweitern. Können Sie ein anderes Werkzeug verwenden, um die Platzhalter zu erweitern?
Strg-Alt-Delor
@richard Ich bin nicht sicher. Angesichts der folgenden Antwort ist dies nicht unbedingt erforderlich, da ich eine sinnvolle Sequenz habe, für die ich die Flags im Skript, mit dem die Software gestartet wird, manuell hinzufüge. Um diesen Teil auch ideal zu lösen, müsste ich vom Platzhalter (der aussehen würde /dev/btcminer/*) zu einer Liste wie dieser gelangen: -S /dev/btcminer/0 -S /dev/btcminer/1 <and so on if present>Welche Parameter nimmt die Software?
Mark Embling

Antworten:

4

Dies ist in Kombination ungetestet:

Fügen Sie IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM"Ihren Bergleuten eine udev-Regel hinzu .

Dann könnten Sie ein einfaches Shell-Skript verwenden, so etwas wie dieses etwas getestete Programm:

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

Dann können Sie diese udev-Umgebungsvariable verwenden, um Ihre Bergleute zu benennen.

derobert
quelle
Das hat sehr geholfen, danke. Ich habe es ein wenig optimiert, damit das Programm nur die Nummer zurückgibt (und nur die ersten beiden Argumente verwendet) und es dann aus der PROGRAM-Option in meiner udev-Regel heraus verwendet, deren Ausgabe sie sind, um den Symlink-Namen zu erstellen. Ich habe jetzt /dev/btcminer/0und /dev/btcminer/1was ist (eine leicht optimierte Version von) was ich wollte. Danke dafür! :-)
Mark Embling
Ich sollte auch erwähnen, dass ich auch den Shebang ändern musste #!/bin/bash. Aus irgendeinem Grund shwurde ein Syntaxfehler ("unerwartetes Wort") behauptet. Keine Ahnung warum oder was shunter Ubuntu ist, aber das hat es gelöst.
Mark Embling
1
@MarkEmbling Es stellt sich heraus, dass für SUS nur Zahlen bis zu 9 unterstützt werden müssen. Wenn Sie also diese beiden 16s in 9s ändern , funktioniert es in /bin/sh. Zumindest mit Bindestrich. (/ bin / sh auf diesem System ist aus irgendeinem Grund Bash)
derobert
Das ist perfekt, es funktioniert jetzt perfekt mit / bin / sh. Nochmals vielen Dank dafür, ich habe in den letzten Tagen viel gelernt. Noch nie zuvor udev berührt :-)
Mark Embling
2

Die Frage hat bereits eine akzeptierte Antwort, aber ich habe beschlossen, meine Variation der von derobert bereitgestellten Lösung zu teilen .

Meine Anforderungen waren etwas anders - zusätzlich zur Bereitstellung "inkrementierender" Indexnummern für neue Geräte - wollte ich Indexnummern neu abrufen, die von Geräten aufgegeben wurden, die aus dem System entfernt wurden.

Die udev-Regel zum Einrichten der Umgebungsvariablen würde ungefähr so ​​aussehen:

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

In meiner Lösung verwende ich keine Datei, um den Index zu verfolgen. Ich einfach den vorhandenen und finde den ersten verfügbaren Index:

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

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

Dadurch wird natürlich der Variablenname mit dem ersten verfügbaren Index , beispielsweise wenn diese bereits vorhanden sind:

miner0
miner1
miner2

und wird dann miner1vom System getrennt - wir bleiben mit:

miner0
miner2

Wenn Sie das Skript ausführen, wird Folgendes zurückgegeben:

MINER_NUM=1

... da dies jetzt der erste verfügbare Index ist .

dtmland
quelle