USB/IP temmen

De taak om een ​​USB-apparaat via een lokaal netwerk op een pc op afstand aan te sluiten, komt regelmatig voor. Onder de snede wordt de geschiedenis van mijn zoektochten in deze richting uiteengezet en het pad naar een kant-en-klare oplossing op basis van een open-sourceproject USB/IP met een beschrijving van de obstakels die zorgvuldig door verschillende mensen op dit pad zijn geplaatst, evenals manieren om ze te omzeilen.

Deel één, historisch

Als de machine virtueel is, is dit allemaal eenvoudig. De functionaliteit van USB-forwarding van een host naar een virtuele machine verscheen in VMWare 4.1. Maar in mijn geval moest de beveiligingssleutel, herkenbaar als WIBU-KEY, op verschillende tijdstippen verbonden zijn met verschillende machines, en niet alleen virtuele.
De eerste zoektocht in het verre 2009 leidde me naar een stuk ijzer genaamd TrendNet TU2-NU4
Voors:

  • soms lukt het zelfs

Tegens:

  • werkt niet altijd. Stel dat de Guardant Stealth II-beveiligingssleutel er niet doorheen start, zwerend met de fout "apparaat kan niet worden gestart".
  • Beheersoftware (lezen - USB-apparaten koppelen en ontkoppelen) is extreem zielig. Commandoregelschakelaars, automatisering - nee, nog niet gehoord. Alles is gewoon met de hand. Nachtmerrie.
  • de besturingssoftware zoekt het stuk ijzer zelf in het netwerk door uitzending, dit werkt dus alleen binnen één uitzendnetwerksegment. U kunt het IP-adres van het stuk ijzer niet met de hand opgeven. Een stuk ijzer in een ander subnet? Dan heb je een probleem.
  • ontwikkelaars scoorden op het apparaat, het heeft geen zin om bugrapporten te verzenden.

De tweede ronde vond plaats in tijden die niet zo ver weg waren, en leidde me naar het onderwerp van het artikel: USB/IP-project. Trekt aan met openheid, vooral omdat de jongens van ReactOS ze tekenden een driver voor Windows, dus nu werkt alles zelfs op x64 zonder krukken zoals een testmodus. Waarvoor veel dank aan het ReactOS-team! Alles klinkt mooi, laten we proberen het te voelen, is het echt zo? Helaas is het project zelf ook verlaten en kun je niet rekenen op steun - maar waar het onze niet is verdwenen, is de bron daar, we komen er wel uit!

Deel twee, server-linux

Een USB/IP-server die USB-apparaten via een netwerk deelt, kan alleen worden ingesteld op een op Linux gebaseerd besturingssysteem. Nou, Linux is Linux, dus installeer op de Debian 8 virtuele machine in de minimale configuratie, standaard handbeweging:

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

Vereffend. Verder suggereert internet dat je de usbip-module moet downloaden, maar - hallo, de eerste hark. Zo'n module is er niet. En dat allemaal omdat de meeste handleidingen op het netwerk verwijzen naar de oudere tak 0.1.x, en in de laatste 0.2.0 hebben de usbip-modules verschillende namen.

daarom:

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

Laten we de volgende regels toevoegen aan /etc/modules om ze automatisch te laden bij het opstarten van het systeem:

usbip-core
usbip-host
vhci-hcd

Laten we de usbip-server starten:

sudo usbipd -D

Verder vertelt de universele geest ons dat usbip wordt geleverd met scripts waarmee we de server kunnen beheren - laten zien welk apparaat het via het netwerk zal delen, de status bekijken, enzovoort. Hier wacht ons nog een tuingereedschap - deze scripts in de 0.2.x-tak hebben opnieuw een nieuwe naam gekregen. U kunt een lijst met opdrachten krijgen met

sudo usbip

