Îmblânzirea USB/IP

Regulamentează apariția unei sarcini de conectare a unui dispozitiv USB la un PC la distanță prin rețeaua locală. Sub cortină se află povestea căutărilor mele în această direcție și drumul către o soluție gata bazată pe un proiect open-source USB/IP cu descrierea obstacolelor întâmpinate de diverse persoane pe acest parcurs, precum și a modalităților de a le o ocoli.

Partea întâi, istorică

Dacă mașina este virtuală — toate acestea nu sunt greu de realizat. Funcționalitatea de redirecționare USB de la gazdă la virtualizare a apărut încă din VMWare 4.1. Dar în cazul meu, cheia de protecție, identificată ca WIBU-KEY, trebuia conectată în momente diferite la mașini diferite, nu doar virtuale.
Prima rundă de căutare din 2009 m-a condus către un dispozitiv numit TrendNet TU2-NU4
Pro:

  • câteodată funcționează

Dezavantaje:

  • nu funcționează întotdeauna. De exemplu, cheia de protecție Guardant Stealth II nu pornește prin intermediul său, dând eroarea „dispozitivul nu poate fi pornit”.
  • Software-ul pentru gestionare (citit — montarea și demontarea dispozitivelor USB) este extrem de slab. Comenzile din linia de comandă, automatizarea — nu, nu au auzit de așa ceva. Totul se face manual. Un coșmar.
  • Software-ul de gestionare caută dispozitivul prin rețea prin broadcast, deci funcționează doar în cadrul aceluiași segment de broadcast al rețelei. Nu poți specifica manual adresa IP a dispozitivului. Dispozitivul este într-o altă subrețea? Atunci ai o problemă.
  • Dezvoltatorii au ignorat dispozitivul, trimiterea rapoartelor de erori este inutilă.

A doua rundă a avut loc în vremuri nu atât de îndepărtate și m-a condus la tema articolului — proiectul USB/IP. Atrage prin deschiderea sa, mai ales că băieții de la ReactOS au semnat un driver pentru Windows, așa că acum chiar și pe x64 totul funcționează fără diverse soluții temporare, cum ar fi modul de testare. Pentru asta, echipei ReactOS un mare mulțumesc! Totul sună frumos, să încercăm să vedem dacă este adevărat? Din păcate, proiectul în sine a fost și el lăsat de izbeliște, iar pe suport nu putem conta — dar unde nu ne-a făcut rău, sursa există, ne vom descurca!

Partea a doua, server și linuxy

Serverul USB/IP, care împarte dispozitivele USB prin rețea, poate fi ridicat doar în sistemele de operare bazate pe Linux. Ei bine, Linux să fie, instalăm pe o virtuală Debian 8 în configurație minimă, mișcare standard manuală:

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

S-a instalat. Apoi, internetul ne sugerează că ar trebui să încărcăm modulul usbip, dar — bun venit, prima problemă. Nu există un astfel de modul. Totul provine din faptul că majoritatea ghidurilor de pe internet se referă la o ramură mai veche 0.1.x, iar în ultima 0.2.0 modulele usbip au alte denumiri.

Prin urmare:

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

Și să adăugăm în /etc/modules următoarele linii pentru a le încărca automat la pornirea sistemului:

usbip-core
usbip-host
vhci-hcd

Să pornim serverul usbip:

sudo usbipd -D

Apoi, inteligența globală ne sugerează că împreună cu usbip vin scripturi care ne permit să gestionăm serverul — să arătăm ce dispozitiv va partaja prin rețea, să verificăm starea și așa mai departe. Aici ne așteaptă încă un instrument — aceste scripturi în ramura 0.2.x, din nou, au fost redenumite. Puteți obține lista de comenzi folosind:

sudo usbip

