Рассмотрим, как пробросить графический адаптер Nvidia GeForce в виртуальную машину Windows 10 с хоста KVM (на базе Linux CentOS 8).
В BIOS хоста KVM должна быть включена поддержка IOMMU. Проверьте, что в /etc/default/grub включена поддержка IOMMU. Если нет, добавьте в файл строку:
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on"
И обновите конфигурацию:
# grub2-mkconfig -o /boot/grub2/grub.cfg
Отключите драйвер nouveau, который может вызвать проблемы с привязкой vfio-pci к видеокарте.
# grubby --update-kernel=ALL --args="rd.driver.blacklist=nouveau nouveau.modeset=0"
# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# dracut /boot/initramfs-$(uname -r).img $(uname -r)
# echo 'blacklist nouveau' > /etc/modprobe.d/nouveau-blacklist.conf
Выведите список доступных видеокарт на хосте KVM:
# lspci -nn | grep -i nvidia
Каждая видеокарта состоит из нескольких компонентов. Например:
82:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti Rev. A] [10de:1e07] (rev a1) 82:00.1 Audio device [0403]: NVIDIA Corporation TU102 High Definition Audio Controller [10de:10f7] (rev a1) 82:00.2 USB controller [0c03]: NVIDIA Corporation TU102 USB 3.1 Host Controller [10de:1ad6] (rev a1) 82:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU102 USB Type-C UCSI Controller [10de:1ad7] (rev a1)
Скопируйте VID:PID устройств, которые нужно пробросить в ВМ.
Создайте файл /etc/modprobe.d/vfio.conf и добавьте в него строку со списком, доступных для vfio-pci (список в одной строке):
options vfio-pci ids=10de:1e07, 10de:10f7, 10de:1ad6, 10de:1ad7
Выполните команду:
# echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf
И перезагрузите KVM хост.
Проверьте, что графические карты доступны в режиме vfio:
# lspci -vs 81:00.0
В выводе должны присутствовать строки:
Kernel driver in use: vfio-pci Kernel modules: nouveau
В моем примере я создал на хосте KVM чистую ВМ (с UEFI firmware) с Windows 10 и выключил ее. Теперь нужно отредактировать конфигурационный XML файл виртуальной машины KVM.
Внутри тегов <hyperv></hyperv> добавьте:
<vendor_id state='on' value='111111111'/>
Внутри тегов <features></feature>:
<kvm> <hidden state='on'/> </kvm>
И в конце конфигурационного файла перед тегами </devices> </domain> добавьте следующую конфигурацию:
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0' bus='0x82' slot='0x0' function='0x0'/> </source> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0' bus='0x82' slot='0x0' function='0x1'/> </source> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0' bus='0x82' slot='0x0' function='0x2'/> </source> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0' bus='0x82' slot='0x0' function='0x3'/> </source> </hostdev>
В этом примере мы хотим пробросить в ВМ устройства все устройства с видеокарты 82:00. На ней доступны 4 функции, мы добавили их все в XML файл:
- VGA controller (82:00.0)
- Audio device (82:00.1)
- USB 3.1 Host Controller3.1 (82:00.2)
- USB Type-C UCSI Controller (82:00.3)
Сохраните XML файл и запустите ВМ. Windows должна определить новое графическое устройство и вы можете установить драйвера Nvidia.