IGVT-g: Difference between revisions
imported>Gnidorah No edit summary |
imported>Whazor Add note about GVT-g removal and SR-IOV future |
||
(41 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
Intel GVT-g is a | Intel GVT-g is a technology that allows to "slice" an Intel GPU into virtualized GPUs that can be then passed into virtual machines. | ||
Note that Intel GVT-g only supports Intel Broadwell (5th gen) to Comet Lake (10th gen), where in 10th gen support for IVGT-g was removed. For 11th gen, and 12th gen, there is SR-IOV coming up for virtualized GPUs, but that did not yet arrive in Linux mainline. | |||
== | == Configuring GPU == | ||
First, enable iGVT-g with: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
virtualisation.kvmgt.enable = true; | |||
</nowiki>}} | |||
... then rebuild and reboot. | |||
After rebooting, check if the driver was successfully loaded: | |||
$ ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/ | |||
... if you get <code>No such file or directory</code>, it means you might be using an older CPU that needs an extra configuration option: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
boot.extraModprobeConfig = "options i915 enable_guc=2"; | |||
</nowiki>}} | |||
... then rebuild and reboot once again (unless that previous <code>ls</code> succeeded, in which case you don't have to modify that <code>extraModprobeConfig</code> at all). | |||
Now, using <code>ls</code> you can list which variants your Intel GPU is able to virtualise: | |||
$ ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/ | |||
$ ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/ | i915-GVTg_V5_4/ i915-GVTg_V5_8/ | ||
i915-GVTg_V5_4/ i915-GVTg_V5_8/ | |||
E.g.: | |||
$ cat /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_8/description | |||
low_gm_size: 64MB | |||
high_gm_size: 384MB | |||
fence: 4 | |||
resolution: 1024x768 | |||
weight: 2 | |||
Find some variant that matches your expectations (resolution, memory size etc.), note down its name, generate a random UUID: | |||
$ nix run nixpkgs.libossp_uuid -c uuid | |||
a297db4a-f4c2-11e6-90f6-d3b88d6c9525 | # If you're using Nix Flakes: | ||
$ nix shell nixpkgs#libossp_uuid -c uuid | |||
a297db4a-f4c2-11e6-90f6-d3b88d6c9525 | |||
# If you're not using Nix Flakes: | |||
$ nix run nixpkgs.libossp_uuid -c uuid | |||
a297db4a-f4c2-11e6-90f6-d3b88d6c9525 | |||
... and add that variant's name into your configuration: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
virtualisation.kvmgt.enable = true; | |||
virtualisation.kvmgt.vgpus = { | |||
"i915-GVTg_V5_8" = { | |||
uuid = [ "a297db4a-f4c2-11e6-90f6-d3b88d6c9525" ]; | |||
}; | }; | ||
}; | |||
environment.systemPackages = with pkgs; [ | |||
virtmanager | virtmanager | ||
]; | |||
virtualisation.libvirtd.enable = true; | |||
users.extraUsers.user.extraGroups = [ "libvirtd" ]; | |||
</nowiki>}} | </nowiki>}} | ||
Rebuild & voilá - your virtualized GPU is ready; now you just have to attach it to some virtual machine. | |||
== Attaching GPU == | |||
=== Bare Qemu === | === Bare Qemu === | ||
qemu-system-x86_64 \ | qemu-system-x86_64 \ | ||
-enable-kvm \ | -enable-kvm \ | ||
-m 1G \ | -m 1G \ | ||
-nodefaults \ | -nodefaults \ | ||
-display gtk,gl=on \ | -display gtk,gl=on \ | ||
-device vfio-pci,sysfsdev=/sys/bus/mdev/devices/a297db4a-f4c2-11e6-90f6-d3b88d6c9525,x-igd-opregion=on | -device vfio-pci,sysfsdev=/sys/bus/mdev/devices/'''a297db4a-f4c2-11e6-90f6-d3b88d6c9525''',display=on,x-igd-opregion=on,driver=vfio-pci-nohotplug,ramfb=on,xres=1920,yres=1080 | ||
=== libvirt === | |||
If using virt-manager, create new or open existing VM. Change existing <code><graphics></code> and <code><video></code> sections. | |||
If using virt-manager, create new or open existing VM. | |||
sudo -E virsh edit win10 | sudo -E virsh edit win10 | ||
< | <syntaxHighlight lang="xml" highlight="1,12"> | ||
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> | |||
<devices> | |||
<graphics type='spice'> | |||
<listen type='none'/> | |||
<gl enable='yes'/> | |||
</graphics> | |||
<video> | |||
<model type='none'/> | |||
</video> | |||
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'> | |||
<source> | |||
<address uuid='a297db4a-f4c2-11e6-90f6-d3b88d6c9525'/> | |||
</source> | |||
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> | |||
</hostdev> | |||
</devices> | |||
<qemu:commandline> | <qemu:commandline> | ||
<qemu:arg value='-set'/> | |||
<qemu:arg value='device.hostdev0.x-igd-opregion=on'/> | |||
<qemu:arg value='-set'/> | |||
<qemu:arg value='device.hostdev0.ramfb=on'/> | |||
<qemu:arg value='-set'/> | |||
<qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/> | |||
<qemu:arg value='-set'/> | |||
<qemu:arg value='device.hostdev0.xres=1920'/> | |||
<qemu:arg value='-set'/> | |||
<qemu:arg value='device.hostdev0.yres=1080'/> | |||
<qemu:env name="MESA_LOADER_DRIVER_OVERRIDE" value="i965"/> | |||
</qemu:commandline> | </qemu:commandline> | ||
</domain> | |||
</ | </syntaxHighlight> | ||
== FAQ == | == FAQ == | ||
Line 95: | Line 122: | ||
* No video output | * No video output | ||
** use BIOS (SeaBIOS) machine, EFI (OVMF) is not supported. You may use the following workarounds https://wiki.archlinux.org/index.php/Intel_GVT-g#Using_DMA-BUF_with_UEFI/OVMF | |||
** ensure that the recent Intel graphics driver is installed in the guest | |||
ensure that the recent Intel graphics driver is installed in the guest | |||
* (libvirtd) "Element domain has extra content: qemu:commandline" error after editing via virsh | * (libvirtd) "Element domain has extra content: qemu:commandline" error after editing via virsh | ||
you forgot to add <nowiki>xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'</nowiki> | ** you forgot to add <nowiki>xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'</nowiki> | ||
* (libvirtd) "no drm render node available" error in virt-manager | * (libvirtd) "no drm render node available" error in virt-manager | ||
in virt-manager change SPICE display render node from auto to available one | ** in virt-manager change SPICE display render node from auto to available one | ||
* "write_loop: No space left on device" error when creating mdev device | * "write_loop: No space left on device" error when creating mdev device | ||
check dmesg output for gvt related error, most likely there is not enough VRAM | ** check whether available instances are left | ||
$ cat /sys/bus/pci/devices/0000\:00\:02.0/mdev_supported_types/i915-GVTg_V5_4/available_instances | |||
1 | |||
also check dmesg output for gvt related error, most likely there is not enough VRAM | |||
* (libvirtd) VM stops immediately with no error other than "internal error: process exited while connecting to monitor" | |||
* | ** qemu might be exiting due to SIGSYS, which may be related to this bug: https://github.com/intel/gvt-linux/issues/47 | ||
Try disabling seccomp sandboxing in qemu like so: | |||
<syntaxHighlight lang="nix"> | |||
virtualisation.libvirtd = { | |||
qemuVerbatimConfig = '' | |||
seccomp_sandbox = 0 | |||
''; | |||
}; | |||
</syntaxHighlight> | |||
== Useful sources == | |||
* https://www.kraxel.org/blog/2019/02/ramfb-display-in-qemu/ - Info about ramfb parameter | |||
* https://lists.01.org/hyperkitty/list/igvt-g@lists.01.org/thread/LAB74CANVVRKGPBJMHULMMUFX43LRH55/ - Info about x-igd-opregion parameter | |||
* https://www.kraxel.org/blog/2019/03/edid-support-for-qemu/ - Info about xres and yres parameters | |||
[[Category:Video]] | [[Category:Video]] | ||
[[Category:Virtualization]] | [[Category:Virtualization]] |