Xen USB Passthrough
Overview
There are two general methods for passing through individual host devices to a guest. The first is via an emulated USB device controller; the second is PVUSB.
Additionally, there are two ways to add USB devices to a guest: via the config file at domain creation time, and via hot-plug while the VM is running.
Another popular method for passing through USB devices, particular for gaming rigs, is to use PCI pass-through to pass through the entire host USB controller. This will result in the lowest overhead and best feature support. It does mean however that you cannot choose individual USB devices on a controller to the guest: it's all or nothing. This is suitable for both PV and HVM guests.
There are also non-Xen solutions like USB IP, in which USB devices are shared over the network.
Emultated USB
In emulated USB, the device model (qemu) presents an emulated USB controller to the guest. The device model process then grabs control of the device from domain 0 and and passes the USB commands between the guest OS and the host USB device.
This method is only available to HVM domains, and is not available for domains running with device model stubdomains.
PVUSB
PVUSB uses a paravirtialized front-end/back-end interface, similar to the traditional Xen PV network and disk protocols. In order to use PVUSB, you need usbfront in your guest OS, and usbback in dom0 (or your USB driver domain).
Unfortunately, kernel support for the PVUSB protocol isn't very good. See the section below for links to more information about PVUSB driver support.
Additionally, for easy use of PVUSB, you need support in the toolstack to get the two sides to talk to each other. (Alternately, you can write a script to talk over xenstore to the front and backends manually; see the section below for more information.)
Details
Specifying a host USB device
USB devices are primarily specified either by their bus address (in the form bus.device
) or their device tag (in the form vendorid:deviceid
).
Each way of specifying has its advantages:
- Specifying by device tag will always get the same device, regardless of where the device ends up in the USB bus topology. However, if there are two identical devices, it will not allow you to specify which one.
- Specifying by bus address will always allow you to choose a specific device, even if you have duplicates. However, the bus address may change depending on which port you plugged the device into, and possibly also after a reboot.
You can use lsusb
to list the USB devices on the system:
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 003 Device 002: ID f617:0905 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 004: ID 0424:2640 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 005: ID 0424:4060 Standard Microsystems Corp. Ultra Fast Media Reader Bus 001 Device 006: ID 046d:c016 Logitech, Inc. Optical Wheel Mouse
To pass through the Logitec mouse, for instance, you could specify either 046d:c016
or 1.6
.
Note: lsusb lists the bus and device number with leading zeroes, but you should remove these when specifying the device to xl. (Leading zeroes will result in xl interpreting the number as an octal.)
Host USB in xl
As of 4.4, xl only has support for emulated USB, from the config file.
Enable the emulated USB hub with usb=1
. Then specify devices among the list of devices in the config file along with other emulated devices by using host:USBID
. For example:
usb=1 usbdevice=['tablet','host:1.6','host:0424:460']
The default USB controller created by qemu is USB 1.1. For some devices, this isn't sufficient. For this reason, as of 4.4, you can specify that the USB controller version as well, with usbversion
. However, at the moment this is incompatible with usbdevice
, and so is only useful in conjunction with spice USB redirection. This option is not available for qemu-traditional.
With the removal of xend
slated for 4.4, we expect xl PVUSB support and hot-plug support to be a requirement to release 4.5.
Host USB in xm/xend
Note: xend
/xm
has been deprecated since 4.2, and as of this writing is slated to be removed as of 4.5.
xend
has support for both emulated USB and PVUSB.
Please note however, that emulated USB and PVUSB use different sets of commands, both for hotplug, and in the config file, and the naming scheme isn't very obvious.
Emulated USB in xm/xend
In order to use emulated USB, you must enable it in the config file with usb=1
.
You can specify a device in the config file; but unfortunately the xend
syntax for usbdevice
only allows you to specify a single USB device of any kind:
usb=1 usbdevice=host:1.6
Fortunately, you can also hot-plug and un-plug devices after boot:
xm usb-add domain host:xx.yy
xm usb-del domain host:xx.yy
xend
only supports USB 1.1.
PVUSB in xm/xend
PVUSB uses the following hotplug commands: usb-hc-create
, usb-hc-destroy
, usb-attach
, usb-destroy
PVUSB can also be specified in the config file via the vusb
directive.
Please see the xm
and xm.cfg
man pages for more information.
PVUSB in xl/libxl
The support for PVUSB in xl/libxl is in the development. The main task is to design appropriate interface to add/delete usb devices.
More info
PVUSB support in Xen 4.0 and newer versions
PVUSB is a new high performance method of doing USB passthru from dom0 to the guests, supporting both USB 2.0 and USB 1.1 devices. PVUSB does not use Qemu-dm. PVUSB can be used with both HVM and PV domUs, but it requires special pvusb drivers in dom0 kernel (xen-usbback) and the frontend driver (xen-usbfront) in the VM.
Presentation slides about PVUSB from XenSummits (contains usage examples and syntax):
- February 2009 PVUSB: http://www.xen.org/files/xensummit_oracle09/PVUSB.pdf
- November 2009 PVUSB update: http://www.xen.org/files/xensummit_intel09/PVUSBStatusUpdate.pdf
Links related to PVUSB:
- A script to use PVUSB in an easier way with Xen: http://www.neobiker.de/wiki/index.php?title=XEN-PVUSB
- Submission of PVUSB drivers to Xen, usage help etc: http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01084.html
- PVUSB updates from 10/2009: http://lists.xensource.com/archives/html/xen-devel/2009-10/msg00257.html
- PVUSB xm/xend support: http://lists.xensource.com/archives/html/xen-devel/2009-12/msg00478.html and http://xenbits.xen.org/xen-unstable.hg?rev/2e5032921b07
- Mailinglist discussions about PVUSB: http://article.gmane.org/gmane.comp.emulators.xen.devel/70980, http://old.nabble.com/anyone-using-pvusb--td25273516.html
Xen Linux kernels that have PVUSB support included:
- linux-2.6.18-xen has both the PVUSB backend and frontend drivers included. http://xenbits.xen.org/linux-2.6.18-xen.hg
- PVUSB drivers are currently being ported to the pvops kernel (2.6.32). RFC patch available from: http://lists.xensource.com/archives/html/xen-devel/2011-01/msg00354.html (http://members.iinet.net.au/~nathanael/pvusb.diff).
- Novell SLES11 SP1 kernel-xen (2.6.32) has PVUSB backend and frontend drivers.
- Linux 3.x pvops PVUSB patches: http://lists.xen.org/archives/html/xen-devel/2012-02/msg00576.html and http://lists.xen.org/archives/html/xen-devel/2012-02/msg00571.html .
More information about different kernel versions and drivers in them:
- List of various Xen dom0 capable kernel trees for Linux: XenDom0Kernels:
- List of Xen features in different Linux kernel trees: XenKernelFeatures:
Windows Xen PVUSB drivers (frontends):
- Xen Windows GPLPV drivers by James Harper have an early version of PVUSB frontend driver included.
- Discussion about initial GPLPV usbfront implementation: http://lists.xensource.com/archives/html/xen-devel/2009-09/msg00491.html