Проброс видеокарты в qemu

Гайд морально устарел, так как написан для Ubuntu 16.04 LTS, думаю подойдет для любого дистра.

Мой сетап своеобразный, но выбирал его из-за максимальной беспроблемности разорачивания.

Железо:

Два монитора, либо монитор с двумя HDMI (в принципе пойдет и VGA, у меня HDMI).

Процессор Intel с видеоядром; Для AMD тоже добавил, но не тестировал

Видеокарта AMD.

nvidia тоже подойдет, но нужны небольшие костыли, версия qemu 2.7+ и следовать шагам отсюда https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#%22Error_43:_Driver_failed_to_load%22_on_Nvidia_GPUs_passed_to_Windows_VMs

Две клавиатуры и две мышки, для удобства, потому что по началу будет сложно переключаться между девайсами. Windows 10 для DX12

Установка

Ставим QEMU

Для начала поставить GUI пакет для управления libvirt

apt update && apt install uml-utilities ovmf libvirt-bin virt-manager qemu-kvm bridge-utils

Баним драйверы

Открываем файл vim /etc/modprobe.d/blacklist.conf

Добавляем в самый низ blacklist radeon blacklist amdgpu

Если Вы из зеленого лагеря blacklist nouveau

Правим grub

vim /etc/default/grub

Там есть строчка GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Приводим в вид GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"

Для AMD; но я не тестировал, потому что нет AMD камня GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on"

Обновляем настройки grub, например так update-grub

Определяем pci видеокарту

Для начала выведем список девайсов и ищем нашу видеокарту

for iommu_group in $(find /sys/kernel/iommu_groups/ -maxdepth 1 -mindepth 1 -type d); do echo "IOMMU group $(basename "$iommu_group")"; for device in $(ls -1 "$iommu_group"/devices/); do echo -n $'\t'; lspci -nns "$device"; done; done

Вывод будет большим, нужно найти нашу видеокарту, вот у меня вывод такой 00:01.0 PCI bridge [0604]: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller \ [8086:0c01] (rev 06) 01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Device \ [1002:67df] (rev c7) 01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Device [1002:aaf0]

Нам нужны тут 1002:67df и 1002:aaf0 Их мы и добавляем в конфигурацию vfio echo "options vfio-pci ids=1002:682b,1002:aab0" > /etc/modprobe.d/vfio.conf

Добавим vfio в автозагрузку

Если ядро 4.12 и старше, то правки не нужны.

vim /etc/initramfs-tools/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Обновляем настройки update-initramfs -u

Правим конфиг QEMU vim /etc/libvirt/qemu.conf

Ищем строчку nvram

И приводим в вид nvram = [ "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd" ]

Перезагружаемся

Настройка гостевой системы

Для DX12 нужна Windows 10.

Советую ставить на SSD

Обратите внимание на Cache mode: directsync, поиграйте с разными режимами кеширования, если Вам не подойдет или будут фризы при прогрузке мира, подробно читать.

Когда Вы выставите VirtIO драйвер жесткого диска - винда не установится, потому что ей нужны будут драйверы. Качаем образ образ Подключаем его диском, во время установки мелгомягкого в настройках выставите поиск драйверов с этого диска.

Подключаем видеокарту, обратите внимание у меня подключено два устройства, это видеокарта и звук hdmi

Установка драйверов делайте в Windows 10 госте

Как я уже писал в Первой Части после устаноки на AMD все заведется сразу, что нужно сделать - переключить видеовыход монитора на видеокарту, которая сейчас находится в QEMU, мы получаем полностью рабочую систему. Заходим на сайт AMD, качаем драйверы =)

Твики Для адекватной работы в игрушках нужно привести в вид файл конфигурации QEMU

vim /etc/libvirt/qemu/Games.xml

К такому вот виду

<cpu mode='host-passthrough'>
<topology sockets='1' cores='8' threads='1'/>
<feature policy='disable' name='hypervisor'/>
</cpu>
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
<timer name='hypervclock' present='yes'/>
</clock>

Где sockets - лучше не трогать, NUMA тоже лучше не трогать. А cores это количество физических+виртуальных ядер(HT).

Вот и все! Приятной игры =)