jueves, 11 de diciembre de 2008

VirtualBox. Puertos USB en Ubuntu.

En este artículo vamos a ver cómo se activan los puertos USB para que puedan ser utilizados en las máquinas virtuales que hemos creado con VirtualBox. El sistema anfitrión es Linux Ubuntu 8.04.

VirtualBox tiene dos versiones: OSE (Open Source Edition) y PUEL (Personal Use and Evaluation License). Yo siempre he trabajado con las versiones OSE. La versión PUEL no es libre y, por lo tanto, no es gratuita, aunque existe una versión de evaluación para uso personal (PUEL). En la página oficial de VirtualBox indica cómo se descarga esta versión junto con la clave de utilización del producto.

Cuando se me ha planteado la necesidad de utilizar los puertos USB en mis máquinas virtuales, he encontrado información en internet sobre la forma de realizar la configuración, pero , ¡sorpresa: los puertos USB sólo se pueden utilizar con la versión PUEL!.

Como, en esto de la informática, además de tener tiempo, hay que ser algo intrépido, he decidido probar la información que he encontrado en internet en la versión OSE, para no tener que cambiar a la versión PUEL, y ha ocurrido algo que no suele ser muy habitual: ¡HA FUNCIONADO!. La prueba la he realizado con las versiones 2.0.6 (que es la última en el momento de escribir este artículo) y 1.6.0 y con máquinas virtuales con Linux Ubuntu 8.04 y Windows XP en ambas versiones y todo ha funcionado correctamente. Los dispositivos que he utilizado han sido una impresora, un disco duro externo y un pendrive.

He aquí las acciones a realizar para utilizar los puertos USB en VirtualBox OSE (se supone que en la versión PUEL también funcionaría, pero no le probado; mi intrepidez tiene un límite).

En primer lugar, tenemos que editar el archivo /etc/init.d/mountdevsubfs.sh y buscar el siguiente párrafo:

#
# Magic to make /proc/bus/usb work
#
# mkdir -p /dev/bus/usb/.usbfs
# domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
# ln -s .usbfs/devices /dev/bus/usb/devices
# mount --rbind /dev/bus/usb /proc/bus/usb

El archivo /etc/init.d/mountdevsubfs.sh es un script que monta dispositivos especiales en nuestro sistema de archivos. El sistema lo trata como un servicio (está en el directorio /etc/init.d).

Tenemos que modificar el bloque anterior del archivo /etc/init.d/mountdevsubfs.sh quitando los comentarios a las líneas ejecutables, quedando como sigue:

#
# Magic to make /proc/bus/usb work
#
mkdir -p /dev/bus/usb/.usbfs
domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
ln -s .usbfs/devices /dev/bus/usb/devices
mount --rbind /dev/bus/usb /proc/bus/usb

A continuación, tenemos que editar el archivo /etc/udev/rules.d/40-permissions.rules y buscar el siguiente párrafo:

# USB serial converters
SUBSYSTEM=="usb_device", GOTO="usb_serial_start"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="usb_serial_start"
GOTO="usb_serial_end"
LABEL="usb_serial_start"
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \
MODE="0660", GROUP="dialout"
LABEL="usb_serial_end"

En el archivo /etc/udev/rules.d/40-permissions.rules se definen los usuarios y los grupos que pueden acceder a los dispositivos del sistema, debiendo añadir el grupo vboxusers (este grupo es el que utiliza VirtualBox) para que podamos acceder desde nuestras máquinas virtuales a los puertos USB. La orden se añade en el bloque anterior, en la línea ATTRS{idVendor}, quedando como sigue (he escrito en negrita la modificación añadida) :

# USB serial converters
SUBSYSTEM=="usb_device", GOTO="usb_serial_start"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="usb_serial_start"
GOTO="usb_serial_end"
LABEL="usb_serial_start"
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \
,GROUP="vboxusers",MODE="0660", GROUP="dialout"
LABEL="usb_serial_end"

Seguidamente, hay que editar el archivo /etc/udev/rules.d/40-basic-permissions.rules y buscar el siguiente párrafo:

# USB devices (usbfs replacement)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664"
SUBSYSTEM=="usb_device", MODE="0664"

En el archivo /etc/udev/rules.d/40-basic-permissions.rules se definen los tipos de accesos a los dispositivos del sistema que se permiten a los usuarios y grupos. Nosotros tenemos que modificar los permisos para que todos los usuarios puedan leer y escribir en los puertos USB, quedando el párrafo como sigue (he escrito en negrita la modificación realizada) :

# USB devices (usbfs replacement)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
SUBSYSTEM=="usb_device", MODE="0666"

Para que esta configuración tenga efecto hay que reiniciar el equipo (probablemente habrá servicios que, reiniciándose, activen esta configuración, pero los desconozco).

Una vez reiniciado el sistema, hay que configurar cada una de las máquinas virtuales para que activen los puertos USB al iniciarse. Para ello, hay que acceder, desde VirtualBox, a la configuración de la máquina virtual y abrir la opción USB, accediendo a una nueva ventana en la que hay que habilitar los puertos USB y pulsar sobre el icono para Agregar Filtro desde Dispositivo. Ver la Figura 1.

Figura 1

Accedemos a la ventana de la Figura 2.

Figura 2

En esta ventana se muestran los dispositivos USB conectados en ese momento al sistema. Si no se muestra ningún dispositivo es porque no están conectados. Tenemos que seleccionar los dispositivos que queramos e irán insertándose en la ventana de la Figura 1, debiendo repetir esta operación para cada uno de los dispositivos. Una vez finalizada esta acción, se visualizará una ventana parecida a la de la Figura 3.

Figura 3

En este ejemplo se han agregado una impresora, un disco duro externo y un pendrive. Esto quiere decir que los dispositivos, desde este momento, se pueden utilizar en esta máquina virtual. Cada vez que se conecte uno de estos dispositivos y la máquina virtual esté ejecutándose, el dispositivo será accesible desde la máquina virtual, pero no desde el equipo anfitrión. Si no queremos utilizar uno de estos dispositivos desde la máquina virtual, tenemos que desactivar su casilla correspondiente en la ventana de la Figura 3 y, posteriormente, ejecutar la máquina. De esta forma, el dispositivo será accesible sólo desde el equipo anfitrión.

No hay comentarios: