linux usb usbip tpc ip remoto

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.

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus