Spesso si presenta la necessità di collegare un dispositivo USB a un PC remoto attraverso una rete locale. Nel paragrafo successivo troverai la storia della mia ricerca in questo ambito e il percorso verso una soluzione pronta basata su un progetto open-source. con la descrizione degli ostacoli sorgenti, installati con cura da diverse persone lungo il percorso, e delle modalità per superarli.
Prima parte, storica
Se la macchina è virtuale, tutto ciò non è complicato. La funzionalità di passaggio USB dall'host alla macchina virtuale è apparsa già in VMWare 4.1. Tuttavia, nel mio caso, la chiave di protezione riconosciuta come WIBU-KEY doveva essere collegata a macchine diverse nel corso del tempo, e non solo virtuali.
Il primo giro di ricerca, avvenuto nel lontano 2009, mi ha portato a un dispositivo chiamato
Pro:
- a volte funziona anche
Contro:
- ma non sempre. Ad esempio, la chiave di protezione Guardant Stealth II non si avvia tramite di essa, dando errore "il dispositivo non può essere avviato".
- Il software di gestione (leggi - montaggio e smontaggio dei dispositivi USB) è estremamente scarno. Le chiavi da riga di comando, l'automazione - no, non ne abbiamo sentito parlare. Tutto deve essere fatto a mano. Un incubo.
- Il software di gestione cerca il dispositivo di rete tramite broadcast, quindi funziona solo all'interno di un singolo segmento broadcast della rete. Non è possibile specificare l'indirizzo IP del dispositivo manualmente. Il dispositivo è in un'altra sottorete? Allora hai un problema.
- Gli sviluppatori hanno trascurato il dispositivo, inviare report di bug è inutile.
Il secondo giro è avvenuto in tempi non così remoti e mi ha portato al tema dell'articolo - . Attrae per la sua apertura, specialmente perché i ragazzi di hanno fornito un driver per Windows, quindi ora tutto funziona anche su x64 senza alcun 'workaround' come la modalità di test. A cui la squadra di ReactOS va un enorme grazie! Sembra promettente, vediamo se funziona davvero? Sfortunatamente, anche il progetto stesso è stato un po' trascurato e non ci si può aspettare supporto - ma dove non si trova la nostra possibilità, ci sono sorgenti, ce la faremo!
Seconda parte, server e Linux
Un server USB/IP, che condivide i dispositivi USB sulla rete, può essere attivato solo in un sistema operativo basato su Linux. Bene, se è Linux, installiamo Debian 8 su una macchina virtuale con configurazione minima, il consueto procedimento manuale:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbipCi siamo sistemati. In seguito, internet suggerisce di caricare il modulo usbip, ma — salve, i primi ostacoli. Non esiste tale modulo. E tutto ciò è dovuto al fatto che la maggior parte delle guide online si riferisce a una versione più vecchia 0.1.x, mentre nell'ultima 0.2.0 i moduli usbip hanno altri nomi.
Quindi:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbipAggiungiamo nel /etc/modules queste righe, per caricarli automaticamente all'avvio del sistema:
usbip-core
usbip-host
vhci-hcdAvviamo il server usbip:
sudo usbipd -DIn seguito, la saggezza collettiva ci dice che insieme a usbip vengono forniti degli script che ci consentono di gestire il server — per mostrare quale dispositivo condividerà in rete, controllare lo stato, e così via. Qui ci aspetta un altro strumento — questi script nella versione 0.2.x, di nuovo, sono stati rinominati. Possiamo ottenere l'elenco dei comandi usando
sudo usbipDopo aver letto la descrizione dei comandi, diventa chiaro che, per condividere il dispositivo USB richiesto, usbip vuole conoscere il suo Bus ID. Gentili spettatori, sul campo arriva il terzo ostacolo: quel Bus ID che ci fornirà lsusb (apparentemente il percorso più ovvio) — non va bene! Il fatto è che hardware come gli hub USB vengono ignorati da usbip. Quindi useremo il comando integrato:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)Nota: qui e nei prossimi elenchi descriverò tutto utilizzando come esempio la mia chiave USB specifica. Il tuo hardware e la coppia VID:PID possono differire. La mia si chiama Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Ora possiamo condividere il nostro dispositivo:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: completeEvviva, compagni!
user@usb-server:~$ sudo usbip list -r localhost
Dispositivi USB esportabili
========================
- 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
: Classe Specifica del Fornitore / sottoclasse sconosciuta / protocollo sconosciuto (ff/00/ff)Tre volte evviva, compagni! Il server ha condiviso l'hardware in rete, e possiamo connetterlo! Restano solo da aggiungere l'avvio automatico del demone usbip in /etc/rc.local
usbipd -DParte terza, client e confusa
Ho provato a collegare il dispositivo condiviso in rete a una macchina con Debian subito sullo stesso server, e tutto si è collegato perfettamente:
sudo usbip attach --remote=localhost --busid=1-1Passiamo a Windows. Nel mio caso era Windows Server 2008R2 Standard Edition. Il manuale ufficiale richiede innanzitutto di installare il driver. La procedura è ben descritta nel readme fornito con il client Windows, seguiamo tutto come scritto e funziona. Anche su XP funziona senza alcuna difficoltà.
Decomprimi il client e proviamo a montare la nostra chiave:
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 deviceOh-oh. Qualcosa è andato storto. Utilizziamo le capacità di Google. Ci sono menzioni sporadiche che qualcosa non va con le costanti, nella parte server gli sviluppatori hanno cambiato la versione del protocollo passando alla versione 0.2.0, mentre nel client per Win se ne sono dimenticati. La soluzione proposta è di cambiare la costante nel codice sorgente e ricompilare il client.
Solo che non voglio davvero scaricare Visual Studio per questa procedura. Ma ho il buon vecchio Hiew. Nel codice sorgente la costante è dichiarata come doppio parola. Cerchiamo nel file 0x00000106, sostituendo con 0x00000111. Non dimentichiamo, l'ordine dei byte è inverso. Risultato: due corrispondenze, patchiamo:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11Eee… sì!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1A questo punto si potrebbe concludere il resoconto, ma la musica non è durata a lungo. Riavviando il server, ho scoperto che il dispositivo sul client non si monta!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find deviceE tutto. Neanche Google, onnisciente, ha potuto rispondere a questo. Tuttavia, il comando per visualizzare i dispositivi disponibili sul server mostra correttamente — eccolo, la chiave, puoi montarlo. Provo a montarlo da Linux — funziona! E se proviamo ora da Windows? Oh orrore — funziona!
Ultima difficoltà: qualcosa nel codice del server non è completato. Durante la condivisione del dispositivo, non legge il numero di descriptor USB. Ma quando si monta il dispositivo da Linux, questo campo viene riempito. Sfortunatamente, conosco lo sviluppo su Linux a livello di "make && make install". Quindi ho risolto il problema con un hack piuttosto sporco — aggiungendo in /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00Parte finale
Dopo alcune peripezie, funziona. L'obiettivo è stato raggiunto, ora la chiave può essere montata su qualsiasi PC (e smontata, ovviamente, anche), incluso al di fuori del segmento di rete broadcast. Se lo si desidera, è possibile farlo tramite uno script della shell. È piacevole sapere che il servizio è completamente gratuito.
Spero che la mia esperienza possa aiutare i membri di Habr a evitare le trappole che ho incontrato. Grazie per l'attenzione!
Fonte: habr.com
