Собственно, в заголовке всё сказано. Для тех, кто не понял — 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 звуковой карте не глючит.
>>> Просмотр (1920x1080, 417 Kb)