Skrotenie USB/IP

Pravidelne vyvstáva úloha pripojiť USB zariadenie k vzdialenému počítaču cez lokálnu sieť. Pod strihom je uvedená história mojich vyhľadávaní týmto smerom a cesta k hotovému riešeniu založenému na open-source projekte USB/IP s popisom prekážok, ktoré na tejto ceste starostlivo nastavili rôzni ľudia, ako aj spôsobov, ako ich obísť.

Prvá časť, historická

Ak je stroj virtuálny - to všetko je jednoduché. Funkcia presmerovania USB z hostiteľa na virtuálny počítač sa objavila vo VMWare 4.1. V mojom prípade však bezpečnostný kľúč, rozpoznateľný ako WIBU-KEY, musel byť pripojený v rôznych časoch k rôznym strojom, a to nielen virtuálnym.
Prvé kolo hľadania v ďalekom roku 2009 ma priviedlo ku kusu železa tzv TrendNet TU2-NU4
Pros:

  • niekedy to dokonca funguje

Nevýhody:

  • nefunguje vždy. Predpokladajme, že ochranný kľúč Guardant Stealth II sa cez neho nespustí a nadáva s chybou „zariadenie sa nedá spustiť“.
  • Softvér na správu (čítanie - pripojenie a odpojenie USB zariadení) je žalostný až do extrému. Prepínače príkazového riadku, automatizácia - nie, nepočuli. Všetko je len od ruky. Nočná mora.
  • riadiaci software si vyhladava kus zeleza v sieti sam vysielanim, takze to funguje len v ramci jedneho segmentu vysielacej siete. Nemôžete zadať IP adresu kusu železa ručne. Kus železa v inej podsieti? Potom máte problém.
  • vývojári na zariadení zabodovali, je zbytočné posielať hlásenia o chybách.

Druhé kolo sa odohralo v časoch nie tak vzdialených a priviedlo ma k téme článku - Projekt USB/IP. Priťahuje otvorenosťou, najmä odkedy chalani z ReactOS podpísali ovládač pre Windows, takže teraz všetko funguje aj na x64 bez akýchkoľvek berlí ako testovací režim. Za čo patrí veľká vďaka tímu ReactOS! Všetko znie krásne, skúsme to precítiť, je to naozaj tak? Bohužiaľ, samotný projekt je tiež opustený a nemôžete počítať s podporou - ale tam, kde nezmizol ten náš, tam je zdroj, prídeme na to!

Druhá časť, server-linux

USB/IP server, ktorý zdieľa USB zariadenia cez sieť, je možné nastaviť iba na operačnom systéme založenom na Linuxe. Nuž, Linux je Linux, takže nainštalujte na virtuálny stroj Debian 8 v minimálnej konfigurácii, štandardný pohyb ruky:

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

Usadený. Internet ďalej naznačuje, že by ste si museli stiahnuť modul usbip, ale - ahoj, prvý rake. Takýto modul neexistuje. A to všetko preto, že väčšina príručiek v sieti odkazuje na staršiu vetvu 0.1.xa v najnovšej verzii 0.2.0 majú moduly usbip iné názvy.

Z tohto dôvodu:

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

Pridajme do /etc/modules nasledujúce riadky, aby sa automaticky načítali pri štarte systému:

usbip-core
usbip-host
vhci-hcd

Spustíme usbip server:

sudo usbipd -D

Ďalej, univerzálna myseľ nám hovorí, že usbip prichádza so skriptami, ktoré nám umožňujú spravovať server - ukazujú, ktoré zariadenie bude zdieľať cez sieť, vidieť stav atď. Tu na nás čaká ďalší záhradný nástroj - tieto skripty vo vetve 0.2.x boli opäť premenované. Môžete získať zoznam príkazov pomocou

sudo usbip

