Está en: » Artículos »

usbip – Comparte tus dispositivos usb en red

usbip – Comparte tus dispositivos usb en red

usbrj45

usbip es un proyecto bastante interesante. Nos permite compartir cualquier dispositivo usb conectado en un equipo para que lo pueda gestionar otro. Puede ser bastante útil para compartir cierto hardware con máquinas virtuales.

Su instalación y configuración en openSuse viene a ser bastante sencilla:


El servidor

Instalación:

zypper install usbip

El software usbip lee la lista de dispositivos conocidos en la ruta /usr/share/hwdata pero en realidad está /usr/share/usbip/ así que con hacer un enlace a dicho archivo bastaría

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

Cargamos los módulos necesarios en el kernel:

modprobe usbip
modprobe usbip_common_mod

Podemos verificar si todo está correcto:

lsmod | grep usbip

Nos saldría algo como:

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

Para hacer automática la carga del módulo al iniciar el sistema podemos añadirlo a la línea MODULES_LOADED_ON_BOOT=»usbip usbip_common_mod» del archivo /etc/sysconfig/kernel

Si hemos añadido la «auto-carga» de dicho módulo, es recomendable ejecutar un:

SuSEconfig

Para iniciar el demonio de usbip, ejecutaremos:

usbipd -D

Nos reportará algo así:

Bind usbip.ko to a usb device to be exportable!

A partir de este momento, ya tenemos el demonio funcionando para compartir el dispositivo.
Sólo nos queda indicarle el dispositivo que deseamos compartir. Para saber el dispositivo a compartir, podemos usar lsusb:

server:~ # lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 05ac:9130 Apple, Inc.
Bus 001 Device 004: ID 058f:6362 Alcor Micro Corp. Hi-Speed 21-in-1 Flash Card Reader/Writer (Internal/External)
Bus 001 Device 005: ID 05e3:0718 Genesys Logic, Inc.
Bus 001 Device 006: ID 05ac:9222 Apple, Inc.
Bus 001 Device 007: ID 04d9:0499 Holtek Semiconductor, Inc.
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 046d:08f0 Logitech, Inc. QuickCam Messenger
server:~ #

En principio, compartiré un disco duro usb (05e3:0718 Genesys Logic, Inc.) y la webcam logitech (046d:08f0 Logitech, Inc. QuickCam Messenger).
Con el comando bind_driver –list, listaremos los dispositivos que se permiten compartir:

server:~ # bind_driver --list
List USB devices
 - busid 1-2 (05ac:9130)
         1-2:1.0 -> hub

 - busid 1-3 (058f:6362)
         1-3:1.0 -> usb-storage

 - busid 1-5 (05e3:0718)
         1-5:1.0 -> usb-storage

 - busid 2-1 (046d:08f0)
         2-1:1.0 -> STV06xx
         2-1:1.1 -> snd-usb-audio
         2-1:1.2 -> snd-usb-audio

 - busid 1-2.2 (05ac:9222)
         1-2.2:1.0 -> usbhid

 - busid 1-2.3 (04d9:0499)
         1-2.3:1.0 -> usbhid

server:~ #

Para enlazar dichos dispositivos:

bind_driver --usbip 1-5
bind_driver --usbip 2-1

De momento, si tenemos el cortafuegos funcionando, recomiendo detenerlo para comprobar su funcionamiento y después configurarlo para permitir acceso al puerto 3240 en TCP:

netstat -putan | grep usbipd

El cliente

Instalación:

zypper install usbip

Volvemos a enlazar bien el archivo usb.ids en la ruta correcta:

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

Cargamos los módulos necesarios:

modprobe vhci-hcd

Comprobando…

client:~ # lsmod | grep vhci_hcd
vhci_hcd               26576  0
usbip_common_mod       25232  1 vhci_hcd
client:~ #

Para establecerlo como auto-inicio editaremos el archivo /etc/sysconfig/kernel y actualizar MODULES_LOADED_ON_BOOT=»vhci-hcd»

Si hemos establecido el auto-inicio

SuSEconfig

Ahora listamos los dispositivos compartidos del equipo servidor:

client:~ #usbip -l 192.168.10.5
- 192.168.10.5
     1-5: Genesys Logic, Inc. : unknown product (05e3:0718)
        : /sys/devices/pci0000:00/0000:00:02.1/usb1/1-5
        : (Defined at Interface level) (00/00/00)
        :  0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50)

     2-1: Logitech, Inc. : QuickCam Messenger (046d:08f0)
        : /sys/devices/pci0000:00/0000:00:02.0/usb2/2-1
        : Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
        :  0 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
        :  1 - Audio / Control Device / unknown protocol (01/01/00)
        :  2 - Audio / Streaming / unknown protocol (01/02/00)

client:~ #

Lógicamente, sustituiremos con la ip del equipo servidor.

Para conectar los dispositivos:

client:~ #usbip -a 192.168.10.5 1-5
8 ports available

port 0 attached
client:~ # usbip -a 192.168.10.5 2-1
8 ports available

port 1 attached
linux-gqss:~ #

Comprobamos…

linux-gqss:~ # lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
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
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 004: ID 05e3:0718 Genesys Logic, Inc.
Bus 005 Device 005: ID 046d:08f0 Logitech, Inc. QuickCam Messenger
linux-gqss:~ #

Pruebas y conclusiones

Las pruebas, sinceramente, son bastante escasas. Tras intentar varias veces la configuración de la webcam, no pude hacerla funcionar correctamente. Sólo se mostraba una imagen verde (aunque puede ser debido a los problemas que tengo en el equipo cliente con el driver nvidia).

