Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

***GUIDE*** Passthrough Entire PCI USB Controller

Featured Replies

  • Author

 

Win10 x64, I am just copying over a win 7 iso to try but would rather stick with 10 as I upgraded my install key!

 

Hmm yeah either should work just fine... So it boots up just fine without error but doesn't find the USB controller, correct? Does the device manager show an unknown device? Maybe check your mobo website for drivers? Other than that I don't have a clue [emoji58]

 

  • Replies 509
  • Views 447.6k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • Baltostar
    Baltostar

    I automated steps 1-9 of this guide.   The output shows USB bus #, PCI Address, and IOMMU group #   Bus 1 PCI 0000:00:1a.0 IOMMU 20     Intel Corp.     Linux Foundation 2.0 root hub Bus 2

  • I believe users with this specific card (Startech PEXUSB3S44V) have no issues passing them to the machine, but have issues once passed to the machine inside the VM. Mine throws a Code 10 error on the

  • Not if you use the xen-pciback.hide= method. You use the PCI number instead of id. So yours will look like below for the last two.  xen-pciback.hide=(0d:00.3)(43:00.3)    

Posted Images

nothing extra appears in device manager needing drivers. I am stumped really, am I missing something with the XML passthrough?

 

what is the difference between bus=pcie.0 and bus=root.1 ?? why would the usb be root and not a pcie number? or am I just making things up now as I have tried everything else??

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

Depends on what the error message says? Can you post a screen shot?

 

See the scree capture:

Capture.JPG.8902845017fc0c4baf431ec8fc55d22f.JPG

  • Author

 

nothing extra appears in device manager needing drivers. I am stumped really, am I missing something with the XML passthrough?

 

what is the difference between bus=pcie.0 and bus=root.1 ?? why would the usb be root and not a pcie number? or am I just making things up now as I have tried everything else??

 

I would try making a fresh XML of Windows with unraids VM creator and then only modify the lines necessary for USB passthrough. You will have to view your VM though VNC for the moment but try getting just that working first.

  • Author

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

Depends on what the error message says? Can you post a screen shot?

 

See the scree capture:

 

Please post your entire XML as well.

Its on page 6 at the bottom.

 

 

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

Depends on what the error message says? Can you post a screen shot?

 

See the scree capture:

 

Please post your entire XML as well.

  • Author

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

I am wanting to see the XML with the above code entered so I can see if I can spot the issue. Your post on line 6 doesn't have the added code.

ok done that, fresh build.

 

The only thing now in my xml is + using vnc

<qemu:commandline>

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=09:00.0,bus=root.1,addr=00.1'/>

  </qemu:commandline>

 

