USB/IP zähmen

Regelmäßig stellt sich die Aufgabe, ein USB-Gerät über ein lokales Netzwerk mit einem Remote-PC zu verbinden. Unter dem Schnitt wird der Verlauf meiner Suche in dieser Richtung dargelegt und der Weg zu einer fertigen Lösung basierend auf einem Open-Source-Projekt USB/IP mit einer Beschreibung der Hindernisse, die von verschiedenen Menschen auf diesem Weg sorgfältig gesetzt wurden, sowie Möglichkeiten, diese zu umgehen.

Teil eins, historisch

Wenn die Maschine virtuell ist, ist das alles einfach. Die Funktionalität der USB-Weiterleitung von einem Host zu einer virtuellen Maschine wurde in VMWare 4.1 eingeführt. Aber in meinem Fall musste der Sicherheitsschlüssel, erkennbar als WIBU-KEY, zu unterschiedlichen Zeiten mit verschiedenen Maschinen verbunden werden, und nicht nur mit virtuellen.
Die erste Suchrunde im fernen Jahr 2009 führte mich zu einem Stück Eisen namens TrendNet TU2-NU4
Profis:

  • manchmal funktioniert es sogar

Nachteile:

  • funktioniert nicht immer. Angenommen, der Guardant Stealth II-Schutzschlüssel startet nicht und flucht mit der Fehlermeldung „Gerät kann nicht gestartet werden“.
  • Verwaltungssoftware (Lesen – Ein- und Aushängen von USB-Geräten) ist äußerst erbärmlich. Befehlszeilenschalter, Automatisierung - nein, noch nicht gehört. Alles ist reine Handarbeit. Alptraum.
  • Die Steuerungssoftware sucht per Broadcast nach dem Stück Eisen selbst im Netzwerk, sodass dies nur innerhalb eines Broadcast-Netzwerksegments funktioniert. Sie können die IP-Adresse des Eisenstücks nicht manuell angeben. Ein Stück Eisen in einem anderen Subnetz? Dann haben Sie ein Problem.
  • Entwickler haben auf dem Gerät gepunktet, es ist sinnlos, Fehlerberichte zu senden.

Die zweite Runde fand in noch gar nicht so fernen Zeiten statt und führte mich zum Thema des Artikels – USB/IP-Projekt. Zieht durch Offenheit an, zumal die Jungs aus ReagierenOS Sie haben einen Treiber für Windows signiert, sodass jetzt alles auch auf x64 ohne Krücken wie einen Testmodus funktioniert. Vielen Dank an das ReactOS-Team! Alles klingt schön, versuchen wir es zu fühlen, ist es wirklich so? Leider ist auch das Projekt selbst aufgegeben, und Sie können nicht auf Unterstützung zählen – aber wo unsere nicht verschwunden ist, ist die Quelle da, wir werden es herausfinden!

Teil zwei, Server-Linux

Ein USB/IP-Server, der USB-Geräte über ein Netzwerk teilt, kann nur auf einem Linux-basierten Betriebssystem eingerichtet werden. Nun, Linux ist Linux, also installieren Sie es auf der virtuellen Debian 8-Maschine in der Mindestkonfiguration, Standard-Handbewegung:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

Erledigt. Außerdem schlägt das Internet vor, dass Sie das USBIP-Modul herunterladen müssten, aber – hallo, der erste Rake. Es gibt kein solches Modul. Und das alles, weil sich die meisten Handbücher im Netzwerk auf den älteren Zweig 0.1.x beziehen und in der neuesten Version 0.2.0 die USBIP-Module unterschiedliche Namen haben.

Deshalb:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Nun, fügen wir die folgenden Zeilen zu /etc/modules hinzu, um sie beim Systemstart automatisch zu laden:

usbip-core
usbip-host
vhci-hcd

Starten wir den USBIP-Server:

sudo usbipd -D

Darüber hinaus sagt uns der universelle Verstand, dass usbip Skripte enthält, mit denen wir den Server verwalten können – zeigen, welches Gerät er über das Netzwerk freigeben wird, sehen den Status und so weiter. Hier erwartet uns ein weiteres Gartengerät – diese Skripte im 0.2.x-Zweig wurden wiederum umbenannt. Eine Liste der Befehle erhalten Sie mit

sudo usbip

