At one point I had KVM with GPU passthrough running in Arch Linux. I have since moved away from it back to ProxMox. Here are my notes I jotted down when I did this in Arch. Sorry these are just rough notes, I didn’t end up using Arch for long enough to turn this into a polished article.
pacman -Sy qemu netctl ovmf virt-manager
When creating VM, make sure chipset is Q35
CPU model host-passthrough (write it in)
Create VirtIO SCSI controller and attach drives to it
NIC device model: virtio
—- networking —-
Create bridge:
https://wiki.archlinux.org/index.php/Bridge_with_netctl
Copy /etc/netctl/examples/bridge
to /etc/netctl/bridge
/etc/netctl/bridge
Description="Example Bridge connection" Interface=br0 Connection=bridge BindsToInterfaces=(enp4s0) IP=dhcp #Optional - give your system another IP for host-only networking ExecUpPost="ip addr add 192.168.2.1/24 dev br0"
sudo netctl reenable bridge sudo netctl restart bridge
In the VM add another network interface, also assign to br0. Manually specify IP in guest VM to match subnet specified above in ExecUpPost
https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
Allow UEFI bios: https://wiki.archlinux.org/index.php/libvirt#UEFI_Support
sudo vim /etc/libvirt/qemu.conf
/etc/libvirt/qemu.conf
nvram = [ "/usr/share/ovmf/x64/OVMF_CODE.fd:/usr/share/ovmf/x64/OVMF_VARS.fd" ] sudo systemctl restart libvirtd
Edit VM hardware:
CLI: sudo virsh edit <vm name>
GUI: double click on VM, then click second icon fnom the left (little i bubble) Add GPU this way
Nvidia GPU: need to do x otherwise code 43
<features> <hyperv> ... <vendor_id state='on' value='whatever'/> ... </hyperv> ... <kvm> <hidden state='on'/> </kvm> </features>
Hot add CD:
sudo virsh attach-disk <VM_NAME> <ISO LOCATION> hdb –type cdrom
Add second NIC: https://jamielinux.com/docs/libvirt-networking-handbook/bridged-network.html
sudo virsh edit win10
<interface type="bridge"> <source bridge="br1"/> </interface>
CPU configuration
Current Allocation 16
Topology / manually set CPU topology
1 socket, 16 cores, 1 thread
<cputune>
<vcpupin vcpu=’0′ cpuset=’16’/>
<vcpupin vcpu=’1′ cpuset=’17’/>
<vcpupin vcpu=’2′ cpuset=’18’/>
<vcpupin vcpu=’3′ cpuset=’19’/>
<vcpupin vcpu=’4′ cpuset=’20’/>
<vcpupin vcpu=’5′ cpuset=’21’/>
<vcpupin vcpu=’6′ cpuset=’22’/>
<vcpupin vcpu=’7′ cpuset=’23’/>
<vcpupin vcpu=’8′ cpuset=’24’/>
<vcpupin vcpu=’9′ cpuset=’25’/>
<vcpupin vcpu=’10’ cpuset=’26’/>
<vcpupin vcpu=’11’ cpuset=’27’/>
<vcpupin vcpu=’12’ cpuset=’28’/>
<vcpupin vcpu=’13’ cpuset=’29’/>
<vcpupin vcpu=’14’ cpuset=’30’/>
<vcpupin vcpu=’15’ cpuset=’31’/>
</cputune>
--machine q35 \ --host-device 4b:00.0 --host-device 4b:00.1 \
https://medium.com/@calerogers/gpu-virtualization-with-kvm-qemu-63ca98a6a172
add usb ports. Doesn’t work if nothing’s in the port?
virsh edit win10
<hostdev mode=’subsystem’ type=’usb’ managed=’yes’>
<source>
<address bus=’3′ device=’2’/>
</source>
<address type=’usb’ bus=’0′ port=’2’/>
</hostdev>
Remove Tablet input device to get 4th USB passthrough option
Troubleshooting
internal error: Unknown PCI header type '127'
https://forum.level1techs.com/t/trouble-passing-though-an-rx-580-to-an-ubuntu-desktop-vm/123376/3
Threadripper PCI Reset bug: https://www.reddit.com/r/Amd/comments/7gp1z7/threadripper_kvm_gpu_passthru_testers_needed/
Error 43:
<features> <hyperv> ... <vendor_id state='on' value='whatever'/> ... </hyperv> ... <kvm> <hidden state='on'/> </kvm> </features>
Audio cuts out whenever microphone is used
I had a very odd issue where all sound disappeared in my Windows VM if the microphone was used. Even simply opening up audio properties and going to the Recording tab triggered this issue. Disabling / re-enabled Special Effects for the playback device brought it back until the microphone was accessed again.
I’m using USB sound card passed through to the VM for audio. It stems from the VM’s USB controller. When I had it set to USB3 the issue would occur. When set to USB2 the issue went away. Bizarre.
One thought on “Gaming VM with graphics passthrough in Arch Linux”