Vi tæmmer USB/IP.

Der opstår jævnligt behov for at tilslutte USB-enheder til en fjern-PC via et lokalt netværk. Underneden er min historie om mine søgninger i denne retning og vejen til en færdig løsning baseret på et open-source projekt. USB/IP med beskrivelse af de forskellige forhindringer, som jeg omhyggeligt har fået installeret på denne vej, samt måder at omgå dem på.

Del et, historisk

Hvis maskinen er virtuel, er alt dette ikke så svært. USB-gennemstrømning fra vært til virtuel maskine har været tilgængeligt siden VMWare 4.1. Men i mit tilfælde skulle beskyttelsesenheden, der identificeres som WIBU-KEY, tilsluttes til forskellige maskiner på forskellige tidspunkter, og ikke kun virtuelle.
Den første runde af søgningen i det fjerne 2009 førte mig til en enhed kaldet TrendNet TU2-NU4
Fordele:

  • som nogle gange endda fungerer.

Ulemper:

  • Det fungerer dog ikke altid. Lad os sige, at beskyttelsesenheden Guardant Stealth II ikke kan aktiveres gennem den, og klager over fejlen 'enheden kan ikke starte'.
  • Software til kontrol (læs — montering og afmontering af USB-enheder) er ekstremt elendig. Kommandoer i terminalen, automatisering — nej, det har de ikke hørt om. Alt skal gøres manuelt. En katastrofe.
  • Kontrolsoftwaren søger selve enheden i netværket ved broadcast, så det fungerer kun inden for et enkelt broadcast-segment af netværket. Man kan ikke angive IP-adressen manuelt. Er enheden i et andet subnet? Så har du et problem.
  • Udviklerne har opgivet enheden, så bug-reports er spild af tid.

Den anden runde fandt sted i en ikke så fjern fortid og førte mig til emnet for artiklen — USB/IP project. Det tiltrækker med sin åbenhed, især fordi fyrene fra ReactOS har underskrevet deres driver til Windows, så nu fungerer alt endda på x64 uden behov for nogen former for tricks som testmode. For hvad skal teamet ReactOS have stor tak! Alt lyder smukt, lad os prøve at se, om det virkelig er sådan? Desværre er selve projektet også en smule forsinket, og man kan ikke regne med support – men hvor går vores ikke tabt, kildekoden er der, så vi finder ud af det!

Del to, server-linux

USB/IP-serveren, der deler USB-enheder over netværket, kan kun oprettes i Linux-baserede operativsystemer. Nå, hvis det er Linux, så installer vi Debian 8 i minimal konfiguration på en virtuel maskine, standard håndbevægelser:

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

Det er blevet installeret. Internettet fortæller os, at vi skal hente usbip-modulet, men — hej hej, her kommer de første problemer. Der findes ikke et sådant modul. Alt sammen fordi de fleste vejledninger online henviser til en ældre version 0.1.x, mens i den seneste 0.2.0 har usbip-modulerne andre navne.

Derfor:

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

Og så tilføjer vi følgende linjer til /etc/modules, så de automatisk bliver indlæst ved systemstart:

usbip-core
usbip-host
vhci-hcd

Lad os starte usbip-serveren:

sudo usbipd -D

Videre fortæller internettet os, at der følger scripts med usbip, der gør det muligt at styre serveren — vise hvilket enhed den vil dele over netværket, se status osv. Her venter endnu et problem — disse scripts i version 0.2.x er igen blevet omdøbt. Du kan få en liste over kommandoerne med:

sudo usbip

Efter at have læst beskrivelsen af kommandoerne bliver det klart, at for at dele den ønskede USB-enhed, vil usbip gerne vide dens Bus ID. Kære seere, her dukker problem nummer tre op: den Bus ID, som vil blive udgivet til os lsusb (tilsyneladende den mest åbenlyse vej) — den passer ikke! Problemet er, at usbip ignorerer enheder som USB-hubs. Så lad os 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 de følgende lister vil jeg beskrive alt med eksemplet på min specifikke USB-nøgle. Dine enhedsnavne og par VID:PID kan og vil være forskellige. 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 gange hurra, kammerater! Serveren har delt enheden over netværket, og vi kan tilslutte den! Det er kun tilbage at tilføje automatisk opstart af usbip demon i /etc/rc.local

usbipd -D

Del tre, klientdelen, som er forvirrende

Jeg prøvede at forbinde den delte enhed over netværket til en maskine, der kører Debian, straks på den samme server, og alt blev tilsluttet 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 vejledning beder om at installere driveren først. Proceduren er grundigt beskrevet i den medfølgende readme til Windows-klienten, så vi følger bare instruktionerne, og det virker. Det fungerer også uden problemer på XP.

Efter at have udpakket klienten, prøver 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) kan ikke finde enheden

Åh nej. Noget gik galt. Vi bruger vores Google-færdigheder. Der findes fragmenterede henvisninger til, at der er noget galt med konstanterne; i serverdelen ændrede udviklerne versionen af protokollen ved overgangen til version 0.2.0, men glemte at gøre det i klienten til Windows. Den foreslåede løsning er at ændre konstanten i kildekoden og ombygge klienten.

Jeg vil helst ikke downloade Visual Studio for denne proces. Heldigvis har jeg den gamle Hiew. I kildekoden er konstanten erklæret som en dobbelt ord. Lad os kigge i filen 0x00000106, og ændre den til 0x00000111. Vi skal ikke glemme, at byte-ordenen er omvendt. Resultatet er to matches, vi patcher:

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

Yay… ja!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
ny usb-enhed tilsluttet usbvbus port 1

Her kunne man afslutte fortællingen, men musikken spillede ikke længe. Efter at have genstartet serveren opdagede jeg, at enheden ikke kan monteres på klienten!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) kan ikke finde enheden

Og det er det. Selv Google kunne ikke svare på dette. Men kommandoen til at vise tilgængelige enheder på serveren viser helt korrekt — her er nøglen, vi kan montere den. Jeg prøver at montere den fra Linux — det virker! Men hvad med at prøve fra Windows nu? Åh skræk — det fungerer!

Sidste forhindring: der er noget, der mangler i serverkoden. Ved deling af enheden læser den ikke antallet af USB-deskriptorer fra den. Men når enheden monteres fra Linux, udfyldes dette felt. Desværre kender jeg kun til udvikling under Linux på "make && make install" niveau. Så problemet blev løst med en ret klodset løsning — ved at tilføje til /etc/rc.local

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

Afsluttende del

Efter nogle prøvelser virker det nu. Det ønskede er opnået, nu kan nøglen monteres til enhver pc (og demonteres, selvfølgelig), også uden for netværkets broadcast-segment. Hvis man ønsker det, kan dette gøres ved hjælp af et kommandolinjescript. Det, der er glædeligt, er, at det er helt gratis.
Jeg håber, at min erfaring kan hjælpe andre brugere med at undgå de faldgruber, jeg har mødt. Tak for opmærksomheden!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster