IGVT-g

From NixOS Wiki
Revision as of 05:58, 24 March 2019 by imported>User

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
  boot.kernelPackages = pkgs.linuxPackages_4_19;
  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_4_19;
  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 \
     -M graphics=off \
     -serial stdio \
     -display gtk,gl=on \
     -device vfio-pci,sysfsdev=/sys/bus/mdev/devices/a297db4a-f4c2-11e6-90f6-d3b88d6c9525,display=on,x-igd-opregion=on

libvirtd

If using virt-manager, create new or open existing VM.

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>
 <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
  <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.display=on'/>
  </qemu:commandline>
 </domain>

Finally use sudo virt-viewer --attach win10

FAQ

  • No video output

Possible solutions

(libvirtd) Change main adapter type from QXL to say Cirrus

(libvirtd) Connect via `virt-viewer --attach` to see igvt-g display, virt-manager console will not show it

use BIOS (SeaBIOS) machine, UEFI (OVMF) is not supported https://bugzilla.tianocore.org/show_bug.cgi?id=935 As a workaround you may create qcow boot image that is capable of booting UEFI disk with windows on BIOS machine http://winitpro.ru/index.php/2014/03/11/zagruzka-windows-7-s-gpt-na-bios-bez-uefi-2/#h2_5

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

  • There is no VGPU device that has resolution of my screen

Choose device that has higher resolution than yours than use this program in guest https://www.monitortests.com/forum/Thread-Custom-Resolution-Utility-CRU to set resolution you need

  • 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:

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

Used sources