Domare USB/IP

Si presenta regolarmente il compito di collegare un dispositivo USB a un PC remoto tramite una rete locale. Sotto il taglio è esposta la storia delle mie ricerche in questa direzione e il percorso verso una soluzione già pronta basata su un progetto open source USB/IP con una descrizione degli ostacoli accuratamente posti da varie persone su questo percorso, nonché dei modi per aggirarli.

Prima parte, storico

Se la macchina è virtuale, tutto questo è facile. La funzionalità di inoltro USB da un host a una macchina virtuale è apparsa in VMWare 4.1. Ma nel mio caso la chiave di sicurezza, riconoscibile come WIBU-KEY, doveva essere collegata in momenti diversi a macchine diverse, e non solo virtuali.
Il primo giro di ricerca nel lontano 2009 mi ha portato a un pezzo di ferro chiamato TrendNet TU2-NU4
pro:

  • a volte funziona anche

contro:

  • non sempre funziona. Supponiamo che la chiave di protezione Guardant Stealth II non si avvii attraverso di essa, imprecando con l'errore "il dispositivo non può essere avviato".
  • Il software di gestione (lettura - montaggio e smontaggio di dispositivi USB) è patetico all'estremo. Interruttori della riga di comando, automazione: no, non ho sentito. Tutto è solo a mano. Incubo.
  • il software di controllo cerca il pezzo di ferro stesso nella rete trasmettendo, quindi funziona solo all'interno di un segmento di rete di trasmissione. Non è possibile specificare manualmente l'indirizzo IP del pezzo di ferro. Un pezzo di ferro in un'altra sottorete? Allora hai un problema.
  • gli sviluppatori hanno segnato sul dispositivo, è inutile inviare segnalazioni di bug.

Il secondo round è avvenuto in tempi non così lontani e mi ha portato all'argomento dell'articolo: Progetto USB/IP. Attrae con apertura, soprattutto perché i ragazzi di ReactOS hanno firmato un driver per Windows, quindi ora tutto funziona anche su x64 senza stampelle come una modalità test. Per cui molte grazie al team di ReactOS! Tutto sembra bello, proviamo a sentirlo, è davvero così? Sfortunatamente, anche il progetto stesso è abbandonato e non puoi contare sul supporto, ma dove il nostro non è scomparso, la fonte è lì, lo scopriremo!

Seconda parte, server-linux

Un server USB/IP che condivide dispositivi USB su una rete può essere configurato solo su un sistema operativo basato su Linux. Bene, Linux è Linux, quindi installa sulla macchina virtuale Debian 8 nella configurazione minima, movimento della mano standard:

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

Sistemato. Inoltre, Internet suggerisce che dovresti scaricare il modulo usbip, ma - ciao, il primo rastrello. Non esiste tale modulo. E tutto perché la maggior parte dei manuali sulla rete fa riferimento al vecchio ramo 0.1.xe nell'ultimo 0.2.0 i moduli usbip hanno nomi diversi.

Pertanto:

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

Bene, aggiungiamo le seguenti righe a /etc/modules per caricarle automaticamente all'avvio del sistema:

usbip-core
usbip-host
vhci-hcd

Avviamo il server usbip:

sudo usbipd -D

Inoltre, la mente universale ci dice che usbip viene fornito con script che ci consentono di gestire il server: mostrare quale dispositivo condividerà sulla rete, vedere lo stato e così via. Qui ci aspetta un altro strumento da giardino: questi script nel ramo 0.2.x, ancora una volta, sono stati rinominati. Puoi ottenere un elenco di comandi con

sudo usbip

Dopo aver letto la descrizione dei comandi, diventa chiaro che per condividere il dispositivo USB richiesto, usbip vuole conoscere il suo Bus ID. Cari telespettatori, il rake numero tre è nell'arena: il Bus ID che ci darà lsusb (sembrerebbe il modo più ovvio) - non le si addice! Il fatto è che usbip ignora l'hardware come gli hub USB. Pertanto, useremo il comando integrato:

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

Nota: di seguito negli elenchi descriverò il tutto utilizzando l'esempio della mia specifica chiavetta USB. Il nome dell'hardware e la coppia VID:PID possono e differiranno. Il mio 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: complete

Saluti, compagni!

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)

Tre evviva, compagni! Il server ha condiviso il pezzo di ferro sulla rete e possiamo collegarlo! Resta solo da aggiungere l'avvio automatico del demone usbip a /etc/rc.local

usbipd -D

Parte terza, lato client e confusa

Ho provato a connettere subito il dispositivo condiviso in rete a una macchina Debian sullo stesso server e tutto è andato bene:

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

Passiamo a Windows. Nel mio caso era Windows Server 2008R2 Standard Edition. La guida ufficiale ti chiede di installare prima il driver. La procedura è perfettamente descritta nel readme allegato al client windows, facciamo tutto come è scritto, tutto funziona. Su XP funziona anche senza problemi.

Dopo aver decompresso il client, 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 device

Oh, oh. Qualcosa è andato storto. Usiamo la competenza di Google. Ci sono menzioni frammentarie che qualcosa non va nelle costanti, nella parte server, gli sviluppatori hanno cambiato la versione del protocollo quando sono passati alla versione 0.2.0, ma si sono dimenticati di farlo nel client Win. La soluzione proposta è cambiare la costante nel codice sorgente e ricostruire il client.

Ma davvero non voglio scaricare Visual Studio per il bene di questa procedura. Ma ho un buon vecchio Hiew. Nel codice sorgente, la costante è dichiarata come parola doppia. Cerchiamo nel file 0x00000106, sostituendolo con 0x00000111. Ricorda, l'ordine dei byte è invertito. Il risultato sono due partite, 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

Questo avrebbe potuto porre fine alla presentazione, ma la musica non è durata a lungo. Dopo aver riavviato il server, ho scoperto che il dispositivo sul client non è montato!

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

E questo è tutto. Anche Google onnisciente non ha potuto rispondere per me. E allo stesso tempo, il comando per visualizzare i dispositivi disponibili sul server mostra abbastanza correttamente: eccola, la chiave, puoi montarla. Provo a montare da sotto Linux - funziona! E se ora provi da sotto Windows? Oh merda - funziona!

L'ultimo rastrello: qualcosa non viene aggiunto nel codice del server. Quando si condivide un dispositivo, non legge il numero di descrittori USB da esso. E quando si monta il dispositivo da Linux, questo campo è pieno. Sfortunatamente, ho familiarità con lo sviluppo sotto Linux al livello "make && make install". Pertanto, il problema viene risolto con un hack piuttosto sporco: l'aggiunta a /etc/rc.local

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

Parte finale

Dopo qualche manipolazione, funziona. Il risultato sperato è stato ottenuto, ora la chiave può essere montata su qualsiasi PC (e ovviamente anche smontata), compresi quelli al di fuori del segmento di rete broadcast. Se vuoi, puoi farlo usando uno script di shell. Ciò che è bello: il piacere è assolutamente gratuito.
Spero che la mia esperienza aiuti gli habrazhiteli ad aggirare il rastrello che mi è rimasto impresso sulla fronte. Grazie per l'attenzione!

Fonte: habr.com

Aggiungi un commento