29.06.2022

Intel GVT-g: Ubuntu 20.04.4 в гостях у AlmaLinux 8.5

Собственно, в заголовке всё сказано. Для тех, кто не понял — Intel GVT-g это технология, что позволяет отдавать часть ресурсов встроенной видеокарты в виртуальную машину так, чтобы вся графика внутри ВМ считалась напрямую на GPU хоста. Аналог аппаратного ускорения виртуализации, что применяется для CPU уже давно. Да, это здорово улучшает производительность графики в виртуальных машинах, хотя лично я и не замерял разницу с QXL (стандартная виртуальная видеокарта в Qemu).

Эта технология появилась в Linux уже достаточно давно, но до сих пор требует кучу манипуляций руками, чтобы её завести. Я заводил через связку libvirtd+qemu-kvm, что является типичным решением для RHEL-based дистрибутивов, который у меня и стоит. Сразу скажу, что мой способ не единственный, и даже в рамках той же связки можно и иначе настроить. Но расскажу, как сделал я (если честно, это просто первый способ, что у меня сработал, я и другие пробовал):

  • Для начала, поставил все пакеты для виртуализации и включил libvirtd:
yum groupinstall "Virtualization Platform" "Virtualization Hypervisor" "Virtualization Client" "Virtualization Host"
systemctl enable --now libvirtd
  • Добавил своего пользователя в нужные группы: usermod -aG libvirt,kvm vsevolod

  • Этот шаг опционален, и сделал я его под конец, но имеет смысл включить Nested Virtualisation (позволяет запускать ВМ внутри ВМ с ускорением):

[vsevolod@localhost ~]$ grep -v '^#' /etc/modprobe.d/kvm.conf
options kvm_intel nested=1
  • Включил саму технологию Intel GVT-g, я делал это по этому мануалу: https://blog.tmm.cx/2020/05/15/passing-an-intel-gpu-to-a-linux-kvm-virtual-machine/ — сразу оговорюсь, что я делал далеко не всё, как там написано, и помимо этого ещё и на ArchWiki ориентировался. Но именно включил, как там и сказано:
[vsevolod@localhost ~]$ grep -v '^#' /etc/default/grub | grep GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX="crashkernel=auto i915.enable_gvt=1 i915.enable_fbc=0"
[vsevolod@localhost ~]$ cat /etc/modules-load.d/kvm-gvt-g.conf
kvmgt
vfio-iommu-type1
vfio-mdev
  • После включения я настроил так, чтобы виртуальная видеокарта появлялась при загрузке автоматически:
[vsevolod@localhost ~]$ cat /etc/systemd/system/add-gvt-g-device.service [Unit]
Description=Add Intel GVT-g virtual GPU on boot [Service]
ExecStart=/usr/local/bin/add-gvt-g.sh
Type=oneshot [Install]
WantedBy=graphical.target
After=graphical.target
[vsevolod@localhost ~]$ cat /usr/local/bin/add-gvt-g.sh
#!/bin/bash
echo 'a3356d9c-35e6-4f1a-aac9-b075e5cb5d1c' > /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V4_4/create
exit
  • А вот самое интерсное — настройку виртуальной машины так, чтобы она использовала GVT-g, я уже проводил в основном по ArchWiki: https://wiki.archlinux.org/title/Intel_GVT-g , там много методов это сделать, я выбрал тот, что у меня сработал и был мне достаточен. Возможно, другие из неиспробованых тоже бы сработали, пока не проверял.

  • Честно говоря, я до сих пор делаю setenforce 0 перед запуском ВМ, так как я пока не разобрался с настройкой SELinux, и он при запуске ВМ с GVT-g страшно ругается.

  • И метод, что я выбрал, имеет особенность — экран у ВМ становится доступен только после старта самого Linux, GRUB2 в принципе не виден, как я понял. Поэтому приходится сначала просто делать ВМ, потом уже ставить в обычную ВМ Linux, а уже потом перенастраивать ВМ на GVT-g.

  • Ну установка довольно банальна, я делал всё через Virtual Machine Manager: скачал в /var/lib/libvirt/images/ .iso нужного Linux, потом создал ему там диск qemu-img create -f qcow2 ubuntu2004.qcow2 128G (в этой версии virt-manager вместо динамических статические диски делает, вроде баг такой), после чего поставил и настроил ОС — ничего особенного, чтобы было что рассказывать.

  • Уже после установки выключил ВМ и переделал её на использование GVT-g, сначала забекапил конфиг virsh dumpxml Ubuntu > Ubuntu-backup.xml, после чего открыл на редактирование через virsh edit Ubuntu, и там вот что сделал:

  • Заменил первую строку конфига <domain type='kvm'> на <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

  • Удалил все устройства <graphics> и <video>, после чего добавил нужные мне:

 <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'> <source> <address uuid='a3356d9c-35e6-4f1a-aac9-b075e5cb5d1c'/> </source> </hostdev> <graphics type='spice'> <listen type='none'/> <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/> </graphics> <video> <model type='none'/> </video>
  • После сохранения конфига и старта ВМ всё работает, более ничего настраивать не нужно.

P. S.: X11 на хосте потому, что ещё я VirtualBox использую, а он с Wayland не дружит; а ядро у гостя lowlatency потому, что так звук на проброшенной USB звуковой карте не глючит.

>>> Просмотр (1920×1080, 417 Kb)

Источник.