Cómo conectar un dispositivo USB a una máquina virtual alojada en un sistema de virtualización VMware ESXi. En este tutorial conectamos, como ejemplo, un dispositivo X10 CM15 a un servidor ESXi y lo transferimos a una máquina virtual Linux CentOS alojada en este servidor. Este ejemplo sirve para cualquier dispositivo USB (pendrive, impresora, escáner, smartphone, TV, lector SD, etc.).

Requisitos para conectar dispositivo USB a VMware ESXi

En primer lugar necesitaremos disponer de un sistema de virtualización VMware ESXi, como es lógico, con sus máquinas virtuales correspondientes, que serán el destino del dispositivo USB conectado. Físicamente conectaremos el dispositivo USB al servidor VMware ESXi y de forma virtual trasladaremos dicho dispositivo a una máquina virtual existente.

A continuación mostramos algunos artículos y tutoriales sobre cómo montar sistemas de virtualización profesional:

Como también es lógico necesitaremos una máquina virtual montada sobre el sistema de virtualización, en nuestro caso usaremos una máquina virtual con el sistema operativo Linux CentOS, como ejemplo, ya que el método de detección de dispositivo USB con una máquina con Windows suele ser bastante más sencillo. A continuación mostramos cómo montar una máquina virtual o servidor físico con Linux CentOS:

Para comprobar la correcta conexión y detección del dispositivo USB en el servidor VMware ESXi necesitaremos acceder con un usuario con privilegios suficientes y necesitaremos tener habilitado el acceso mediante SSH al servidor VMware ESXi. A continuación mostramos cómo habilitar el acceso SSH a un servidor VMware ESXi:

Conectar y comprobar dispositivo USB a servidor físico VMware ESXi

En primer lugar conectaremos el dispositivo USB físicamente a uno de los conectores USB del servidor VMware ESXi:

Conectar y comprobar dispositivo USB a servidor físico VMware ESXi

Una vez conectado podremos comprobar si ha sido detectado correctamente por VMware ESXi, para ello nos conectaremos mediante SSH (usando cualquier cliente como PuTTY que es gratuito), introduciremos la IP del servidor ESXI y pulsaremos en «Open»:

Conectar y comprobar dispositivo USB a servidor físico VMware ESXi

En primer lugar usaremos el comando Linux «dmesg» para comprobar si el dispositivo USB ha sido detectado por ESXi:

dmesg

Conectar y comprobar dispositivo USB a servidor físico VMware ESXi

Si ha sido detectado aparecerá en los mensajes del sistema:

Conectar y comprobar dispositivo USB a servidor físico VMware ESXi

Devolverá:

~ #dmesg
usb 3-1: new low speed USB device using uhci_hcd and address 5
usb 3-1: New USB device found, idVendor=0bc7, idProduct=0001
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 3-1: Product: USB ActiveHome Interface
usb 3-1: Manufacturer: X10 Wireless Technology Inc
usb 3-1: usbfs: registered usb0305
usb 3-1: device is available for passthrough
usb 3-1: device is available for passthrough
usb 3-1: reset low speed USB device using uhci_hcd and address 5
usb 3-1: reset low speed USB device using uhci_hcd and address 5

Con el comando «lsusb» también podremos obtener los dispositivos USB conectados al servidor VMware ESXi:

Conectar y comprobar dispositivo USB a servidor físico VMware ESXi

Devolverá:

~ # lsusb
Bus 03 Device 05: ID 0bc7:0001 X10 Wireless Technology, Inc. ActiveHome (ACPI-compliant)
Bus 03 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 08 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 07 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 06 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 05 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 04 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 02 Device 01: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 01 Device 01: ID 1d6b:0002 Linux Foundation 2.0 root hub

Asignar dispositivo USB a máquina virtual en VMware ESXi

Una vez detectado el dispositivo en el servidor VMware ESXi ya podremos asignarlo a una máquina virtual. Para ello abriremos VMware vSphere Client, pulsaremos con el botón derecho sobre la máquina virtual a la que le asignaremos el dispositivo USB y en el menú emergente pulsaremos en «Edit Settings»:

Asignar dispositivo USB a máquina virtual en VMware ESXi

Pulsaremos en «Add» para añadir el dispositivo USB conectado:

Asignar dispositivo USB a máquina virtual en VMware ESXi

Seleccionaremos «USB Device»:

Asignar dispositivo USB a máquina virtual en VMware ESXi

