Configuring USB host passthrough
You can enable passthrough of USB devices to allow a virtual machine (VM) to connect to USB hardware that is attached to an OpenShift Container Platform node, as if the hardware and the VM are physically connected.
To expose a USB device, first enable host passthrough and then configure the VM to use the USB device.
Enabling USB host passthrough
To attach a USB device to a virtual machine (VM), you must first enable USB host passthrough at the cluster level.
To do this, specify a resource name and USB device name for each device you want first to add and then assign to a VM. You can allocate more than one device, each of which is known as a selector in the HyperConverged custom resource (CR), to a single resource name. If you have multiple identical USB devices on the cluster, you can choose to allocate a VM to a specific device.
Prerequisites
- You have access to an OpenShift Container Platform cluster as a user who has the
cluster-adminrole. - You have installed the OpenShift CLI (
oc).
Procedure
-
Identify the USB device vendor and product:
$ lsusbExample output
Bus 003 Device 007: ID 1b1c:0a60 example_manufacturer example_product_name-
If you cannot use the
lsusbcommand, inspect the USB device configurations in the host’s/sys/bus/usb/devices/directory:for dev in *; doif [[ -f "$dev/idVendor" && -f "$dev/idProduct" ]]; thenecho "Device: $dev"echo -n " Manufacturer : "; cat "$dev/manufacturer"echo -n " Product: "; cat "$dev/product"echo -n " Vendor ID : "; cat "$dev/idVendor"echo -n " Product ID: "; cat "$dev/idProduct"echofidoneExample output
Device: 3-7Manufacturer : example_manufacturerProduct: example_product_nameVendor ID : 1b1cProduct ID: 0a60
-
-
Open the
HyperConvergedCR in your default editor by running the following command:$ oc edit hyperconvergeds.v1beta1.hco.kubevirt.io kubevirt-hyperconverged -n openshift-cnv -
Add the required USB device to the
permittedHostDevicesstanza of theHyperConveredCR. The following example adds a device with vendor ID045eand product ID07a5:apiVersion: hco.kubevirt.io/v1beta1kind: HyperConvergedmetadata:name: kubevirt-hyperconvergednamespace: openshift-cnvspec:permittedHostDevices:usbHostDevices:- resourceName: kubevirt.io/peripheralsselectors:- vendor: "045e"product: "07a5"- vendor: "062a"product: "4102"- vendor: "072f"product: "b100"spec.permittedHostDevicesdefines the host devices that have permission to be used in the cluster.spec.permittedHostDevices.usbHostDevicesdefines a list of available USB devices.spec.permittedHostDevices.usbHostDevices.resourceNamedefines the USB device that you want to add and assign to the VM. In this example, the resource is bound to three devices, each of which is identified byvendorandproductand is known as aselector.
Connecting a USB device to a virtual machine
You can configure virtual machine (VM) access to a USB device. This configuration enables the VM to connect to USB hardware that is attached to an OpenShift Container Platform node, as if the hardware and the VM are physically connected.
Prerequisites
- You have installed the OpenShift CLI (
oc). - You have attached the required USB device as a resource at the cluster level.
Procedure
-
In the
HyperConvergedcustom resource (CR), find the assigned resource name of the USB device:$ oc get hyperconvergeds.v1beta1.hco.kubevirt.io kubevirt-hyperconverged -n openshift-cnvExample output:
# ...spec:permittedHostDevices:usbHostDevices:- resourceName: kubevirt.io/peripheralsselectors:- vendor: "045e"product: "07a5"- vendor: "062a"product: "4102"- vendor: "072f"product: "b100" -
Open the VM CR:
$ oc edit vm <vm_name>where:
<vm_name>- Specifies the name of the
VirtualMachineCR.
-
Edit the CR by adding the USB device, as shown in the following example: Example configuration:
apiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:name: example-vmspec:template:spec:architecture: amd64domain:devices:hostDevices:- deviceName: kubevirt.io/peripheralsname: local-peripherals# ...spec.template.spec.domain.devices.hostDevices.deviceNamespecifies the resource name from theHyperConvergedCR.spec.template.spec.domain.devices.hostDevices.namedefines the name of the USB device.
-
Save and apply your changes:
$ oc apply -f <filename>.yamlwhere:
<filename>- Specifies the name of the
VirtualMachinemanifest YAML file.