Nach dem Lesen der Beschreibung der Befehle wird klar, dass usbip zum Teilen des benötigten USB-Geräts dessen Bus-ID wissen möchte. Liebe Zuschauer, Rake Nummer drei ist in der Arena: die Bus-ID, die wir erhalten lsusb (es scheint der offensichtlichste Weg zu sein) - es passt nicht zu ihr! Tatsache ist, dass usbip Hardware wie USB-Hubs ignoriert. Daher verwenden wir den integrierten Befehl:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

Hinweis: Im Folgenden werde ich in den Auflistungen alles am Beispiel meines spezifischen USB-Sticks beschreiben. Ihr Hardwarename und Ihr VID:PID-Paar können und werden unterschiedlich sein. Meines heißt Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Jetzt können wir unser Gerät teilen:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

Prost, Kameraden!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

Drei Hochs, Kameraden! Der Server hat das Stück Eisen über das Netzwerk geteilt und wir können es verbinden! Es bleibt nur noch, den Autostart des USBIP-Daemons zu /etc/rc.local hinzuzufügen

usbipd -D

Teil drei, kundenseitig und verwirrend

Ich habe versucht, das gemeinsam genutzte Gerät über das Netzwerk sofort mit einer Debian-Maschine auf demselben Server zu verbinden, und alles hat einwandfrei funktioniert:

sudo usbip attach --remote=localhost --busid=1-1

Kommen wir zu Windows. In meinem Fall war es Windows Server 2008R2 Standard Edition. In der offiziellen Anleitung werden Sie aufgefordert, zunächst den Treiber zu installieren. Die Vorgehensweise ist in der dem Windows-Client beigefügten Readme-Datei perfekt beschrieben, wir machen alles so, wie es geschrieben steht, alles klappt. Unter XP funktioniert es auch problemlos.

Nachdem wir den Client entpackt haben, versuchen wir unseren Schlüssel zu mounten:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Oh oh. Etwas ist schief gelaufen. Wir nutzen die Fähigkeiten von Google. Es gibt fragmentarische Hinweise darauf, dass etwas mit den Konstanten nicht stimmt; im Serverteil haben die Entwickler die Protokollversion geändert, als sie auf Version 0.2.0 umgestiegen sind, aber sie haben vergessen, dies im Win-Client zu tun. Die vorgeschlagene Lösung besteht darin, die Konstante im Quellcode zu ändern und den Client neu zu erstellen.

Aber ich möchte Visual Studio für dieses Verfahren wirklich nicht herunterladen. Aber ich habe einen guten alten Hiew. Im Quellcode ist die Konstante als Doppelwort deklariert. Suchen wir in der Datei nach 0x00000106 und ersetzen Sie es durch 0x00000111. Denken Sie daran, dass die Bytereihenfolge umgekehrt ist. Das Ergebnis sind zwei Übereinstimmungen, Patch:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Eeeee... ja!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

Damit hätte die Präsentation beendet sein können, aber die Musik lief nicht lange. Nach dem Neustart des Servers habe ich festgestellt, dass das Gerät auf dem Client nicht gemountet ist!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Und alle. Selbst das allwissende Google konnte mir das nicht beantworten. Und gleichzeitig zeigt der Befehl zum Anzeigen der auf dem Server verfügbaren Geräte ganz korrekt - hier ist er, der Schlüssel, Sie können ihn mounten. Ich versuche, unter Linux zu mounten – es funktioniert! Und wenn Sie es jetzt unter Windows versuchen? Oh Scheiße – es funktioniert!

Der letzte Rake: Im Servercode wurde etwas nicht hinzugefügt. Beim Teilen eines Geräts wird die Anzahl der USB-Deskriptoren nicht gelesen. Und wenn das Gerät unter Linux gemountet wird, wird dieses Feld ausgefüllt. Leider kenne ich mich mit der Entwicklung unter Linux auf der Ebene „make && make install“ aus. Daher wird das Problem mit einem ziemlich schmutzigen Hack gelöst – dem Hinzufügen zu /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

Teilfinale

Nach einigem Fummeln klappt es. Das gewünschte Ergebnis wurde erzielt, jetzt kann der Schlüssel auf jedem PC gemountet (und natürlich auch unmountet) werden, auch auf solchen außerhalb des Broadcast-Netzwerksegments. Wenn Sie möchten, können Sie dies mit einem Shell-Skript tun. Das Schöne ist, dass das Vergnügen absolut kostenlos ist.
Ich hoffe, dass meine Erfahrung Habrazhiteli helfen wird, den Rechen zu umgehen, der sich auf meiner Stirn eingeprägt hat. Vielen Dank für Ihre Aufmerksamkeit!

Source: habr.com

Kommentar hinzufügen