ESXi 5.1 has USB 3.0 support, sort of…

VMware ESXi 5.1 has USB 3.0 support, but it’s currently limited to using the vSphere Web Client to map client-side USB 3.0 devices to the remote VM.

Long story short, turns out ESXi 5.1 doesn’t really support USB 3.0 in the way you might think. In other words, if your system running ESXi 5.1 has USB 3.0 ports, that’s nice! But the USB 2.0 or USB 3.0 devices you have plugged into those ports are not available for mapping to individual VMs. Instead, all ESXi 5.1 can do is map a client side USB 3.0 device to your VMs, if you’re using the vSphere Web Client (I used Chrome). I tested a ThinkPad W520 laptop called tZilla, with the solid USB 3.0 drivers that come with Windows 8 Pro 64 bit), and Chrome running the vSphere Web Client with an ADATA USB 3.0 thumb drive successfully mapped to the ESXi-hosted VM running Windows 8, and I witnessed USB 3.0 speeds (over my gigabit LAN). I realize you may need to read this paragraph twice, as this is not likely what you were expecting by USB 3.0 support.

Back in late August, from my hotel room near VMworld 2012, I hurriedly tried out some quick remote USB 3.0 tests on my freshly built ESXi 5.1 system, having found no documentation stating it would work at all. I didn’t do so well, because it’s also clear I didn’t really know what I was doing quite yet, as you’ll see here (where it turns out the USB 3.0 stick was inserted into a USB 2.0 port, making it work, but slowly):

 

Online Research Findings:

So today, I resumed poking around a bit for more info, and a little more info.

Windows 8 / Windows Server 2012 Operating System does not boot or install on ESXi or ESX, KB: 2006859, Updated: Sep 9, 2012
says the following: 

VMware does not currently recommend using USB xHCI with Windows 8 / Windows Server 2012. To work around this issue, remove the USB xHCI controller or use the USB EHCI+UHCI controller. 

Surprisingly, even though ESXi 5.1 has been out for some weeks now, there is pretty much no useful info about USB 3.0 support for VMs out there, seen by Google-ing for:
xHCI “esxi 5.1″ “usb 3″

but I did manage to find this article, in the “VMware vSphere 5.1 Documentation Center” when searching for xHCI (the name of the USB 3.0 controller in the VM):
Add a USB Controller to a Virtual Machine in the vSphere Client

which (wrongly) says:
Drivers are not available for the xHCI controller on Windows guest operating systems.
sorry, but works fine on Windows 8 64 bit VM I created.

then there’s this article, in a later chapter of the same document:
Add a USB Controller to a Virtual Machine in the vSphere Web ClientAdd a USB Controller to a Virtual Machine in the vSphere Web Client

which (wrongly) says “Linux guests only”:

Why do I say wrongly? Well, in this video, you won’t see any complaint from the VM when I map a USB 3.0 memory stick to a Windows VM with the xHCI controller configured for the VM. By complaining, I mean the usual “This USB Mass Storage Device can transfer information faster if you connect it to a Super-Speed USB 3.0 port” kind of thing. So yeah, that’s pretty interesting. I also find it odd that there’s so little info from VMware, especially since comes with a VMware Tools version that seems to equips your VMs to support USB 3.0 jsut fine, even on Windows (not just for Linux VMs, as was the case with 5.0).
 

As I was reading all this stuff, I had the sinking feeling that I now knew why my previous, embarrassing attempt at USB 3.0 tests, with the humiliation on the YouTube video above, was really a doomed effort. It became clear that the Hypervisor itself doesn’t recognize my ASMedia USB 3.0 controllers on vZilla‘s ASRock motherboard. Nor will it recognize them on other folks’s systems (NEC USB 3.0 chips, etc). Well, probably not until ESXi 6.0 anyway. Maybe ThunderBolt too?

Back to reality. What happens when you go to try to add USB devices (2.0 or 3.0)? Well, naturally, you’re only presented with USB 2.0 devices to attach to the VM, if you inserted that device into a USB 2.0 port, so that the Hypervisor can recognize that device (running at USB 2.0 speeds). The Hypervisor really doesn’t seem to see USB 3.0 ports at all, nor does it see any devices installed in those ports.

