Taming USB/IP

U compitu di cunnette un dispositivu USB à un PC remotu via una reta lucale sorge regularmente. Sottu u tagliu, a storia di e mo ricerche in questa direzzione hè stabilita, è a strada per una suluzione pronta basatu annantu à un prughjettu open-source USB/IP cù una discrizzione di l'ostaculi accuratamente stabiliti da diverse persone nantu à sta strada, è ancu modi per aggiralli.

Prima parte, storica

Se a macchina hè virtuale - tuttu questu hè faciule. A funziunalità di l'invio USB da un host à una macchina virtuale apparsu in VMWare 4.1. Ma in u mo casu, a chjave di sicurità, ricunnoscevule cum'è WIBU-KEY, avia da esse cunnessu à parechji tempi à diverse macchine, è micca solu virtuale.
A prima volta di ricerca in u distanti 2009 m'hà purtatu à un pezzu di ferru chjamatu TrendNet TU2-NU4
Pros:

  • qualchì volta funziona ancu

Cons:

  • ùn travaglia micca sempre. Supponi chì a chjave di prutezzione Guardant Stealth II ùn principia micca per ellu, ghjurà cù l'errore "u dispusitivu ùn pò micca esse cuminciatu".
  • U software di gestione (leghje - muntazione è smontaggio di i dispositi USB) hè pateticu à l'estremu. Switch line di cumanda, automatizazione - no, ùn anu micca intesu. Tuttu hè solu a manu. Nightmare.
  • u software di cuntrollu cerca di u pezzu di ferru stessu in a rete trasmettendu, cusì solu funziona in un segmentu di rete di trasmissione. Ùn pudete micca specificà l'indirizzu IP di u pezzu di ferru cù a manu. Un pezzu di ferru in altre subnet ? Allora avete un prublema.
  • i sviluppatori anu puntuatu nantu à u dispusitivu, hè inutile di mandà rapporti di bug.

A seconda volta hè accadutu in tempi micca cusì distanti, è m'hà purtatu à u tema di l'articulu - Prughjettu USB / IP. Attrae cù apertura, soprattuttu da chì i ragazzi da ReactOS anu firmatu un driver per Windows, cusì avà tuttu funziona ancu in x64 senza crutches cum'è un modu di prova. Per quale ringraziu assai à a squadra ReactOS! Tuttu sona bellu, pruvemu à sente, hè veramente cusì ? Sfurtunatamente, u prugettu stessu hè ancu abbandunatu, è ùn pudete micca cuntà u sustegnu - ma induve u nostru ùn hè micca sparitu, a fonte hè quì, avemu da capisce!

A seconda parte, server-linux

Un servitore USB / IP chì sparte i dispositi USB nantu à una reta pò esse stallatu solu in un OS basatu in Linux. Ebbè, Linux hè Linux, cusì installate nantu à a macchina virtuale Debian 8 in a cunfigurazione minima, u muvimentu standard di a manu:

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

Settled. In più, Internet suggerisce chì avete bisognu di scaricà u modulu usbip, ma - ciao, u primu rake. Ùn ci hè micca un tali modulu. È tuttu perchè a maiò parte di i manuali nantu à a reta riferenu à u ramu più vechju 0.1.x, è in l'ultime 0.2.0 i moduli usbip anu nomi diffirenti.

Dunque:

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

Ebbè, aghjustemu e seguenti linee à /etc/modules per caricalli automaticamente à l'iniziu di u sistema:

usbip-core
usbip-host
vhci-hcd

Cuminciamu u servitore usbip:

sudo usbipd -D

In più, a mente universale ci dice chì usbip vene cun scripts chì ci permettenu di gestisce u servitore - mostra quale dispusitivu sparterà nantu à a reta, vede u statutu, è cusì. Quì ci aspetta un altru strumentu di giardinu - sti scripts in u ramu 0.2.x, di novu, sò stati rinominati. Pudete ottene una lista di cumandamenti cù

sudo usbip

