Krotíme USB/IP

Pravidelne sa objavuje potreba pripojiť USB zariadenie k vzdialenému PC cez lokálnu sieť. Pod týmto popisom je uvedený príbeh mojich hľadania v tejto oblasti a cesta k hotovému riešeniu na báze open-source projektu. USB/IP s opisom rôznych prekážok, ktoré si počas tejto cesty umne nainštalovali iní ľudia, ako aj spôsobov ich obchádzania.

Prvá časť, historická

Ak je stroj virtuálny, nie je to zložité. Funkcionalita prenosu USB z hostiteľa do virtuálky sa objavila už vo VMWare 4.1. Ale v mojom prípade bolo potrebné pripojiť ochranný kľúč, ktorý sa identifikoval ako WIBU-KEY, k rôznym strojom, a to nielen virtuálnym.
Prvý zákrut hľadania v dávnom roku 2009 ma priviedol k zariadeniu nazvanému TrendNet TU2-NU4
Výhody:

  • niekedy dokonca funguje

Nevýhody:

  • nefunguje to vždy. Predpokladajme, že ochranný kľúč Guardant Stealth II sa cezňu nespustí, oznamujúc chybu „zariadenie sa nedá spustiť“.
  • Softvér na správu (čítaj – montovanie a demontovanie USB zariadení) je nemohúci do krajnosti. Príkazy z príkazového riadku, automatizácia – nie, o tom nepočuli. Všetko len rukami. Nočná mora.
  • správny softvér vyhľadáva samotné zariadenie v sieti prostredníctvom broadcastu, takže to funguje len v rámci jedného broadcastového segmentu siete. Ručne zadať IP adresu zariadenia nie je možné. Zariadenie v inej podsieti? Potom máte problém.
  • vývojári na zariadenie zanevreli, posielať bug reporty je zbytočné.

Druhý zákrut sa udial v už nie tak vzdialenej dobe a priviedol ma k téme článku – USB/IP project. Priťahuje otvorenosťou, tým viac, že chlapci z ReactOS im podpísali ovládač pre Windows, takže teraz dokonca na x64 všetko funguje bez akýchkoľvek obmedzení, ako je testovací režim. Za čo tímu ReactOS veľké ďakujem! Znie to všetko pekne, skúsime zistiť, či je to naozaj tak? Bohužiaľ, samotný projekt bol tiež trochu zanedbaný, a na podporu sa nedá spoľahnúť – ale kde nie je naša, zdrojový kód je, nejako s tým naložíme!

Druhá časť, serverovo-linuxová

Server USB/IP, ktorý zdieľa USB zariadenia po sieti, môže byť spustený len na Linux-based OS. No čo už, Linux tak Linux, inštalujeme na virtuálku Debian 8 s minimálnou konfiguráciou, štandardný postup:

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

Nainstalovali sme. Internet nás nabáda, aby sme načítali modul usbip, ale — zdravíme, prvé prekážky. Taký modul neexistuje. A to všetko preto, že väčšina návodov na internete sa vzťahuje na staršiu vetvu 0.1.x, zatiaľ čo v najnovšej 0.2.0 majú moduly usbip iné názvy.

Preto:

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

A pridáme do /etc/modules tieto riadky, aby sa automaticky načítavali pri štarte systému:

usbip-core
usbip-host
vhci-hcd

Spustíme server usbip:

sudo usbipd -D

Ďalej nám globálna inteligencia naznačuje, že spolu s usbip prichádzajú skripty, ktoré nám umožňujú spravovať server — zobraziť, ktoré zariadenie bude zdieľané v sieti, skontrolovať stav a tak ďalej. Tu nás čaká ďalší problém — tieto skripty v vetve 0.2.x sú opäť premenované. Zoznam príkazov môžeme získať pomocou

sudo usbip

Po prečítaní popisu príkazov je jasné, že na to, aby sme zdieľali požadované USB zariadenie, usbip potrebuje vedieť jeho Bus ID. Vážené publikum, na scéne je tretia prekážka: ten Bus ID, ktorý nám poskytne lsusb (zdalo by sa, najlogickejšia cesta) — nie je vhodný! Je to preto, že hardvér ako USB huby usbip ignoruje. Takže využijeme zabudovaný príkaz:

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

Poznámka: tu a ďalej v zoznamoch budem všetko popisovať na príklade môjho konkrétneho USB kľúča. Názvy vašich zariadení 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á, druhovia!

user@usb-server:~$ sudo usbip list -r localhost
Exportovateľné USB zariadenia
======================
 - 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 hurá, druhovia! Server zdieľal zariadenie v sieti a môžeme ho pripojiť! Zostáva len dopísať automatické spúšťanie démona usbip do /etc/rc.local

usbipd -D

Časť tretia, klientská a zložitá

Pripojiť zdieľané zariadenie cez sieť k stroju s Debianom som skúsil okamžite na tom istom serveri a všetko sa pekne pripojilo:

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

Prechádzame k Windows. V mojom prípade to bol Windows Server 2008R2 Standard Edition. Oficiálny návod najprv požaduje nainštalovanie ovládača. Postup je krásne popísaný v priloženom readme k windows-klientovi, robíme všetko tak, ako je napísané, všetko funguje. Na XP to tiež funguje bez akýchkoľvek problémov.

Rozbalili sme klienta, skúšame 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

Oj-oj. Niečo sa pokazilo. Používame zručnosť Googlu. Objavujú sa útržkovité zmienky, že niečo nie je v poriadku s konštantami, na serverovej strane vývojári pri prechode na verziu 0.2.0 zmenili verziu protokolu, ale na kliente pod Win na to zabudli. Navrhované riešenie — zmeňte konštantu v zdrojovom kóde a prekompilujte klienta.

Lenže sa mi veľmi nechce sťahovať Visual Studio kvôli tomuto postupu. Zato mám starého dobrého Hiew. V zdrojovom kóde je konštanta vyhlásená ako dvojité slovo. Hľadáme v súbore 0x00000106, nahrádzame 0x00000111. Nezabúdame, poradie bajtov je obrátené. Výsledok — dve zhody, patchujeme:

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

Aaaa… áno!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
nové usb zariadenie pripojené k usbvbus portu 1

Na tomto by sme mohli ukončiť rozprávanie, ale hudba hrala krátko. Po reštarte servera som zistil, že zariadenie na kliente sa nepripája!

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

A koniec. Na toto mi nevedel odpovedať ani všetevládny Google. A pritom príkaz na zobrazenie dostupných zariadení na serveri celkom správne ukazuje — tu je, kľúč, môžete ho pripojiť. Skúšam to pripojiť z Linuxu — funguje! A čo ak to teraz vyskúšame z Windows? O hrôza — funguje to!

Posledné črepiny: niečo tam v kóde servera nie je dopísané. Pri zdieľaní zariadenia nečíta počet USB popisovačov. A pri pripojení zariadenia z Linuxu sa toto pole vyplní. Bohužiaľ, s vývojom pod Linuxom som oboznámený len na úrovni 'make && make install'. Preto bola 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

Záverečná časť

Po niekoľkých peripetiách to funguje. Očakávané je dosiahnuté, teraz je možné pripojiť kľúč k akémukoľvek PC (a samozrejme ho aj odpojiť), vrátane - mimo broadcast segmentu siete. Ak chcete, môžete to urobiť pomocou skriptu príkazového riadku. Čo je príjemné - pôžitok je úplne zadarmo.
Dúfam, že moje skúsenosti pomôžu čitateľom Habra vyhnúť sa týmto prekážkam, ktoré sa odtlačili na mojom čele. Ďakujem za pozornosť!

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster