Проброс видеокарты в убунту | GPU Passthrough Ubuntu 16.04
Гайд морально устарел, так как написан для Ubuntu 16.04 LTS, думаю подойдёт для любого дистра.
Мой сетап своеобразный, но выбирал его из-за максимальной беспроблемности разворачивания.
Железо
- Два монитора, либо монитор с двумя HDMI (в принципе пойдёт и VGA, у меня HDMI).
- Процессор Intel с видеоядром; для AMD тоже добавил, но не тестировал.
- Видеокарта AMD. Nvidia тоже подойдёт, но нужны небольшие костыли, версия qemu 2.7+ и следовать шагам отсюда: PCI passthrough via OVMF
- Две клавиатуры и две мышки, для удобства, потому что по началу будет сложно переключаться между девайсами.
- 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 драйвер жёсткого диска - винда не установится, потому что ей нужны будут драйверы. Качаем образ драйверов. Подключаем его диском, во время установки Windows в настройках выставите поиск драйверов с этого диска.

Подключаем видеокарту, обратите внимание - у меня подключено два устройства, это видеокарта и звук 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).
Вот и всё! Приятной игры =)