Na het lezen van de beschrijving van de commando's, wordt het duidelijk dat usbip zijn bus-ID wil weten om het vereiste USB-apparaat te delen. Beste kijkers, rake nummer drie is in de arena: de Bus ID die ons gaat geven lsusb (het lijkt de meest voor de hand liggende manier) - het past niet bij haar! Feit is dat usbip hardware zoals USB-hubs negeert. Daarom zullen we de ingebouwde opdracht gebruiken:

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

Opmerking: hierna in de lijsten zal ik alles beschrijven aan de hand van het voorbeeld van mijn specifieke USB-stick. Uw hardwarenaam en VID:PID-paar kunnen en zullen verschillen. De mijne heet Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nu kunnen we ons apparaat delen:

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

Hoera, 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)

Drie hoeraatjes, kameraden! De server heeft het stuk ijzer gedeeld via het netwerk en we kunnen het verbinden! Het blijft alleen om de autostart van de usbip-daemon toe te voegen aan /etc/rc.local

usbipd -D

Deel drie, client-side en verwarrend

Ik heb geprobeerd het gedeelde apparaat via het netwerk direct met een Debian-machine op dezelfde server te verbinden, en alles was goed aangesloten:

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

Laten we verder gaan met Windows. In mijn geval was het Windows Server 2008R2 Standard Edition. De officiële gids vraagt ​​je om eerst de driver te installeren. De procedure is perfect beschreven in het leesmij-bestand dat bij de Windows-client is gevoegd, we doen alles zoals het is geschreven, alles komt goed. Op XP werkt het ook probleemloos.

Nadat we de client hebben uitgepakt, proberen we onze sleutel te koppelen:

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. Er is iets fout gegaan. We gebruiken de vaardigheid van Google. Er zijn fragmentarische vermeldingen dat er iets mis is met de constanten; in het servergedeelte hebben de ontwikkelaars de protocolversie gewijzigd bij het overschakelen naar versie 0.2.0, maar ze zijn vergeten dit te doen in de Win-client. De voorgestelde oplossing is om de constante in de broncode te wijzigen en de client opnieuw op te bouwen.

Maar ik wil Visual Studio echt niet downloaden omwille van deze procedure. Maar ik heb een goede oude Hiew. In de broncode wordt de constante gedeclareerd als een dubbel woord. Laten we in het bestand kijken naar 0x00000106 en het vervangen door 0x00000111. Vergeet niet dat de bytevolgorde omgekeerd is. Het resultaat is twee wedstrijden, 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

Dit had de presentatie kunnen beëindigen, maar de muziek speelde niet lang. Nadat ik de server opnieuw had opgestart, ontdekte ik dat het apparaat op de client niet is aangekoppeld!

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

En dat is het. Zelfs alwetend Google kon dit niet voor mij beantwoorden. En tegelijkertijd wordt de opdracht om apparaten weer te geven die op de server beschikbaar zijn, vrij correct weergegeven - hier is het, de sleutel, je kunt hem koppelen. Ik probeer te mounten onder Linux - het werkt! En als je het nu onder Windows probeert? Oh shit - het werkt!

De laatste rake: er is iets niet toegevoegd in de servercode. Bij het delen van een apparaat leest het niet het aantal USB-descriptors ervan. En bij het mounten van het apparaat onder Linux wordt dit veld ingevuld. Helaas ben ik bekend met ontwikkeling onder Linux op het niveau "make && make install". Daarom is het probleem opgelost met een nogal vuile hack - toevoegen aan /etc/rc.local

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

Deel finale

Na wat gepuzzel werkt het. Het gewenste resultaat is bereikt, nu kan de sleutel op elke pc worden aangekoppeld (en natuurlijk ook weer ontkoppeld), ook die buiten het omroepnetwerksegment. Als je wilt, kun je dit doen met behulp van een shellscript. Wat leuk is - het plezier is helemaal gratis.
Ik hoop dat mijn ervaring Habrazhiteli zal helpen om de hark te omzeilen die op mijn voorhoofd is gedrukt. Bedankt voor uw aandacht!

Bron: www.habr.com

Voeg een reactie