IGVT-g: Difference between revisions

From NixOS Wiki
imported>User
adjust bare qemu instruction to recent changes
imported>User
EDID support is landed
Line 32: Line 32:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  boot.kernelPackages = pkgs.linuxPackages_5_2;
   virtualisation.kvmgt.enable = true;  
   virtualisation.kvmgt.enable = true;  
   virtualisation.kvmgt.vgpus = {
   virtualisation.kvmgt.vgpus = {
Line 55: Line 56:
     -nodefaults \
     -nodefaults \
     -display gtk,gl=on \
     -display gtk,gl=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
     -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


=== libvirtd ===
=== libvirtd ===
Line 86: Line 87:
     <qemu:arg value='-set'/>
     <qemu:arg value='-set'/>
     <qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/>
     <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:commandline>
   </qemu:commandline>
</domain>
</domain>
Line 113: Line 118:
   1
   1
also check dmesg output for gvt related error, most likely there is not enough VRAM
also check dmesg output for gvt related error, most likely there is not enough VRAM
* There is no VGPU device that has resolution of my screen
** Use this program in guest https://www.monitortests.com/forum/Thread-Custom-Resolution-Utility-CRU to set resolution you need


* (libvirtd) VM stops immediately with no error other than "internal error: process exited while connecting to monitor"
* (libvirtd) VM stops immediately with no error other than "internal error: process exited while connecting to monitor"
Line 131: Line 132:
== Useful sources ==
== Useful sources ==


* [https://www.kraxel.org/blog/2018/04/vgpu-display-support-finally-merged-upstream/ <em>vgpu display support</em> on a contributor (kraxel)'s blog] - this guide misses info that Windows guest requires x-igd-opregion=on parameter
* https://github.com/intel/gvt-linux/wiki/GVTg_Setup_Guide - obsoleted guide, but some parts are useful
* https://github.com/intel/gvt-linux/wiki/Dma_Buf_User_Guide - obsoleted guide, but some parts are useful
* https://blog.bepbep.co/posts/gvt/ - How to get 60fps!
* https://blog.bepbep.co/posts/gvt/ - How to get 60fps!
* https://www.kraxel.org/blog/2019/02/ramfb-display-in-qemu/ - Info about ramfb parameter
* https://www.kraxel.org/blog/2019/02/ramfb-display-in-qemu/ - Info about ramfb parameter
[[Category:Video]]
[[Category:Video]]
[[Category:Virtualization]]
[[Category:Virtualization]]

Revision as of 16:53, 14 October 2019

Intel GVT-g is a full GPU virtualization solution with mediated pass-through which allows host and multiple guests to share same Intel integrated videocard. Guest gets a near-native graphics peformance.

Win7-32 / Win7-64 / Win8.1-64 /Win10-RS1-64 are validated.

Hardware Requirements

For client platforms, 5th, 6th or 7th Generation Intel® Core Processor Graphics is required. For server platforms, E3_v4, E3_v5 or E3_v6 Xeon Processor Graphics is required.

Select VGPU devices

Enable iGVT-g with

/etc/nixos/configuration.nix
  virtualisation.kvmgt.enable = true;

then rebuild and reboot. Choose virtual GPU

 $ ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
 i915-GVTg_V5_4/  i915-GVTg_V5_8/
 $ 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

Generate UUID

 $ nix run nixpkgs.libossp_uuid -c uuid
 a297db4a-f4c2-11e6-90f6-d3b88d6c9525

NixOS configuration

/etc/nixos/configuration.nix
  boot.kernelPackages = pkgs.linuxPackages_5_2;
  virtualisation.kvmgt.enable = true; 
  virtualisation.kvmgt.vgpus = {
    "i915-GVTg_V5_8" = {
      uuid = "a297db4a-f4c2-11e6-90f6-d3b88d6c9525";
    };
  };
  environment.systemPackages = with pkgs; [
  virtmanager
  virt-viewer
  ];
  virtualisation.libvirtd.enable = true;
  users.extraUsers.user.extraGroups = [ "libvirtd" ];

Configure KVM

Bare Qemu

 qemu-system-x86_64 \
    -enable-kvm \
    -m 1G \
    -nodefaults \
    -display gtk,gl=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

libvirtd

If using virt-manager, create new or open existing VM. Change existing <graphics> and <video> sections.

sudo -E virsh edit win10

<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: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:commandline>
</domain>

Finally use sudo virt-viewer --attach win10

FAQ

  • No video output
    • 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
    • you forgot to add xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'
  • (libvirtd) "no drm render node available" error in virt-manager
    • 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
    • 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"

Try disabling seccomp sandboxing in qemu like so:

  virtualisation.libvirtd = {
    qemuVerbatimConfig = ''
      seccomp_sandbox = 0
    '';
  };

Useful sources