Îmblanzirea USB/IP

Sarcina de a conecta un dispozitiv USB la un computer la distanță printr-o rețea locală apare în mod regulat. Sub tăietură, este stabilit istoricul căutărilor mele în această direcție și calea către o soluție gata făcută bazată pe un proiect open-source USB/IP cu o descriere a obstacolelor puse cu grijă de diverși oameni pe această cale, precum și modalități de a le ocoli.

Prima parte, istorică

Dacă mașina este virtuală - toate acestea sunt ușor. Funcționalitatea redirecționării USB de la o gazdă la o mașină virtuală a apărut în VMWare 4.1. Dar în cazul meu, cheia de securitate, recunoscută ca WIBU-KEY, trebuia conectată în momente diferite la diferite mașini, și nu doar la cele virtuale.
Prima rundă de căutare din îndepărtatul 2009 m-a condus la o bucată de fier numită TrendNet TU2-NU4
Pro-uri:

  • uneori chiar funcționează

Contra:

  • nu funcționează întotdeauna. Să presupunem că cheia de protecție Guardant Stealth II nu pornește prin ea, jurând cu eroarea „dispozitivul nu poate fi pornit”.
  • Software-ul de management (citește - montarea și demontarea dispozitivelor USB) este patetic până la extrem. Comutatoare de linie de comandă, automatizare - nu, nu am auzit. Totul este doar manual. Coșmar.
  • software-ul de control caută piesa de fier în sine în rețea prin difuzare, astfel încât aceasta funcționează doar într-un segment de rețea de difuzare. Nu puteți specifica manual adresa IP a piesei de fier. O bucată de fier în altă subrețea? Atunci ai o problemă.
  • dezvoltatorii au marcat pe dispozitiv, este inutil să trimiteți rapoarte de eroare.

A doua rundă a avut loc în vremuri nu atât de îndepărtate și m-a condus la subiectul articolului - Proiect USB/IP. Atrage cu deschidere, mai ales că băieții din ReactOS au semnat un driver pentru Windows, așa că acum totul funcționează chiar și pe x64 fără cârje ca un mod de testare. Pentru care multe mulțumiri echipei ReactOS! Totul sună frumos, să încercăm să simțim, chiar așa este? Din păcate, proiectul în sine este, de asemenea, abandonat și nu poți conta pe sprijin - dar acolo unde al nostru nu a dispărut, sursa este acolo, ne vom da seama!

Partea a doua, server-linux

Un server USB/IP care partajează dispozitive USB într-o rețea poate fi configurat numai pe un sistem de operare Linux. Ei bine, Linux este Linux, așa că instalați pe mașina virtuală Debian 8 în configurația minimă, mișcare standard a mâinii:

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

Stabilit. În plus, internetul sugerează că ar trebui să descărcați modulul usbip, dar - salut, primul rake. Nu există un astfel de modul. Și totul pentru că majoritatea manualelor din rețea se referă la ramura mai veche 0.1.x, iar în ultimul 0.2.0 modulele usbip au denumiri diferite.

Prin urmare:

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

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

usbip-core
usbip-host
vhci-hcd

Să pornim serverul usbip:

sudo usbipd -D

Mai mult, mintea universală ne spune că usbip vine cu scripturi care ne permit să gestionăm serverul - arată ce dispozitiv îl va partaja în rețea, vedem starea și așa mai departe. Aici ne așteaptă un alt instrument de grădină - aceste scripturi din ramura 0.2.x, din nou, au fost redenumite. Puteți obține o listă de comenzi cu

sudo usbip

După ce citiți descrierea comenzilor, devine clar că, pentru a partaja dispozitivul USB necesar, usbip dorește să-și cunoască ID-ul magistralei. Dragi telespectatori, rake-ul numărul trei este în arenă: ID-ul Autobuzului care ne va da lsusb (s-ar părea cel mai evident mod) - nu i se potrivește! Cert este că usbip ignoră hardware-ul precum hub-urile USB. Prin urmare, vom folosi comanda încorporată:

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

Notă: în continuare, în liste, voi descrie totul folosind exemplul cheii mele USB specifice. Numele dumneavoastră hardware și perechea VID:PID pot și vor diferi. 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
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)

Trei urale, tovarăși! Serverul a partajat bucata de fier prin rețea și o putem conecta! Rămâne doar să adăugați pornirea automată a demonului usbip la /etc/rc.local

usbipd -D

Partea a treia, partea clientului și confuză

Am încercat să conectez dispozitivul partajat prin rețea la o mașină Debian imediat pe același server și totul s-a conectat bine:

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

Să trecem la Windows. În cazul meu a fost Windows Server 2008R2 Standard Edition. Ghidul oficial vă solicită să instalați mai întâi driverul. Procedura este descrisă perfect în readme-ul atașat clientului Windows, facem totul așa cum este scris, totul merge bine. Pe XP funcționează și fără probleme.

După despachetarea clientului, încercăm să ne montăm cheia:

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. Ceva n-a mers bine. Folosim abilitățile Google. Există mențiuni fragmentare că ceva nu este în regulă cu constantele; în partea de server, dezvoltatorii au schimbat versiunea protocolului când au trecut la versiunea 0.2.0, dar au uitat să facă acest lucru în clientul Win. Soluția propusă este schimbarea constantei din codul sursă și reconstruirea clientului.

Dar chiar nu vreau să descarc Visual Studio de dragul acestei proceduri. Dar am un Hiew bătrân. În codul sursă, constanta este declarată ca un cuvânt dublu. Să căutăm în fișier 0x00000106, înlocuindu-l cu 0x00000111. Amintiți-vă, ordinea octeților este inversată. Rezultatul sunt două meciuri, patch:

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

Eeeee... da!

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

Acest lucru ar fi putut pune capăt prezentării, dar muzica nu a cântat mult timp. După repornirea serverului, am constatat că dispozitivul de pe client nu este montat!

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

Si asta e. Nici măcar atotștiutorul Google nu mi-a putut răspunde la asta. Și, în același timp, comanda de afișare a dispozitivelor disponibile pe server arată destul de corect - aici este, cheia, o puteți monta. Încerc să montez de sub Linux - funcționează! Și dacă acum încearcă de sub Windows? Oh dracu - funcționează!

Ultimul rake: ceva nu este adăugat în codul serverului. Când partajează un dispozitiv, acesta nu citește numărul de descriptori USB de pe acesta. Și când montați dispozitivul de sub Linux, acest câmp este completat. Din păcate, sunt familiarizat cu dezvoltarea sub Linux la nivelul „make && make install”. Prin urmare, problema este rezolvată cu un hack destul de murdar - adăugând la /etc/rc.local

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

Partea finală

După câteva lăutari, funcționează. Rezultatul dorit a fost obținut, acum cheia poate fi montată pe orice PC (și demontată, desigur, de asemenea), inclusiv cele din afara segmentului rețelei de difuzare. Dacă doriți, o puteți face folosind un script shell. Ce este frumos - plăcerea este absolut gratuită.
Sper că experiența mea îl va ajuta pe habrazhiteli să ocolească grebla care mi s-a imprimat pe frunte. Vă mulțumim pentru atenție!

Sursa: www.habr.com

Adauga un comentariu