Taming USB/IP

Opgaven med at forbinde en USB-enhed til en ekstern pc via et lokalt netværk opstår jævnligt. Under snittet er historikken for mine søgninger i denne retning udstukket, og vejen til en færdig løsning baseret på et open source-projekt USB/IP med en beskrivelse af de forhindringer omhyggeligt sat af forskellige mennesker på denne vej, samt måder at omgå dem på.

Første del, historisk

Hvis maskinen er virtuel - alt dette er nemt. Funktionaliteten af ​​USB-videresendelse fra en vært til en virtuel maskine dukkede op i VMWare 4.1. Men i mit tilfælde skulle sikkerhedsnøglen, der kan genkendes som WIBU-KEY, forbindes på forskellige tidspunkter til forskellige maskiner, og ikke kun virtuelle.
Den første runde af søgning i det fjerne 2009 førte mig til et stykke jern kaldet TrendNet TU2-NU4
Teknikere:

  • nogle gange virker det endda

Ulemper:

  • virker ikke altid. Antag, at Guardant Stealth II-beskyttelsesnøglen ikke starter igennem den, og bander med fejlen "enheden kan ikke startes".
  • Managementsoftware (læs - montering og afmontering af USB-enheder) er patetisk til det yderste. Kommandolinjekontakter, automatisering - nej, har ikke hørt. Alt er kun i hånden. Mareridt.
  • kontrolsoftwaren søger efter selve jernstykket i netværket ved at udsende, så dette virker kun inden for ét broadcast-netværkssegment. Du kan ikke angive jernstykkets IP-adresse i hånden. Et stykke jern i andet undernet? Så har du et problem.
  • udviklere scorede på enheden, er det nytteløst at sende fejlrapporter.

Anden runde skete i tider, der ikke var så fjerne, og førte mig til emnet for artiklen - USB/IP-projekt. Tiltrækker med åbenhed, især da fyrene fra ReactOS de signerede en driver til Windows, så nu fungerer alt selv på x64 uden krykker som en testtilstand. Mange tak til ReactOS-teamet! Alt lyder smukt, lad os prøve at mærke det, er det virkelig sådan? Desværre er selve projektet også opgivet, og du kan ikke regne med støtte - men hvor vores ikke forsvandt, er kilden der, vi finder ud af det!

Del to, server-linux

En USB/IP-server, der deler USB-enheder over et netværk, kan kun konfigureres på et Linux-baseret operativsystem. Nå, Linux er Linux, vi installerer Debian 8 på en virtuel maskine i minimumskonfigurationen, standardhåndbevægelse:

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

Slog sig ned. Yderligere antyder internettet, at du skal downloade usbip-modulet, men - hej, den første rake. Der findes ikke et sådant modul. Og alt sammen fordi de fleste af manualerne på netværket henviser til den ældre gren 0.1.x, og i den seneste 0.2.0 har usbip-modulerne forskellige navne.

Derfor:

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

Nå, lad os tilføje følgende linjer til /etc/modules for at indlæse dem automatisk ved systemstart:

usbip-core
usbip-host
vhci-hcd

Lad os starte usbip-serveren:

sudo usbipd -D

Ydermere fortæller det universelle sind os, at usbip kommer med scripts, der giver os mulighed for at administrere serveren - vise hvilken enhed den vil dele over netværket, se status, og så videre. Her venter endnu et haveværktøj på os - disse scripts i 0.2.x-grenen er igen blevet omdøbt. Du kan få en liste over kommandoer med

sudo usbip

Efter at have læst beskrivelsen af ​​kommandoerne, bliver det klart, at for at dele den nødvendige USB-enhed, vil usbip kende sit bus-id. Kære seere, rake nummer tre er i arenaen: Bus-id'et, der vil give os så udfør lsusb (det virker som den mest oplagte måde) - det passer hende ikke! Faktum er, at usbip ignorerer hardware som USB-hubs. Derfor vil vi bruge den indbyggede kommando:

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

Bemærk: I det følgende vil jeg beskrive alt ved hjælp af eksemplet med min specifikke USB-nøgle. Dit hardwarenavn og VID:PID-par kan og vil afvige. Min hedder Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nu kan vi dele vores enhed:

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

Hurra, kammerater!

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)

Tre skål, kammerater! Serveren delte jernstykket over netværket, og vi kan forbinde det! Det er kun tilbage at tilføje autostart af usbip-dæmonen til /etc/rc.local

usbipd -D

Del tre, klient-side og forvirrende

Jeg prøvede at forbinde den delte enhed over netværket til en Debian-maskine med det samme på den samme server, og alt var forbundet fint:

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

Lad os gå videre til Windows. I mit tilfælde var det Windows Server 2008R2 Standard Edition. Den officielle guide beder dig installere driveren først. Proceduren er perfekt beskrevet i readme, der er knyttet til Windows-klienten, vi gør alt, som det er skrevet, alt fungerer. På XP fungerer det også uden problemer.

Efter udpakning af klienten forsøger vi at montere vores nøgle:

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

Åh åh. Noget gik galt. Vi bruger Googles færdigheder. Der er fragmentariske omtaler om, at der er noget galt med konstanterne; i serverdelen ændrede udviklerne protokolversionen, da de skiftede til version 0.2.0, men de glemte at gøre dette i Win-klienten. Den foreslåede løsning er at ændre konstanten i kildekoden og genopbygge klienten.

Men jeg vil virkelig ikke downloade Visual Studio af hensyn til denne procedure. Men jeg har en god gammel Hiew. I kildekoden er konstanten erklæret som et dobbeltord. Lad os se i filen efter 0x00000106, og erstatte den med 0x00000111. Husk, byte-rækkefølgen er omvendt. Resultatet er to kampe, 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

Dette kunne have afsluttet præsentationen, men musikken spillede ikke længe. Efter genstart af serveren fandt jeg ud af, at enheden på klienten ikke er monteret!

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

Og det er det. Selv alvidende Google kunne ikke besvare dette for mig. Og samtidig viser kommandoen til at vise tilgængelige enheder på serveren helt korrekt - her er den, nøglen, du kan montere den. Jeg prøver at montere fra under Linux - det virker! Og hvis nu prøve fra under Windows? Åh shit - det virker!

Den sidste rake: noget er ikke tilføjet i serverkoden. Når en enhed deles, læser den ikke antallet af USB-beskrivelser fra den. Og når du monterer enheden fra under Linux, er dette felt udfyldt. Desværre er jeg bekendt med udvikling under Linux på "make && make install" niveauet. Derfor er problemet løst med et ret beskidt hack - tilføjelse til /etc/rc.local

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

Del finale

Efter lidt pjat virker det. Det ønskede resultat er opnået, nu kan nøglen monteres på en hvilken som helst pc (og afmonteres selvfølgelig også), også dem uden for broadcast-netværkssegmentet. Hvis du vil, kan du gøre det ved hjælp af et shell-script. Hvad er rart - fornøjelsen er helt gratis.
Jeg håber, at min erfaring vil hjælpe habrazhiteli med at komme uden om den rive, der har præget min pande. Tak for din opmærksomhed!

Kilde: www.habr.com

Tilføj en kommentar