Sobre el disco duro usb, en una hora aproximada de pruebas, funcionó perfectamente.
Calculé la transferencia media y resultó en 7.143 Mb/s. No es mala transferencia para unas tarjetas de red a 100 Mbits, pero he de decir que las pruebas de transferencia por nfs superan el rendimiento (alrededor de 9.5 Mb/s de media).

El proyecto usbip, ha liberado una etapa bastante temprana del cliente para windows, por lo levanté una máquina virtual y me puse a «trastear». A pesar de listar los dispositivos, reiteró varios errores al hacer la conexión.

Fuentes:
http://www.howtoforge.com/how-to-set-up-a-usb-over-ip-server-and-client-with-opensuse-11.2

Comentarios

  1. Diego dice:

    Hola.
    Esto me parece re interesante, sobre todo para el caso de terminales tontas.
    Si uno conecta un pendrive en una terminal tonta seria bastante al pedo y hay que conectar todas en el host.

    Tu blog es muy muy interesante, siempre saliendo con cosas utiles.
    Me gustaría pedirte si es posible que investigues el tema de compartir maquinas virtuales facilmente en opensuse con virtualbox.

    Pienso en hacer un servidor de archivos en una red windows y usar un servidor virtualbox para hostear las maquinas virtuales y conectarme remotamente con el cliente. Pero hay cosas que no he encontrado como si dichas maquinas virtuales deben estar corriendo permanentemente o solamente cuando se lo solicita.

    Saludos
    Diego

  2. Gracias por los halagos…

    Realmente, no termino de comprender qué es lo que deseas:

    Me indicas que investigue el compartir máquinas virtuales fácilmente.
    Sinceramente, no termino de comprenderlo. Si te refieres a compartir el sistema de ficheros, te bastaría con una sóla máquina. Si es a compartir entre ellas, pues piensa en cada máquina virtual como una máquina física. Si te refieres a utilizarlas para conectar desde terminales tontos y mostrar un escritorio, bastaría con una sola máquina (o varias según necesidades) con LTSP o FreeNX por ejemplo.

    Para el servidor de archivos, tienes samba, con un manejo facilísimo gracias a YaST.

    Y respecto a si las máquinas levantan cuando se lo solicita, debes pensar en ellas como si fuesen máquinas fijas. Osease, si hay que acceder a esa máquina, debe estar encendida lógicamente.
    Otro punto sería que necesites un cluster para algún motivo. Sí que hay proyectos muy interesantes para estos casos de forma que a más demanda necesite, más máquinas levanta.

    Saludos

  3. Diego dice:

    Hola.

    Gracias por tu respuesta.

    A lo que me refiero es que algunas empresas proveen de softwares importantes para los negocios para plataformas windows.
    Las cuales se ven infectadas por virus y se descomponen frecuentemente por sus operadores ingenuos.
    Lo que quiero es que dichas computadoras sigan teniendo windows, pero estos programas importantes estén aislados en una maquina virtual alojada en otro servidor, de forma que, si la susodicha computadora de negocio se tiene que dar de baja, entonces cualquier otra computadora con VirtualBox instalado pueda acceder a dichos programas nuevamente.

    Sobre lo de cargar ondemand. Tu respuesta me aclaró el asunto.
    Pero esperaba que conocieras alguna posibilidad de enviar a pausar y reanudar, forzar reinicio o apagado y esas cosas desde el Virtual Box cliente.
    Asi como compartir directorios desde el Vbox cliente al Vbox servidor.
    Pero en principio cualquier solución que aisle estos programas de un windows continuamente expuesto me sirve.

    Saludos.
    Diego

  4. Diego dice:

    Por cierto.
    En OpenSUSE no he podido configurar correctamente samba para comparticion de tipo «share». Ya que la que usa es de tipo «user» y estoy completamente obligado a poner nombre de usuario y contraseña para cosas que quiero hacer publicas en la red. Y que ademas nuevamente la mayoria de los operadores no necesiten memorizar pasos adicionales.

    Mi configuracion normal en modo «share» es de dos directorios. Uno «data» de acceso de solo lectura publico, y uno «data-w» con permisos de escritura con contraseña.
    La interfaz de OpenSuse no me ha permitido configurar samba de esa forma pero no he probado la 11.2

    Saludos

  5. Creo que sí, que sería interesante tener una máquina exclusiva para cada operador que comentas.

    No he usado virtualbox, ya que hace bastante tiempo (cuando dicho proyecto estaba en pañales) usaba vmware server y posteriormente pasé a xen y por último openVz/KVM.

    Haciéndo una búsqueda rápida, he encontrado:
    http://sliceoflinux.com/2009/12/17/manejo-de-maquinas-virtuales-en-virtualbox-desde-la-consola/
    http://www.improvisa.com/index.php?name=News&file=article&sid=376
    Básicamente con las opciones que se indican, podrías hacer una «mini-aplicación» web (por ejemplo) de forma que los operadores (o quien deba utilizarlo) puedan suspender, apagar, reiniciar o reinstalar la máquina.

    Y la verdad es que no uso mucho yast para configurar servicios. Desde hace unos años empecé a percibir la facilidad y rapidez de la consola frente a un software gráfico para dichos menesteres.

    Yo suelo utilizar el método «user» pero añadiendo algunas directivas para los casos concretos.
    Por ejemplo, para la carpeta pública, bastaría con permitir anónimos (guest ok = yes) y para la privada, los permitiría también y añadiría un forzado a no lectura (read only = no) y un forzado para el mismo usuario y grupo (force user = usuario ; force group = users ; guest account = usuario)

Deje su comentario

Previsualización de comentario
  1. Anónimo dice:





Pings para esta entrada