El dispositivo USB conectado al servidor VMware ESXi nos aparecerá en la lista, lo seleccionaremos (en nuestro caso «X10 Wireless USB ActiveHome Interface» y pulsaremos «Next»:

Asignar dispositivo USB a máquina virtual en VMware ESXi

Pulsaremos «Finish» para establecer la asignación del dispositivo USB a la máquina virtual:

Asignar dispositivo USB a máquina virtual en VMware ESXi

Pulsaremos «OK» para agregar el dispositivo USB a la máquina virtual:

Asignar dispositivo USB a máquina virtual en VMware ESXi

En las tareas recientes del servidor podremos comprobar que el dispositivo se ha agregado a la máquina virtual:

Asignar dispositivo USB a máquina virtual en VMware ESXi

Si volvemos a acceder a la configuración de la máquina virtual, seleccionando «USB 1», en la parte derecha nos mostrará el estado «Device Status: Connected»:

Asignar dispositivo USB a máquina virtual en VMware ESXi

Comprobar dispositivo USB conectado en máquina virtual Linux CentOS 6

Una vez realizados los pasos anteriores, en la máquina virtual Linux CentOS podremos comprobar si el dispositivo USB ha sido asignado correctamente. Para ello abriremos una ventana de terminal y ejecutaremos el comando:

dmesg

Comprobar dispositivo USB conectado en máquina virtual Linux CentOS 6

Devolverá:

dmesg
usb 2-2.1: new low speed USB device number 7 using uhci_hcd
usb 2-2.1: New USB device found, idVendor=0bc7, idProduct=0001
usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-2.1: Product: USB ActiveHome Interface
usb 2-2.1: Manufacturer: X10 Wireless Technology Inc
usb 2-2.1: configuration #1 chosen from 1 choice

Con el comando «lsusb» podremos comprobar (al igual que en VMware ESXi) que el dispositivo ha sido asignado y detectado correctamente en Linux CentOS:

Comprobar dispositivo USB conectado en máquina virtual Linux CentOS 6

Devolverá:

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 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 007: ID 0bc7:0001 X10 Wireless Technology, Inc. ActiveHome (ACPI-compliant)

Si queremos obtener aún más información sobre el dispositivo USB conectado y detectado en Linux CentOS podremos ejecutar el comando:

lsusb -D /dev/bus/usb/002/003

(donde 002 será el Bus y 003 el Device, ambos valores devueltos en el comando anterior lsusb)

Comprobar dispositivo USB conectado en máquina virtual Linux CentOS 6

Devolverá:

lsusb -D /dev/bus/usb/002/003
Device: ID 0bc7:0001 X10 Wireless Technology, Inc. ActiveHome (ACPI-compliant)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x0bc7 X10 Wireless Technology, Inc.
idProduct 0x0001 ActiveHome (ACPI-compliant)
bcdDevice 1.00
iManufacturer 1 X10 Wireless Technology Inc
iProduct 2 USB ActiveHome Interface
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 32
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 2mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Device Status: 0x0001
Self Powered

Otros comandos para obtener información sobre los dispositivos USB conectados a un equipo Linux:

tail -f /var/log/vmkernel.log | grep -i USB

Devolverá algo así:

usb 3-1: USB disconnect, address 5
usb 3-1: usbfs: unregistered usb0305
usb 3-1: new low speed USB device using uhci_hcd and address 6
usb 3-1: New USB device found, idVendor=0bc7, idProduct=0001
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 3-1: Product: USB ActiveHome Interface
usb 3-1: Manufacturer: X10 Wireless Technology Inc
usb 3-1: usbfs: registered usb0306
usb 3-1: device is available for passthrough
usb 3-1: device is available for passthrough
usb 3-1: reset low speed USB device using uhci_hcd and address 6
usb 3-1: reset low speed USB device using uhci_hcd and address 6
usb 3-1: device is available for passthrough
usb 3-1: device is available for passthrough
usb 3-1: reset low speed USB device using uhci_hcd and address 6
usb 3-1: reset low speed USB device using uhci_hcd and address 6

Otro comando interesante para obtener información de los dispositivos USB es:

cat /proc/bus/usb/devices

Que nos devolverá unos datos sobre los USB conectados y el dato «Driver» muy importante para saber si nuestro dispositivo USB puede requerir de controladores (drivers) adicionales). Por ejemplo, el dispositivo conectado, un «USB ActiveHome X10 Wireless» nos muestra en «Driver» el valor «(none)», lo que quiere decir que probablemente necesite de controladores adicionales:

Comprobar dispositivo USB conectado en máquina virtual Linux CentOS 6

cat /proc/bus/usb/devices
T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 34/900 us ( 4%), #Int= 3, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.32-431.3.1.el6.x86_64 uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:02:00.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0e0f ProdID=0003 Rev= 1.02
S: Manufacturer=VMware
S: Product=VMware Virtual USB Mouse
C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=1ms
I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid
E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=1ms
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 3 Spd=12 MxCh= 7
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0e0f ProdID=0002 Rev= 1.00
S: Product=VMware Virtual USB Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms
T: Bus=02 Lev=02 Prnt=03 Port=00 Cnt=01 Dev#= 7 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0bc7 ProdID=0001 Rev= 1.00
S: Manufacturer=X10 Wireless Technology Inc
S: Product=USB ActiveHome Interface
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms
E: Ad=02(O) Atr=03(Int.) MxPS= 8 Ivl=10ms
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6

B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev= 2.06
S: Manufacturer=Linux 2.6.32-431.3.1.el6.x86_64 ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:02:02.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms

En este caso concreto, se trata de un adaptador USB a serie y efectivamente requiere de drivers adicionales, que descargaremos e instalaremos siguiendo las instrucciones del fabricamente. En este ejemplo descargaremos el dichero iplc-driver.tgz (desde www.linuxha.com/athome/common/iplcd/iplc-driver.tgz). Una vez descargado ejecutaremos los siguientes comandos para instalar el driver:

wget «http://www.absurde.org/wp-content/uploads/2011/10/iplc-2.6.36.patch_.txt»

wget «http://www.linuxha.com/common/iplcd/iplc-driver.tgz»

tar -xvzf iplc-driver.tgz

patch iplc/driver/linux-2.6/device.c < iplc-2.6.36.patch_.txt

patching file iplc/driver/linux-2.6/device.c

sed -i ‘s#linux/autoconf.h#generated/autoconf.h#’ iplc/driver/linux-2.6/device.c

sed -i ‘s##include <linux/smp_lock.h>#//#include <linux/smp_lock.h>#’ iplc/driver/linux-2.6/device.c

cd iplc/driver/linux-2.6/

make cm15a

Los drivers en Linux se suelen instalar como hemos indicado anteriormente, si bien puede variar la instalación en función del driver. Otra forma:

tar zxvf iplc-driver.tgz

cd iplc/driver/linux-2.6

make -f Makefile.cm15a

make cm15a

cd cm15a.d

insmod cm15a.ko