USB remoto via TCP/IP
Oggi mi son trovato a dover utilizzare con il mio computer un dispositivo USB attaccato ad un altro pc nella rete. In realtà la situazione è un po' più complessa, ma non posso scegliere nei dettagli per via del segreto industriale, visto che il problema è legato ad un progetto attuale nella ditta in cui lavoro. Il comune mortale avrebbe una soluzione veloce: staccare il dispositivo dal computer A e attaccarlo al computer B.
In breve, la situazione è questa:
- Device collegato via USB a computer A.
- Computer B collegato a computer A via rete locale.
- Computer B necessita di utilizzare Device
- A e B hanno sistema operativo Gentoo Linux
Soluzione: usbip
C'è questo progetto, chiamato usbip, che da qualche tempo è addirittura entrato nel kernel ufficiale di Linux, anche se ancora nella sezione Staging Drivers.
È un sistema che permette di utilizzare dispositivi USB remoti come se fossero collegati al computer locale. È composto da una serie di moduli per il kernel e da un programma userspace che si interfaccia con il kernel per esportare/importare i dispositivi nella rete.
Essendo il modulo ancora sperimentale, non si trova abilitato nel kernel, nemmeno nelle distribuzioni come Ubuntu dove di solito è tutto abilitato. Quindi dovrebbe essere necessario ricompilare il kernel per abilitarlo. Ma io sono un Gentoo user e questo non mi spaventa.
Installazione
Questa procedura deve essere fatta sia nel computer A (server) che nel computer B (client).
cd /usr/src/linux
make menuconfig
Abilitare i moduli:
Device drivers --->
[*] Staging drivers --->
<M> USB/IP support
<M> VHCI hcd
<M> Host driver
Compilare ed installare i moduli:
make all
make modules_install
Installare usbip
(cambia il comando se usi un'altra distribuzione)
emerge net-misc/usbip
Server
Avviare il server usbipd
come demone
usbipd -D
Con lsusb
controllare il bus id del dispositivo da condividere
lsusb
Bus 005 Device 007: ID 046d:c517 Logitech, Inc. LX710 Cordless Desktop Laser
Bus 006 Device 003: ID 046d:c31c Logitech, Inc. Keyboard K120 for Business
Per esempio voglio condividere la tastiera: il busid è 6.
Guardiamo quali dispositivi si possono condividere:
usbip list -l
Local USB devices
=================
- busid 5-1 (046d:c517)
5-1:1.0 -> usbhid
5-1:1.1 -> usbhid
- busid 6-1 (046d:c31c)
6-1:1.0 -> usbhid
6-1:1.1 -> usbhid
Condividiamo il dispositivo:
usbip bind -b 6-1
Client
Nel computer B, cioè il client, intanto possiamo vedere quali dispositivi si possono collegare dal computer A, dove l'indirizzo ip del computer A è per esempio 10.0.1.15
.
usbip list -r 10.0.1.15
Exportable USB devices
======================
- 10.0.1.15
6-1: Logitech, Inc. : Keyboard K120 for Business (046d:c31c)
: /sys/devices/pci0000:00/0000:00:1d.2/usb6/6-1
: (Defined at Interface level) (00/00/00)
: 0 - Human Interface Device / Boot Interface Subclass / Keyboard (03/01/01)
: 1 - Human Interface Device / No Subclass / None (03/00/00)
Bella! Possiamo collegarci al dispositivo!
usbip attach -h 10.0.1.15 -b 6-1
Ora, se nel client lanciamo lsusb
, noteremo un nuovo dispositivo usb!
Bus 011 Device 007: ID 046d:c31c Logitech, Inc. Keyboard K120 for Business
Per staccarlo:
usbip detach -p 0
Premendo i pulsanti della tastiera collegata al computer A, immettiamo del testo nel computer B. L'ho provato anche con webcam e altri dispositivi USB. L'importante è che la rete sia abbastanza veloce per supportare la banda che il dispositivo necessita.