Po prečítaní popisu príkazov je jasné, že na zdieľanie požadovaného USB zariadenia chce usbip poznať jeho Bus ID. Vážení diváci, v aréne je číslo tri: Bus ID, ktoré nám dá lsusb (zdalo by sa to najzrejmejšie) - nehodí sa jej to! Faktom je, že usbip ignoruje hardvér, ako sú rozbočovače USB. Preto použijeme vstavaný príkaz:

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

Poznámka: ďalej v zoznamoch všetko popíšem na príklade môjho konkrétneho USB kľúča. Názov vášho hardvéru a pár VID:PID sa môžu a budú líšiť. Moja sa volá Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Teraz môžeme zdieľať naše zariadenie:

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

Hurá, súdruhovia!

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)

Trikrát na zdravie, súdruhovia! Server zdieľal kus železa cez sieť a môžeme ho pripojiť! Zostáva len pridať automatické spustenie démona usbip do /etc/rc.local

usbipd -D

Tretia časť, na strane klienta a mätúca

Okamžite som sa pokúsil pripojiť zdieľané zariadenie cez sieť k počítaču Debian na rovnakom serveri a všetko sa pripojilo v poriadku:

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

Prejdime k Windowsu. V mojom prípade to bol Windows Server 2008R2 Standard Edition. Oficiálna príručka vás požiada, aby ste najskôr nainštalovali ovládač. Postup je perfektne popísaný v readme priloženom ku klientovi windows, všetko robíme tak, ako je napísané, všetko klape. Na XP to tiež funguje bez problémov.

Po rozbalení klienta sa pokúsime pripojiť náš kľúč:

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. Niečo sa pokazilo. Využívame schopnosti Google. Sú útržkovité zmienky, že niečo nie je v poriadku s konštantami, v serverovej časti vývojári pri prechode na verziu 0.2.0 zmenili verziu protokolu, ale zabudli na to vo Win klientovi. Navrhovaným riešením je zmena konštanty v zdrojovom kóde a prebudovanie klienta.

Ale kvôli tomuto postupu naozaj nechcem sťahovať Visual Studio. Ale mám starého dobrého Hiewa. V zdrojovom kóde je konštanta deklarovaná ako dvojité slovo. Pozrime sa v súbore na 0x00000106 a nahradíme ho 0x00000111. Pamätajte, že poradie bajtov je obrátené. Výsledkom sú dva zápasy, patch:

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

Eeeee... áno!

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

Tým sa mohla prezentácia skončiť, no hudba nehrala dlho. Po reštarte servera som zistil, že zariadenie na klientovi nie je pripojené!

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

A to je všetko. Ani vševedúci Google mi na to nevedel odpovedať. A zároveň príkaz na zobrazenie zariadení dostupných na serveri ukazuje celkom správne - tu je kľúč, môžete ho pripojiť. Snažím sa pripojiť pod Linuxom - funguje to! A ak teraz skús z Windowsu? Sakra - funguje to!

Posledný rake: niečo nie je pridané do kódu servera. Pri zdieľaní zariadenia z neho nenačíta počet USB deskriptorov. A pri montáži zariadenia pod Linuxom je toto pole vyplnené. Bohužiaľ, poznám vývoj pod Linuxom na úrovni „make && make install“. Preto je problém vyriešený dosť špinavým hackom - pridaním do /etc/rc.local

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

Časť záverečná

Po nejakom fičaní to funguje. Požadovaný výsledok bol dosiahnutý, teraz je možné kľúč pripojiť k akémukoľvek PC (a samozrejme aj odpojiť), vrátane tých mimo segmentu vysielacej siete. Ak chcete, môžete to urobiť pomocou skriptu shell. Čo je pekné - potešenie je úplne zadarmo.
Dúfam, že moje skúsenosti pomôžu habrazhiteli obísť hrable, ktoré sa mi odtlačili na čelo. Ďakujem za tvoju pozornosť!

Zdroj: hab.com

Pridať komentár