With all the slight inconsistencies I found during my research, I got impatient, and just went ahead and tried stuff out with the vSphere Client (32 bit Windows) and the vSphere Web Client (Chrome). And I’m glad I did, because it seems to work, at about 60% of native speed. And I recorded my experiences, so you can eavesdrop on my unrehearsed horsing around with USB 3.0.
 

Actual Tests I Performed:
You’ll see that the Windows VMs no longer warn you the xHCI controller isn’t designed for this OS, seen here at this spot in the video for my recent Windows 8 template VM creation video.

The VMware USB 3.0 configuration and wording from VMware also shows up nicely in this screenshot I just created, where you’ll also note that I’m also using Windows 8 64 bit with “Virtual Machine Version: vmx-09″ (hardware version 9):

 

Finally, here’s the video that shows me using ATTO Diskbench on the But at least this video shows you what you can do for now, speed testing an ADATA USB 3.0 thumb drive locally attached to my laptop, versus mapped to a Windows VM running on ESXi 5.1, with the vSphere Web Client mapping that same laptop “client” USB 3.0 ADATA USB 3.0 thumb drive. Here’s the results (screenshot of the video), with about 40% of the performance lost going virtual (with USB 3.0 traffic flowing over Gigabit Ethernet):

 

Here’s the full video of those USB 3.0 memory stick tests.

 

I admit I didn’t test replacing the USB controller with the USB 1.1 / USB 2.0 “EHCI+UHCI” to witness the slowdown, nor did I test a faster USB 3.0 device to really push the limits, but I feel I learned all I need to know about USB 3.0 for now, freeing me to resume the other dozens of drafts I’d like to publish. Near-term, one of those drafts is about why VT-d/ VMDirectPath for USB 3.0 PCI cards seemed to work better on ESXi 5.0, at least on ASRock motherboards. In other words, my article How to configure ESXi 5.0 for USB 3.0 passthrough to a Windows VM seems to no longer work, with ESXi 5.1 no longer allowing me to configure the USB 3.0 card’s controllers for passthru to a VM for full USB 3.0 speed, at all. Others have similar stories, seen here on VMware’s forum. But there’s a workaround, if it’s just >2TB NTFS drive support you’re trying to get from an affordable external RAID enclosure for example. Just use RDM mappings instead, for eSATA connectivity to your enclosure instead of USB 3.0, described at Practical ways to deal with VMware ESXi 5.0′s 2TB virtual disk size limitation.


Sep. 30 2012 Update:
I have now also tried leaving the xHCI controller in the VM, then tried the vSphere Web Client to map the same ADATA USB 3.0 thumb drive to my client-side USB 3.0 port, ran benchmark, then moved the thumb drive to a client-side USB 2.0 port, and ran the benchmark again, here’s the results:

I then tested attaching a EHCI+UHCI controller type to the VM, which gets me this warning when attempting to attach a client-side USB 3.0 thumb drive:

If I click OK, the VM’s console says USB device not recognized:

so it does seem strange that VMware recommends against using this xHCI controller type. For Windows 8 VMs at least, xHCI sure seems to be the way to go for my templates, which is what I chose in this template creation recipe here.


Share Button

written by

The author didn‘t add any Information to his profile yet.

