· 4 мин. чтения

Проброс видеокарты в убунту | 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.

VirtIO drivers

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

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

VirtIO install

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

GPU passthrough

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

AMD drivers

Твики

Для адекватной работы в игрушках нужно привести в вид файл конфигурации 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).

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