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.

Published by and tagged ip, remoto, tpc, usb and usbip using 535 words.

comments powered by Disqus