7 Pingbacks/Trackbacks

  • http://twitter.com/jkotran Joseph Kotran

    Thank you for sharing your insight! This is very helpful.

    • tinkererguy

      You’re welcome, glad it helped you. Probably a very niche audience, eh? But at least it’s a happy niche!

      • ruderthanyou

        Not too niche as you’ve help another person.

        I’ve been converting my backup storage arrays to FreeNAS. It works really throughput wise, and I’m using WOL to turn them on, and a simple PLINK script to shut them down after my backups complete. It’s also nice to know that I wasn’t just doing it for the hell of it, but little did I know I was actually preparing myself for my eventual 5.1 upgrade. The real reason was I didn’t like the idea of my backups to be in the same room as my server.

        Anyway, I do have a modem (for caller id purposes) and a UPS attached to my esxi 5 box. I’m assuming by the article, I should not have any issues passing these devices thru to a guest OS as they are USB 2.0, right?

  • Pingback: Tinkertry featured on “The Home Server Show” BYOB Episode #107 | Tinkertry

  • Pingback: TinkerTry IT @ home | Presented at Connecticut VMUG User Conference on May 14 2013, “Virtualization at home can be practical, affordable, and available, 24×7.”

  • Pingback: TinkerTry IT @ home | Presented at Security BSides Boston on May 18 2013, “Build Your Own VMWare ESXi and Microsoft Hyper-V lab at Home, Using Affordable and Efficient Hardware”

  • Pingback: TinkerTry IT @ home | Featured on “The Home Tech Podcast” Episode #119 “The first one about Virtualization”

  • Pingback: Virtualizaton, VMware vSphere 5.1, ESXi Hypervisor, VMware Player, Oracle VirtualBox, Hyper–V, Drobo 5N for Jim – HT119 | The Average Guy Blog and Podcast Network

  • Pingback: TinkerTry IT @ home | “VMware vCenter Server 5.1 Update 1b and modules” and “VMware vCenter Server 5.1.0 Update 1b Appliance” released

  • Pingback: TinkerTry IT @ home | First look at VMware ESXi 5.5 installation on flash drive, followed by the vSphere client install

  • Jeremy

    Can you post your vmx file? I am interested to see the usb_xhci lines.

    • http://TinkerTry.com/about Paul Braren

      Ah, yes, done, posted below. Th particular VM I wrote about above is long gone.

      Two sample VM Version vmx-10 vmx file contents pasted below, showing the usb_xhci stuff, and thew new VMFS5.60 (>2TB volumes).

      FYI, I’m in the middle of a bunch of ESXi 5.5 rebuilding at the moment…

      windows8vm1.vmx

      .encoding = “UTF-8″
      config.version = “8″
      virtualHW.version = “9″
      vmci0.present = “TRUE”
      displayName = “windows8vm1″
      extendedConfigFile = “windows8vm1.vmxf”
      numvcpus = “2″
      memSize = “2048″
      sched.cpu.units = “mhz”
      tools.upgrade.policy = “manual”
      usb_xhci.present = “TRUE”
      scsi0.virtualDev = “lsisas1068″
      scsi0.present = “TRUE”
      ide1:0.startConnected = “FALSE”
      ide1:0.deviceType = “atapi-cdrom”
      ide1:0.clientDevice = “TRUE”
      ide1:0.present = “TRUE”
      scsi0:0.deviceType = “scsi-hardDisk”
      scsi0:0.fileName = “windows8vm1.vmdk”
      sched.scsi0:0.shares = “normal”
      scsi0:0.present = “TRUE”
      floppy0.startConnected = “FALSE”
      floppy0.clientDevice = “TRUE”
      floppy0.fileName = “vmware-null-remote-floppy”
      ethernet0.virtualDev = “vmxnet3″
      ethernet0.networkName = “VM Network”
      ethernet0.addressType = “vpx”
      ethernet0.generatedAddress = “00:50:56:a7:2d:9c”
      ethernet0.present = “TRUE”
      guestOS = “windows8-64″
      toolScripts.afterPowerOn = “TRUE”
      toolScripts.afterResume = “TRUE”
      toolScripts.beforeSuspend = “TRUE”
      toolScripts.beforePowerOff = “TRUE”
      tools.syncTime = “TRUE”
      uuid.bios = “42 27 ef 8f 68 7a 5c e3-d5 09 12 2c de ea 02 e6″
      vc.uuid = “50 27 2f 40 a9 8d a0 ae-d8 c3 8e 0a f2 2f 25 43″
      svga.present = “true”
      tools.guest.desktop.autolock = “false”
      vmci.filter.enable = “true”
      ide1:0.autodetect = “true”
      pciBridge0.present = “true”
      pciBridge4.present = “true”
      pciBridge4.virtualDev = “pcieRootPort”
      pciBridge4.functions = “8″
      pciBridge5.present = “true”
      pciBridge5.virtualDev = “pcieRootPort”
      pciBridge5.functions = “8″
      pciBridge6.present = “true”
      pciBridge6.virtualDev = “pcieRootPort”
      pciBridge6.functions = “8″
      pciBridge7.present = “true”
      pciBridge7.virtualDev = “pcieRootPort”
      pciBridge7.functions = “8″
      hpet0.present = “TRUE”
      nvram = “windows8vm1.nvram”
      virtualHW.productCompatibility = “hosted”
      cpuid.coresPerSocket = “2″
      scsi0.pciSlotNumber = “160″
      sched.scsi0:0.throughputCap = “off”
      ethernet0.pciSlotNumber = “192″
      usb_xhci.pciSlotNumber = “224″
      svga.autodetect = “TRUE”
      vmci0.pciSlotNumber = “32″
      snapshot.action = “keep”
      sched.cpu.latencySensitivity = “normal”
      mks.enable3d = “TRUE”
      wwn.enabled = “true”
      pciBridge0.pciSlotNumber = “17″
      pciBridge4.pciSlotNumber = “21″
      pciBridge5.pciSlotNumber = “22″
      pciBridge6.pciSlotNumber = “23″
      pciBridge7.pciSlotNumber = “24″
      replay.supported = “FALSE”
      scsi0.sasWWID = “50 05 05 6f 68 7a 5c e0″
      softPowerOff = “FALSE”
      usb_xhci:1.deviceType = “hub”
      usb_xhci:1.parent = “-1″
      usb_xhci:1.port = “1″
      usb_xhci:1.present = “true”
      usb_xhci:1.speed = “2″
      usb_xhci:3.deviceType = “hub”
      usb_xhci:3.parent = “-1″
      usb_xhci:3.port = “3″
      usb_xhci:3.present = “true”
      usb_xhci:3.speed = “4″
      vm.genidX = “5249893967608495986″
      vmotion.checkpointFBSize = “67108864″
      unity.wasCapable = “FALSE”
      tools.remindInstall = “FALSE”
      scsi0:0.ctkEnabled = “true”
      ctkEnabled = “TRUE”
      toolsInstallManager.lastInstallError = “0″
      toolsInstallManager.updateCounter = “5″
      chipset.onlineStandby = “FALSE”
      sched.cpu.min = “0″
      sched.cpu.shares = “normal”
      sched.mem.min = “0″
      sched.mem.minSize = “0″
      sched.mem.shares = “normal”
      sched.swap.derivedName = “/vmfs/volumes/4f04c8cf-a68e0c4f-15b6-001517c92d20/windows8vm1/windows8vm1-78dfea29.vswp”
      uuid.location = “56 4d 75 10 af 66 64 95-30 17 25 40 20 c7 1d c3″
      replay.filename = “”
      scsi0:0.redo = “”
      vmci0.id = “-555089178″
      vm.genid = “-6211761924987670071″
      cleanShutdown = “FALSE”
      usb_xhci:4.present = “TRUE”
      usb_xhci:4.deviceType = “hid”
      usb_xhci:4.port = “0″
      usb_xhci:4.parent = “1″

      vzilla-Windows Server 2012 Essentials.vmx

      .encoding = “UTF-8″
      config.version = “8″
      virtualHW.version = “10″
      vmci0.present = “TRUE”
      displayName = “vzilla-Windows Server 2012 Essentials”
      extendedConfigFile = “vzilla-Windows Server 2012 Essentials.vmxf”
      scsi0.present = “TRUE”
      ide1:0.present = “TRUE”
      ethernet0.present = “TRUE”
      guestOS = “windows8srv-64″
      numvcpus = “3″
      chipset.onlineStandby = “FALSE”
      memSize = “4096″
      sched.cpu.min = “0″
      sched.cpu.units = “mhz”
      sched.cpu.shares = “normal”
      sched.mem.shares = “normal”
      tools.syncTime = “TRUE”
      toolScripts.afterPowerOn = “TRUE”
      toolScripts.afterResume = “TRUE”
      toolScripts.beforeSuspend = “TRUE”
      toolScripts.beforePowerOff = “TRUE”
      tools.upgrade.policy = “manual”
      uuid.bios = “42 10 67 6b c5 c4 7b a4-9a f5 d1 b7 bb d3 aa 90″
      vc.uuid = “50 10 94 38 fe 35 b7 f7-df 6d f5 f5 49 5d 8d f7″
      scsi0.virtualDev = “lsisas1068″
      ide1:0.deviceType = “atapi-cdrom”
      ide1:0.clientDevice = “TRUE”
      ide1:0.fileName = “emptyBackingString”
      scsi0:0.present = “TRUE”
      scsi0:0.deviceType = “scsi-hardDisk”
      scsi0:0.fileName = “vzilla-Windows Server 2012 Essentials_2-000001.vmdk”
      sched.scsi0:0.shares = “normal”
      scsi0:1.present = “TRUE”
      scsi0:1.deviceType = “scsi-hardDisk”
      scsi0:1.fileName = “/vmfs/volumes/4f04c8cf-a68e0c4f-15b6-001517c92d20/vzilla-Windows Server 2012 Essentials/vzilla-Windows Storage Server 2008 R2 Essentials.vmdk”
      scsi0:1.mode = “independent-persistent”
      sched.scsi0:1.shares = “normal”
      scsi0:2.present = “TRUE”
      scsi0:2.deviceType = “scsi-hardDisk”
      scsi0:2.fileName = “/vmfs/volumes/4f04c8cf-a68e0c4f-15b6-001517c92d20/vzilla-Windows Server 2012 Essentials/vzilla-Windows Server 2012 Essentials.vmdk”
      scsi0:2.mode = “independent-persistent”
      sched.scsi0:2.shares = “normal”
      scsi0:3.present = “TRUE”
      scsi0:3.deviceType = “scsi-hardDisk”
      scsi0:3.fileName = “/vmfs/volumes/51286ca4-ef967828-664d-001b2129ad71/vzilla-Windows Server 2012 Essentials/vzilla-Windows Server 2012 Essentials_1.vmdk”
      scsi0:3.mode = “independent-persistent”
      sched.scsi0:3.shares = “normal”
      scsi0:15.present = “TRUE”
      scsi0:15.deviceType = “scsi-hardDisk”
      scsi0:15.fileName = “/vmfs/volumes/5128733c-2147a982-db8c-001b2129ad71/vzilla-Windows Server 2012 Essentials/vzilla-Windows Server 2012 Essentials.vmdk”
      scsi0:15.mode = “independent-persistent”
      sched.scsi0:15.shares = “normal”
      floppy0.startConnected = “FALSE”
      floppy0.clientDevice = “TRUE”
      floppy0.fileName = “vmware-null-remote-floppy”
      ethernet0.virtualDev = “vmxnet3″
      ethernet0.networkName = “VM Network”
      ethernet0.addressType = “vpx”
      ethernet0.generatedAddress = “00:50:56:90:98:38″
      svga.present = “true”
      tools.guest.desktop.autolock = “false”
      vmci.filter.enable = “true”
      sched.scsi0:1.throughputCap = “off”
      sched.scsi0:2.throughputCap = “off”
      pciBridge0.present = “true”
      pciBridge4.present = “true”
      pciBridge4.virtualDev = “pcieRootPort”
      pciBridge4.functions = “8″
      pciBridge5.present = “true”
      pciBridge5.virtualDev = “pcieRootPort”
      pciBridge5.functions = “8″
      pciBridge6.present = “true”
      pciBridge6.virtualDev = “pcieRootPort”
      pciBridge6.functions = “8″
      pciBridge7.present = “true”
      pciBridge7.virtualDev = “pcieRootPort”
      pciBridge7.functions = “8″
      hpet0.present = “TRUE”
      nvram = “vzilla-Windows Server 2012 Essentials.nvram”
      virtualHW.productCompatibility = “hosted”
      scsi0.pciSlotNumber = “160″
      sched.scsi0:0.throughputCap = “off”
      ethernet0.pciSlotNumber = “192″
      vmci0.pciSlotNumber = “32″
      firmware = “efi”
      disk.EnableUUID = “true”
      snapshot.action = “keep”
      sched.cpu.latencySensitivity = “normal”
      sched.mem.min = “4096″
      pciBridge0.pciSlotNumber = “17″
      pciBridge4.pciSlotNumber = “21″
      pciBridge5.pciSlotNumber = “22″
      pciBridge6.pciSlotNumber = “23″
      pciBridge7.pciSlotNumber = “24″
      replay.supported = “FALSE”
      scsi0.sasWWID = “50 05 05 6b c5 c4 7b a0″
      vm.genidX = “-2904149420782067135″
      vmotion.checkpointFBSize = “4194304″
      softPowerOff = “TRUE”
      unity.wasCapable = “FALSE”
      tools.remindInstall = “FALSE”
      vm.genid = “-1399677297106871057″
      scsi0:1.ctkEnabled = “false”
      scsi0:2.ctkEnabled = “false”
      vmotion.checkpointSVGASize = “8323072″
      usb_xhci.pciSlotNumber = “-1″
      usb_xhci:1.present = “TRUE”
      usb_xhci:3.present = “TRUE”
      usb_xhci:1.speed = “2″
      usb_xhci:1.deviceType = “hub”
      usb_xhci:1.port = “1″
      usb_xhci:1.parent = “-1″
      usb_xhci:3.speed = “4″
      usb_xhci:3.deviceType = “hub”
      usb_xhci:3.port = “3″
      usb_xhci:3.parent = “-1″
      pciPassthru0.id = “04:00.0″
      pciPassthru0.deviceId = “0×1042″
      pciPassthru0.vendorId = “0x1b21″
      pciPassthru0.systemId = “5127b066-3387-7c1a-89a1-001b2129ad71″
      pciPassthru0.pciSlotNumber = “-1″
      usb_xhci:4.present = “TRUE”
      usb_xhci:4.deviceType = “hid”
      usb_xhci:4.port = “0″
      usb_xhci:4.parent = “1″
      sched.scsi0:3.throughputCap = “off”
      sched.scsi0:15.throughputCap = “off”
      toolsInstallManager.lastInstallError = “0″
      toolsInstallManager.updateCounter = “4″
      checkpoint.vmState = “”
      vmci0.id = “-1143756144″
      uuid.location = “56 4d 51 27 fc 64 18 cf-66 46 26 d9 54 12 52 ee”
      cleanShutdown = “TRUE”
      migrate.hostlog = “./vzilla-Windows Server 2012 Essentials-5f8af8cd.hlog”
      sched.swap.derivedName = “/vmfs/volumes/512abb05-dacb4fef-17a5-001b2129ad71/vzilla-Windows Server 2012 Essentials/vzilla-Windows Server 2012 Essentials-5f8af8cd.vswp”
      replay.filename = “”
      scsi0:0.redo = “”
      scsi0:1.redo = “”
      scsi0:2.redo = “”
      scsi0:3.redo = “”
      scsi0:15.redo = “”
      ide1:0.startConnected = “TRUE”
      usb.pciSlotNumber = “33″
      usb.present = “TRUE”
      ehci.pciSlotNumber = “34″
      ehci.present = “TRUE”
      usb.autoConnect.device0 = “path:2/0/2 autoclean:1″
      config.readOnly = “FALSE”
      usb.autoConnect.device1 = “”
      usb:1.present = “TRUE”
      usb:1.speed = “2″
      usb:1.deviceType = “hub”
      usb:1.port = “1″
      usb:1.parent = “-1″
      usb:0.present = “TRUE”
      usb:0.deviceType = “hid”
      usb:0.port = “0″
      usb:0.parent = “-1″

      • Jeremy

        Maybe I don’t know what I am looking for, but I don’t see a USB 3.0 Drives on either of these vmx files.

        Basically, I am trying to work out a method of using a USB 3.0 Drive on the Free version of 5.1 ESXi. I can setup usb xhci, but I can’t add any devices via the interface. I got it into my head, if I could add the usb 3.0 drive manually to the vmx file that the device might work, but need an example of what the file might look like so I can emulate it.

        You have the only example I found on the internet of someone who found a way to just make it work.

        Thanks for your efforts!

        • http://TinkerTry.com/about Paul Braren

          Well, you won’t get USB 3.0 ports on the ESXi host working, it’s really only the clients connected via the vSphere web client that get their USB 3.0 mapped to the VM (that needs xhci support). I hope the video explains it a bit better? (back on ESXi 5.1)