PCI passthrough is the process of attaching a PCI-E device directly to a VM;
CPU support (namely VT-D for Intel and AMD-V for AMD) and motherboard support
(IOMMU) are required for PCI passthrough to work properly.
Hardware configuration used:
AMD Ryzen 1700x Gigabyte X370 K7 Nvidia Geforce GTX260 32 GiB of RAM and a few HDDs Fedora 29 as host OS
The system only has a single graphic card because it is normally used as
headless compute server for which a GPU is not really required; the graphic
card is also very very old Nvidia Geforce GTX260 with a standard non UEFI BIOS.
If using an UEFI enabled graphic card it is probably required to install the OS in UEFI mode using a virtual UEFI BIOS.
This guide assumes you already have a working Windows virtual machine and are familiar with libvirt.
First of all, edit GRUB to enable IOMMU and blacklist nouveau kernel module so that the graphic card is not picked up anymore by the host:
$ vi /etc/default/grub2 --- GRUB_CMDLINE_LINUX=". . . amd_iommu=on modprobe.blacklist=nouveau video=vesafb:off,efifb:off . . ." $ grub2-mkconfig -o /boot/grub2/grub.cfg
Find out what your graphic card ID is (you might want to replace nvidia with amd if appropriate):
# lspci -nn | grep -i nvidia 07:00.0 VGA compatible controller : NVIDIA Corporation GT200 [GeForce GTX 260] [10de:05e2] (rev a1)
In my case
10de:05e2 is the ID of the graphic card, bind it to vfio module:
vi /etc/modprobe.d/vfio.conf --- options vfio-pci ids=10de:05e2
Before rebooting the machine be sure to have
openssh running on the system.
After the reboot ssh into the server and edit the virtual machine config:
virsh edit <virtual_machine_name> --- <features> . . . <hyperv> <vendor_id state='on' value='0123456789ab'/> </hyperv> <kvm> <hidden state='on'/> </kvm> . . . </features>
The lines above are required to trick nvidia drivers into thinking that they
are running on bare metal, without it they refuse to work.
At this point the only thing left to do is add the PCI device to the virtual machine in
Don’t forget to also passthrough a mouse and a keyboard and also remove any other spice and virtual video card from the VM configuration.
Reboot the host system and start the vm using virt manager or
$ sudo reboot . . . $ virsh start <virtual_machine_name>