Dopu avè lettu a descrizzione di i cumandamenti, diventa chjaru chì per sparte u dispositivu USB necessariu, usbip vole sapè u so ID Bus. Cari telespettatori, u rake numeru trè hè in l'arena: u Bus ID chì ci darà lsusb (parerebbe u modu più ovvi) - ùn li cunvene micca! U fattu hè chì usbip ignora hardware cum'è hub USB. Dunque, useremu u cumandamentu integratu:

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

Nota: da quì in seguitu in i listi descriveraghju tuttu cù l'esempiu di a mo chjave USB specifica. U vostru nome di hardware è a coppia VID: PID pò è differiscerà. U mio hè chjamatu Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Avà pudemu sparte u nostru dispositivu:

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

Hurrah, camaradi !

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)

Trè saluti, camaradi ! U servitore sparte u pezzu di ferru nantu à a reta, è pudemu cunnette! Resta solu per aghjunghje l'autostart di u daemon usbip à /etc/rc.local

usbipd -D

Parte terza, cliente-side è cunfusa

Aghju pruvatu à cunnette u dispositivu spartutu nantu à a reta à una macchina Debian immediatamente nantu à u stessu servitore, è tuttu hè cunnessu bè:

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

Passemu à Windows. In u mo casu era Windows Server 2008R2 Standard Edition. A guida ufficiale vi dumanda di installà u driver prima. A prucedura hè perfettamenti descritta in u readme attaccatu à u cliente Windows, facemu tuttu ciò chì hè scrittu, tuttu funziona. In XP funziona ancu senza prublemi.

Dopu avè sbulicatu u cliente, pruvemu di muntà a nostra chjave:

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. Qualcosa hè andatu male. Utilizemu l'abilità di Google. Ci sò citazioni frammentarii chì qualcosa hè sbagliatu cù e custanti; in a parte di u servitore, i sviluppatori anu cambiatu a versione di protokollu quandu anu cambiatu à a versione 0.2.0, ma si sò scurdate di fà questu in u cliente Win. A suluzione pruposta hè di cambià a constante in u codice fonte è ricustruisce u cliente.

Ma veramente ùn vogliu micca scaricà Visual Studio per u scopu di sta prucedura. Ma aghju un bonu vechju Hiew. In u codice fonte, a constante hè dichjarata cum'è una doppia parolla. Fighjemu in u schedariu per 0x00000106, rimpiazzà cù 0x00000111. Ricurdativi, l'ordine di byte hè invertitu. U risultatu hè dui partiti, patch:

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

Eeeee... si !

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

Questu puderia avè finitu a presentazione, ma a musica ùn hà micca ghjucatu per longu. Dopu avè riavviatu u servitore, aghju trovu chì u dispusitivu nantu à u cliente ùn hè micca muntatu!

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

È questu hè. Ancu Google chì sapiente ùn pudia micca risponde à questu per mè. È à u listessu tempu, u cumandamentu per vede i dispositi dispunibuli nantu à u servitore mostra abbastanza currettamente - quì hè, a chjave, pudete muntà. Pruvu di muntà da sottu Linux - funziona! E s'è avà pruvate da sottu Windows? Oh merda - funziona!

L'ultimu rake: qualcosa ùn hè micca aghjuntu in u codice di u servitore. Quandu sparte un dispositivu, ùn leghje micca u numeru di descriptori USB da ellu. È quandu si monte u dispusitivu da sottu Linux, stu campu hè pienu. Sfurtunatamente, sò familiarizatu cù u sviluppu sottu Linux à u nivellu "make && make install". Dunque, u prublema hè risolta cù un pirate piuttostu bruttu - aghjunghjendu à /etc/rc.local

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

Parte finale

Dopu qualchì fiddle, funziona. U risultatu desideratu hè statu ottenutu, avà a chjave pò esse muntata à qualsiasi PC (è unmounted, sicuru, ancu), cumpresi quelli fora di u segmentu di a reta di broadcast. Se vulete, pudete fà cù un script shell. Ciò chì hè bellu - u piacè hè assolutamente liberu.
Spergu chì a mo spirienza aiutarà à habrazhiteli per attruvà u rake chì hà impressu nantu à a mo frunti. Grazie per a vostra attenzione!

Source: www.habr.com

Add a comment