
Ich arbeite an benutzerdefinierten Bash-Skripten für die Massenduplizierung von USB-Flash-Speichern und Massentests (mithilfe von f3
).
Ich frage mich, ob es möglich ist, festzustellen, an welchen USB-Anschluss ein USB-Stick angeschlossen ist.
Ich habe USB-Hubs mit nummerierten Ports. Wenn sie statische Adressen hätten, die ich identifizieren und anhand derer ich erkennen könnte, ob etwas angeschlossen ist oder nicht und was das ist (im Wesentlichen: welche /dev/sd*-Datei diesem USB-Port entspricht), könnte ich es den Benutzern viel einfacher machen, zu erkennen, was los ist, und ihnen ermöglichen, fehlerhafte Laufwerke frühzeitig im Prozess zu entfernen, ohne warten zu müssen, bis der gesamte Stapel verarbeitet ist, und dann versuchen, die fehlerhaften Laufwerke von den einwandfreien zu trennen (so mache ich es jetzt).
Ich habe herumgesucht, aber nichts von dem, was ich gefunden habe, schien mit dem zusammenzupassen, was ich erreichen möchte, also habe ich beschlossen, in diesem Zusammenhang direkt um Hilfe zu bitten.
Im Moment identifiziere ich Laufwerke anhand der /dev/sd*-Knotennamen und die Benutzer haben keine Ahnung, was das ist. Wenn ich diese USB-Anschlüssen in einem Hub zuordnen könnte, könnte ich die Informationen basierend auf den USB-Anschlüssen präsentieren und die Benutzer könnten wissen, dass an Anschluss 5 ein fehlerhaftes Laufwerk angeschlossen ist, und sie könnten es entfernen, ohne den Rest des laufenden Prozesses zu beeinträchtigen.
Ich könnte dann sogar damit aufhören, dies stapelweise zu tun, und alle Ports gleichzeitig in einer Schleife arbeiten lassen. Der Benutzer könnte die Laufwerke ständig ein- und ausstecken und anhand der HUB-Portnummern den Überblick darüber behalten, was was ist. Das könnte den Arbeitsablauf erheblich beschleunigen.
Die grundlegende Frage lautet also: Wie kann ich USB-Anschlüsse und an diese Anschlüsse angeschlossene USB-Flash-Speicher identifizieren?
Antwort1
Sie udevadm
erhalten mit dieGerätepfadeines Geräts. Dies geschieht durch die Untersuchung der symbolischen Links in /sys/
, Sie können dies also auch manuell tun (es ist jedoch einfacher zu verwenden udevadm
).
Beispielsweise erzeugt ein USB-Stick, der an einen externen USB-Hub meines Systems angeschlossen ist,
$ udevadm info -q path -n /dev/sdh
/devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1.1/3-1.1.3/3-1.1.3.2/3-1.1.3.2:1.0/host7/target7:0:0/7:0:0:0/block/sdh
Wie man durch den Vergleich mit dem USB-Baum sehen kann,
$ lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
|__ Port 1: Dev 26, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 29, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 31, If 0, Class=Mass Storage, Driver=usb-storage, 480M
|__ Port 4: Dev 30, If 0, Class=Mass Storage, Driver=usb-storage, 480M
...
Der 3-1.1.3.2
Pfadteil besagt, dass es auf Bus 3 durch Port 1 (auf der Southbridge), wieder Port 1 (auf dem Motherboard), Port 3 (immer noch auf dem Motherboard) und dann durch Port 2 des externen USB-Hubs geht. Port 4 dieses Hubs wird für einen SD-Kartenleser verwendet.
Je nachdem, wie Ihr USB-Hub angeschlossen ist, müssen Sie etwas Ähnliches tun und den letzten Port extrahieren, der Sie interessiert.
Antwort2
Dies ist eine Alternative zur akzeptierten Lösung, bei der Sie den Namen des Geräts nicht kennen, um ihn einem Befehl bereitzustellen (um Sie über das Gerät zu informieren).
VORFühren Sie nach dem Einstecken des USB-Speichersticks Folgendes aus:
udevadm monitor
Sobald der Stick eingesteckt ist, gibt er ausführliche Kernel- und Udev-Meldungen aus und teilt uns in der letzten Zeile mit, wie der Host den USB-Stick sieht:
Antwort3
Es scheint, als ob /dev/disk/by-path
es symbolische Links zu /dev/sd*
Knoten enthält und kann verwendet werden, um genau das herauszufinden.
Durch die Eingabe eines file /dev/disk/by-path/*
Befehls werden alle /dev/sd*
Knoten und ihre physischen Adressen aufgelistet. Ich sollte mich ziemlich leicht durch diese Liste navigieren können.