USBIP: Compartiendo dispositivos USB en nuestra red

Estos últimos días he estado pensando en como podría actualizar el firmware de mi RFXCOM, que tengo instalado junto al control de riego, en remoto desde casa. De esta forma no tendría que ir con el portátil, con Windows, con la herramienta para Windows, desconectar el dispositivo de la Orange Pi Zero, conectarlo al portátil, actualizarlo, y volvérselo a poner a la Orange Pi Zero. Es un jaleo hacerlo así, y yo quiero actualizarlo en remoto, desde casa, y cuando me venga bien… 🙂

Existe un proyecto, que hace tiempo se incluyó dentro del kernel de Linux, llamado USBIP. Esta compuesto por tres partes:

  • Los módulos del kernel. Hay tres módulo del kernel que tenemos que cargar para hacer uso de USBIP, que nos permiten desasociar el dispositivo de la máquina que lo tenga, y ponerlo a disposición de quien lo quiera usar en la red.
  • El demonio usbipd. Es el programa que escucha las peticiones a través de la red y las encamina al módulo del kernel correspondiente para ser atendidas.
  • La utilidad usbip. Es la herramienta encargada de administrar los dispositivos compartidos, conectarlos, listarlos, desconectarlos…

 

Instalación

Los primero que me llama la atención de este sistema es que los módulos del kernel y su software de gestión están dentro del código fuente del kernel. Ni os molestéis en descargar paquetes del sistema con apt-get install usbip, sencillamente no funciona. Lo mejor es bajarse el código fuente de la versión del kernel que queramos (la que tengamos instalada), compilar e instalar el código que viene con él. El software que suelen traer los paquetes del sistema suele estar desactualizado y da bastantes problemas.

Para comprobar si tenéis los módulos disponibles en vuestro sistema podéis hacer lo siguiente:

Primero averiguáis la versión del kernel que está en uso, en mi caso, 4.10.3-sun8i, y vais a la ruta concreta donde deberían estar los tres módulos de USBIP. En caso de que los tengáis, hay que cargarlos manualmente (por defecto no se suelen cargar automáticamente, aunque podéis hacerlo añadiéndolos en la lista de /etc/modules):

Ya tenemos nuestro servidor listo, con los módulos cargados. En el cliente haremos exactamente lo mismo. En mis caso, en el portátil, también tengo cargados los tres módulos.

De una cosa que me he dado cuenta trasteando con USBIP es que la versión de las utilidades usbipd y usbip es importante que no difieran demasiado ya que puede que haya incompatibilidades y no conecte el cliente con el servidor. Al final he usado el mismo software en los dos: la versión que viene con el código fuente del kernel del servidor. Vamos a ver de donde la sacamos, y como se compila e instala.

Como había comentado el código fuente del kernel incluye estas utilidades, pero hay que compilarlas. El código está en ./tools/usb/usbip en la raíz de donde tengáis el código del kernel. Para compilarlo ejecutamos estos comandos:

Solo nos queda actualizar la base de datos de dispositivos USB del sistema y ponerla a disposición de USBIP:

Si en vuestro sistema ya existe /usr/share/hwdata/usb.ids (como es el caso de mi portátil (titanio)), podéis omitir este último paso. En la Orange Pi Zero (jsensor) no existía.

Una vez hemos hecho esto en el servidor y en el cliente, ya lo tendremos todo instalado. Es posible que al ejecutar el ./configure os falte alguna herramienta o librería, como me pasó a mi en el servidor (jsensor) que necesité instalar libtool y libudev-dev. Se instalan sin mayor problema y se continua.

 

Compartiendo dispositivos

Ahora es cuando viene la parte importante de USBIP. El proceso es el siguiente: primero cargamos el demonio usbipd tanto en cliente como en el servidor, luego en el servidor listamos los dispositivos disponibles, compartimos el que queramos, finalmente en el cliente listamos los dispositivos que nos comparte el servidor y lo conectamos. Vamos a ello.

En el servidor (jsensor):

Es importante la notación que usa usbip para hacer referencia a los dispositivos: el busid, 4-1, por eso saco la lista primero, para obtener el busid, y luego hacer el bind del dispositivo correcto. Otro punto a tener muy en cuenta es que en cuanto le pasamos el dispositivo a usbip (hacemos el bind), dejará de estar disponible para su uso normal en el sistema, lo podéis comprobar en la salida del comando dmesg:

 

En el cliente:

De forma similar al servidor, podemos comprobar en la salida del comando dmesg, como nos ha conectado correctamente el dispositivo de nuestro servidor jsensor, en el portátil titanio como si realmente lo hubiéramos conectado físicamente al portátil:

A partir de este momento ya podemos usar el dispositivo como si lo tuviéramos en local, en mi caso, queria actualizar el firmware del RFXCOM, por tanto abro mi maquina virtual con Windows XP, donde tengo las utilidades para hacerlo, y le conecto el dispositivo recién ‘traído’ del servidor:

captura de pantalla

Espero que os sirva y os haya gustado la entrada… y como diría el grandísimo mago Juan Tamariz: Tiararaaaaa raaaaaaaaaaaa….

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *