How To Set Up A USB-Over-IP Server And Client With OpenSUSE 11.2

Version 1.0
Author: Falko Timme
Follow me on Twitter

This tutorial shows how to set up a USB-over-IP server with OpenSUSE 11.2 as well as a USB-over-IP client (also running OpenSUSE 11.2). The USB/IP Project aims to develop a general USB device sharing system over IP network. To share USB devices between computers with their full functionality, USB/IP encapsulates "USB I/O messages" into TCP/IP payloads and transmits them between computers. USB-over-IP can be useful for virtual machines, for example, that don't have access to the host system's hardware - USB-over-IP allows virtual machines to use remote USB devices.

I do not issue any guarantee that this will work for you!

 

1 Preliminary Note

This tutorial is based on AliRezaTaleghani's tutorial How To Modify Your Gnu/Linux Box To Serve As A USB Over IP Server, but I've adjusted it for OpenSUSE 11.2 (server and client). If you want to use a Windows client, please take a look at AliRezaTaleghani's tutorial - that part is still the same.

In this tutorial I use the server server1.example.com with the IP address 192.168.0.100 and the client client1.example.com with the IP address 192.168.0.101, both running OpenSUSE 11.2. These settings might differ for you, so you have to replace them where appropriate.

 

2 Installing And Using USB/IP On The Server

server1:

We can install usbip as follows:

yast2 -i usbip

usbip expects the file containing the list of known USB devices (usb.ids) in the directory /usr/share/hwdata, but on OpenSUSE 11.2 it's located in /usr/share/usbip/usb.ids - therefore we create a symlink:

mkdir /usr/share/hwdata
ln -sf /usr/share/usbip/usb.ids /usr/share/hwdata/

Afterwards we load the usbip kernel modules:

modprobe usbip
modprobe usbip_common_mod

To check if they really got loaded, run:

lsmod | grep usbip

The output should be similar to this one:

server1:~ # lsmod | grep usbip
usbip                  21540  0
usbip_common_mod       25232  1 usbip
server1:~ #

To make sure that both modules get loaded automatically whenever you boot the system, you can add them to the MODULES_LOADED_ON_BOOT line in /etc/sysconfig/kernel:

vi /etc/sysconfig/kernel
[...]
## Type:                string
## ServiceRestart:      boot.loadmodules
#
# This variable contains the list of modules to be loaded
# once the main filesystem is active
# You will find a few default modules for hardware which
# can not be detected automatically.
#
MODULES_LOADED_ON_BOOT="usbip usbip_common_mod"
[...]

Run

SuSEconfig

afterwards.

Now we can start the usbip daemon:

usbipd -D

server1:~ # usbipd -D
Bind usbip.ko to a usb device to be exportable!
server1:~ #

Now attach a USB device that you want to export to the server - I'm using a SanDisk USB flash drive here.

Execute the command

lsusb 

to find the corresponding Vendor/Device ID which is in the form of:

Bus XXX Device YYY: ID VendorID:DeviceID 

The output on my server is as follows:

server1:~ # lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 058f:6362 Alcor Micro Corp. Hi-Speed 21-in-1 Flash Card Reader/Writer (Internal/External)
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0781:5151 SanDisk Corp. Cruzer Micro Flash Drive
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
server1:~ #

The Vendor/Device ID of my SanDisk USB flash drive is 0781:5151.

Now run

bind_driver --list

The output on my server is as follows:

server1:~ # bind_driver --list
List USB devices
 - busid 1-4 (058f:6362)
         1-4:1.0 -> usb-storage

 - busid 2-5 (0781:5151)
         2-5:1.0 -> usb-storage

server1:~ #

As you see, the Vendor/Device ID of my SanDisk USB flash drive (0781:5151) corresponds to the BUSID 2-5. We need this BUSID to attach the USB device to the server:

bind_driver --usbip 2-5

server1:~ # bind_driver --usbip 2-5
** (process:2952): DEBUG:  2-5:1.0      -> usb-storage
** (process:2952): DEBUG: unbinding interface
** (process:2952): DEBUG: write "add 2-5" to /sys/bus/usb/drivers/usbip/match_busid
** Message: bind 2-5 to usbip, complete!
server1:~ #

That's it, we can now use the SanDisk USB flash drive on a remote usbip client.

BTW, if you run...

netstat -tap

... you should see that the usbip daemon is listening on port 3240 (triomotion) so please make sure that this port isn't blocked by your firewall:

server1:~ # netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:triomotion            *:*                     LISTEN      2948/usbipd
tcp        0      0 *:sunrpc                *:*                     LISTEN      2397/rpcbind
tcp        0      0 *:ssh                   *:*                     LISTEN      2731/sshd
tcp        0      0 localhost:ipp           *:*                     LISTEN      2455/cupsd
tcp        0      0 *:smtp                  *:*                     LISTEN      2843/master
tcp        0      0 192.168.0.15:ssh        192.168.0.1:d2000kernel ESTABLISHED 2905/0
tcp        0      0 *:sunrpc                *:*                     LISTEN      2397/rpcbind
tcp        0      0 *:ssh                   *:*                     LISTEN      2731/sshd
tcp        0      0 localhost:ipp           *:*                     LISTEN      2455/cupsd
tcp        0      0 *:smtp                  *:*                     LISTEN      2843/master
server1:~ #

Share this page:

1 Comment(s)