Citind descrierea comenzilor, devine clar că pentru a partaja dispozitivul USB dorit, usbip vrea să știe ID-ul său de bus. Stimați spectatori, în arenă apare problema numărul trei: acel ID de bus pe care îl va oferi lsusb (părea să fie cea mai evidentă cale) — nu este potrivit! Problema este că dispozitivele precum hub-uri USB sunt ignorate de usbip. Așadar, să folosim comanda încorporată:

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

Notă: aici și în continuare în listări, voi descrie totul folosind exemplul specific al cheii mele USB. Denumirea dispozitivului dvs. și perechea VID:PID pot și vor fi diferite. Al meu se numește Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Acum putem partaja dispozitivul nostru:

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

Ura, tovarăși!

user@usb-server:~$ sudo usbip list -r localhost
Dispozitive USB exportabile
=========================
 - 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
           : Clasă specifică furnizorului / subclasă necunoscută / protocol necunoscut (ff/00/ff)

Ura de trei ori, tovarăși! Serverul a partajat dispozitivul prin rețea, iar noi ne putem conecta la el! Rămâne doar să adăugăm pornirea automată a demonului usbip în /etc/rc.local

usbipd -D

Partea a treia, partea clientului și complicată

Am încercat să conectez dispozitivul partajat prin rețea la un sistem Debian imediat pe acel server, și totul s-a conectat perfect:

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

Trecem la Windows. În cazul meu, a fost Windows Server 2008R2 Standard Edition. Documentația oficială cere mai întâi instalarea driverului. Procedura este descrisă foarte bine în readme-ul atașat clientului Windows, facem totul așa cum este scris și funcționează. Pe XP funcționează de asemenea fără dificultăți.

După ce am dezarhivat clientul, încercăm să montăm cheia noastră:

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) nu poate găsi dispozitivul

Oh-oh. Ceva nu a mers bine. Folosim abilitățile Google. Există mențiuni fragmentate că ceva nu este în regulă cu constantele, în partea server, dezvoltatorii au schimbat versiunea protocolului la versiunea 0.2.0, dar în clientul pentru Win au uitat să facă acest lucru. Soluția propusă este să schimbați constanta în sursă și să recompilați clientul.

Totuși, nu-mi doresc deloc să descarc Visual Studio pentru această procedură. Dar am bunul și vechiul Hiew. În sursă, constanta este declarată ca un cuvânt dublu. Vom căuta în fișier 0х00000106, înlocuind cu 0х00000111. Să nu uităm, ordinea byte-ilor este inversă. Rezultatul — două potriviri, patch-uim:

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

Și… da!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
un nou dispozitiv USB atașat la portul usbvbus 1

Aici aș fi putut încheia expunerea, dar muzica nu a durat mult. După ce am repornit serverul, am descoperit că dispozitivul nu se montează pe client!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) nu poate găsi dispozitivul

Și asta e tot. La aceasta nu a putut răspunde nici chiar toată cunoscătoarea Google. Între timp, comanda de a afișa dispozitivele disponibile pe serverul este destul de corectă — iată-l, cheia, puteți să o montați. Încerc să o montez din Linux — funcționează! Și dacă încerc acum din Windows? Oh groază — funcționează!

Ultimele obstacole: ceva nu a fost completat în codul serverului. Când partajăm dispozitivul, el nu citește numărul descriptori USB. Iar când montăm dispozitivul din Linux, acest câmp este completat. Din păcate, sunt familiarizat cu dezvoltarea sub Linux la nivelul de „make && make install”. Așadar, problema a fost rezolvată printr-un hack destul de murdar — adăugând în /etc/rc.local

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

Partea finală

După unele peripeții, funcționează. Ceea ce mi-am dorit a fost obținut, acum cheia poate fi montată pe orice PC (și demontată, bineînțeles), inclusiv în afara segmentului de difuzare al rețelei. Dacă doriți, această operațiune poate fi realizată cu ajutorul unui script de linie de comandă. Ce este plăcut este că este complet gratuit.
Sper că experiența mea va ajuta utilizatorii de pe Habr să evite acele capcane care m-au marcat. Vă mulțumesc pentru atenție!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster