KVM With usb/pci passthrough

Creating a Virtual Machine for Windows 10

virt-install \
    --name=Windows10-VM1 \
    --ram=4096 \
    --cpu=host \
    --vcpus=2 \
    --os-type=windows \
    --os-variant=win7 \
    --disk /srv/dev-disk-by-label-SSD/kvm/Windows10-VM1,size=200,sparse=true,bus=virtio \
    --disk /zfs-pool-1/kvm/iso/Windows10.iso,device=cdrom,bus=ide \
    --disk /zfs-pool-1/kvm/iso/virtio-win.iso,device=cdrom,bus=ide \
    --network bridge=br0 \
    --graphics vnc,listen=0.0.0.0 

Click on Load Driver and browse for the Windows 10 viostor driver. Remember amd64 = 64 bits Windows and x86 = 32 bits.

 

Set VNC Password

1. Run

virsh edit Windows10-VM1

2. Add paremeter passwd to element graphics with parameter type=”vnc”

    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='yourpassword'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>

3. stop the virtual machine and then start it again

virsh shutdown Windows10-VM1
virsh start Windows10-VM1

Change network driver

Default is rtl8139 whish is 10/100 Mbit/s change to virtio to get 10Gb/s

1. Run

virsh edit Windows10-VM1

2. change parameter type to virtio on element model in element interface

<interface type='bridge'>
	<mac address='52:54:00:46:16:01'/>
	<source bridge='br0'/>
	<model type='virtio'/>
	<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

USB passthrough

Add USB 3.0 Deciv

First change usb driver from USB 2.0 to USB 3.0

1. Run

virsh edit Windows10-VM1

2. Remove all usb controllers in the devices element

    <controller type='usb' index='0' model='ich9-ehci1'>
      

<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      

<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      

<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      

<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>

3. Add a new USB 3 controller

<controller type='usb' index='0' model='nec-xhci'>
</controller>

Add USB Device (Testing)

1. Find your device, run lsusb. Result will look like below, find the usb device you want to use, you want the vendor and product id.

root@dalesjo-nas:~# lsusb
Bus 006 Device 002: ID 8087:8000 Intel Corp.
Bus 006 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 002: ID 8087:8008 Intel Corp.
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 152d:0551 JMicron Technology Corp. / JMicron USA Technology Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

2. Create an xml file with the following data, i used the JMicron Technology Corp. / JMicron USA Technology Corp from above

<hostdev mode='subsystem' type='usb'>
   <source>
      <vendor id='0x152d'/>
      <product id='0x0551'/>
   </source>
</hostdev>

3. Start you virtual machine and then attach your usb device.

virsh start Windows10-VM1
virsh attach-device Windows10-VM1 test.xml
virsh detach-device Windows10-VM1 test.xml

PCI passthrough

Needs PCI passthrough to passthrough entire USB Controller.

Enable IOMMU

First enable IOUMMA in grub.

root@dalesjo-nas:~# nano /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
...

References
How to add kernel boot parameters via GRUB on Linux
How to configure PCI-passthrough on virt-manager

Find the correct device

1. run lsusb to find your device. I wanted USB Controller Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M

root@dalesjo-nas:~# lsusb -t
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
    |__ Port 6: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M

2. Next run lsusb and check the parameter iSerial for Bus 2 port 1

root@dalesjo-nas:~# lsusb -v -s 2:1 | grep iSerial
  iSerial                 1 0000:00:14.0

3. create and hub.xml file

<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x00' slot='0x14' function='0x0'/>
  </source>
</hostdev>

4. Test attachment

virsh attach-device Windows10-VM1 hub-pci.xml
virsh detach-device Windows10-VM1 hub-pci.xml

5. Add to virtual Machine (static)

Run

virsh edit Windows10-VM1

Add the entire hostdev element to the element devices

<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x00' slot='0x14' function='0x0'/>
  </source>
</hostdev>