Still getting the same, no usb devices work :-(

 

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

I am wanting to see the XML with the above code entered so I can see if I can spot the issue. Your post on line 6 doesn't have the added code.

 

 

Sorry, I was hoping the one on page 6 was current enough because I was installing Ubuntu.

 

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>Test 8</name>
  <uuid>738883d4-0137-3e4e-7bc9-8da467c306eb</uuid>
  <description>test 8</description>
  <metadata>
    <vmtemplate name="Custom" icon="windows.png" os="windows"/>
  </metadata>
  <memory unit='KiB'>10485760</memory>
  <currentMemory unit='KiB'>10485760</currentMemory>
  <memoryBacking>
    <nosharepages/>
    <locked/>
  </memoryBacking>
  <vcpu placement='static'>6</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='2'/>
    <vcpupin vcpu='1' cpuset='3'/>
    <vcpupin vcpu='2' cpuset='4'/>
    <vcpupin vcpu='3' cpuset='5'/>
    <vcpupin vcpu='4' cpuset='6'/>
    <vcpupin vcpu='5' cpuset='7'/>
  </cputune>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.3'>hvm</type>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough'>
    <topology sockets='1' cores='6' threads='1'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/mnt/cache/appdata/ISO share/Test 3/Secondary.img'/>
      <target dev='hdc' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/mnt/cache/appdata/ISO share/Windows 10 Pro/Win10.PRO.img'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <boot order='2'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/mnt/cache/appdata/ISO share/virtio-win-0.1.102.iso'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:1a:34:b4'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/Test 3.org.qemu.guest_agent.0'/>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' websocket='-1' listen='0.0.0.0' keymap='en-us'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='vmvga' vram='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </hostdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-device'/>
    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>
  </qemu:commandline>
</domain>

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

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

 

You then have to modify some parts of it to get it to work. The good thing is that you do not have to care about which bus and address it's supposed to have in the VM. You only need to find out the host PCI address.

The part you change is bus, slot and function. In your case it's 00:14.0.

Let's brake it down.

00 is the bus. You simply exchange the two numbers after the 0x.

14 is the slot. Same method as above.

0 is the function. Her it's also the same method as above.

So in your case the full device tag would be like this:

 

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

 

After you start the VM you will see that there are some lines added to the tag, but those you don't have to care about. They get created automatically. If you copy a host device tag to pass through a new device, be sure to remove the two lines created after the

</source>

tag, as they are specific to that VM.

 

      <alias name='hostdev2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

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

 

You then have to modify some parts of it to get it to work. The good thing is that you do not have to care about which bus and address it's supposed to have in the VM. You only need to find out the host PCI address.

The part you change is bus, slot and function. In your case it's 00:14.0.

Let's brake it down.

00 is the bus. You simply exchange the two numbers after the 0x.

14 is the slot. Same method as above.

0 is the function. Her it's also the same method as above.

So in your case the full device tag would be like this:

 

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

 

After you start the VM you will see that there are some lines added to the tag, but those you don't have to care about. They get created automatically. If you copy a host device tag to pass through a new device, be sure to remove the two lines created after the

</source>

tag, as they are specific to that VM.

 

      <alias name='hostdev2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>

 

Thanks saarg I'll set up another VM and give it a go while pursuing closure on Test VM 8.

saarg,

 

That work like a charm. I have to let windows do a repair and win it was done every thing was there.

 

Thanks for your support too archedraft

 

Best Regards

 

for trying that passthrough method, what should i do with my gfx card passthrough?

for trying that passthrough method, what should i do with my gfx card passthrough?

If you have a working VM with gfx pass through, you add the usb controller the same way as I described a few posts above. No need to remove any qemu:arg.

ahh cool that's what I tried and annoyingly no usb devices found on the VM when I boot it up. I think I am destined to fail at this :-(

 

edit!

I can confirm that this works on my usb2 controller but not on the USB 3 one!

 

If I run unRAID from the USB 3 controller the pen drive gets so hot that it crashes/corrupts the system!!

 

Any ideas/ ways round this? I have 3 sets of USB ports, one set on the front of my case (usb2) , one set on the back that's USB3, and another set of USB2 on the back.

 

I really want the unRaid on the front so that I don't have dangling cables everywhere

scratch previous comment, it does work with my usb 3 controller! slightly excited now!! Just need to work out why the device cant start now... probably a driver update/issue will post when I have mucked about with the VM some more... I love you guys thanks for the help :-)

  • Author

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

I added this to the end of the guide, I know it is else where but I think it should be handy anyways. Thanks.

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

I added this to the end of the guide, I know it is else where but I think it should be handy anyways. Thanks.

Good choice :)

I just read what you added and it says

Forget passing through an entire controller and just use Hostdev

That's not true :) You are still passing through an entire controller, but only the way to do it is different.

Can someone explain what the difference is between qemu passthrough and hostdev please?  I'm not entirely clear on the use cases for each...

Can someone explain what the difference is between qemu passthrough and hostdev please?  I'm not entirely clear on the use cases for each...

I just edited my post :)

It's the same. The hostdev way is used in the XML and qemu:arg is not a part of the XML. Did that confuse you more maybe?  ::)

Can someone explain what the difference is between qemu passthrough and hostdev please?  I'm not entirely clear on the use cases for each...

I just edited my post :)

It's the same. The hostdev way is used in the XML and qemu:arg is not a part of the XML. Did that confuse you more maybe?  ::)

 

No, I've wondered why there are two separate ways to do things, but never given it too much thought.  So basically they're like two routes to the same destination...

 

No advantages or disadvantages either way?  No reason to choose one over the other?

  • Author

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

I added this to the end of the guide, I know it is else where but I think it should be handy anyways. Thanks.

Good choice :)

I just read what you added and it says

Forget passing through an entire controller and just use Hostdev

That's not true :) You are still passing through an entire controller, but only the way to do it is different.

 

Oops good catch, I was editing the whole first page at a million miles a minute and sort of word vomitted that.

  • Author

So then I suppose even with hostdev you will still have to go through the entire first process of finding out which controller you want?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.