Single GPU Passthrough

Welcome to my guide on setting up a virtual machine with GPU passthrough with only a single graphics card. This guide was made along side this youtube tutorial here. If you get stuck anywhere along the way please check out this guide here for more information. What are you waiting for? Switch to linux!!

My specs

Amd cpu
Nvidia graphics card

Preparations

Bois Settings

Virtualization is enabled
Iommu is enable
Secure boot is disabled before install

Your os needs to be installed in UEFI mode run the command below to check

[ -d /sys/firmware/efi ] && echo "Installed in UEFI mode" || echo "Installed in Legacy mode"

Edit Boot Options

Normaly you would change the grub for boot options, but popos doesn't use grub. so you need to change the boot optoins with kernalstub

Change boot options

For Amd:

sudo kernelstub -a "amd_iommu=on iommu=pt video=efifb:off"

For Intel

sudo kernelstub -a "intel_iommu=on iommu=pt video=efifb:off"

update with

sudo bootctl update

You can check if this was done correctly by checking the file below

sudo cat /etc/kernelstub/configuration

You should see the new boot options that we placed in there.

Make sure to reboot and check that your system booted with the new options with the command below.

sudo cat /proc/cmdline

Check that iommu is valid

To see if iommu is working run below.

sudo dmesg | grep IOMMU

Now run the command below to check what pci slot your grapics card is in.

lspci

Now you want to check your iommu grouping. Run the script in this repository label check_iommu_group.sh to see the grouping. You want to make sure that it matches with your pci slots. Make sure this executable as well.

MAKE SURE TO CREATE THE SCRIPT!!! run with

sudo ./check_iommu_group.sh

Set Up Libvirt

This command will install virtual machine manger and libvert things

sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager ovmf

Once installed we need to edit the libvirt conf file

sudo nano /etc/libvirt/libvirtd.conf

Next find and uncomment the following lines

unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"

Make sure this is at the end of the file (helps with logs)

log_filters="1:qemu"
log_outputs="1:file:/var/log/libvirt/libvirtd.log"

Give Permissions

Run the following to give your user the proper premissions

sudo usermod -a -G libvirt $(whoami)
sudo systemctl start libvirtd
sudo systemctl enable libvirtd

Check with

sudo groups $(whoami)

Should show that you are in the group

Change The Qemu Conf

Run the following below to edit the qemu file

sudo nano /etc/libvirt/qemu.conf

You want to change the following lines. Replace "your username" with your username

#user = "root" to user = "your username"
#group = "root" to group = "your username"

Now restart libvert

sudo systemctl restart libvirtd

Next we need to add the grouping

sudo usermod -a -G kvm,libvirt $(whoami)
sudo groups $(whoami)

Enabling network

sudo virsh net-autostart default
sudo virsh net-start default

Set Up Virtual Machine

Download virt io drivers https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html

Download windows iso https://www.microsoft.com/en-us/software-download/windows10ISO

Now setup windows and add the vfio drivers. If you need help with this part check out the video listed at the top for a step by step guide.

Libvirt Hooks

Look at these for a guide https://github.com/joeknock90/Single-GPU-Passthrough

check the log files

sudo cat /var/log/libvirt/qemu/win10.log 

Make sure to set up an ssh and vnc

Launch and test! Good luck