Integrierte Intel GPU an LXC weitergeben

Auf dem Host System ausführen: apt install vainfo
In die Konfig des LXC Containers einfügen:

lxc.cgroup.devices.allow = c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

Im Betriebssystem des LXC Containers den zu verwendenden User zur Video Gruppe hinzufügen: usermod -aG video emby

Integrierte Intel GPU an KVM weitergeben
In der Datei /etc/default/grub die Zeile GRUB_CMDLINE_LINUX_DEFAULT um folgendes ergänzen: i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on
Danach grub und initramfs updaten:

update-grub
update-initramfs -u

Nach einem Reboot kann mit dmesg | grep -e DMAR -e IOMMU überprüft werden ob alles ok ist. Sollte nichts ausgegeben werden stimmt etwas nicht. Hier ein Beispiel wie es aussehen kann:

[    0.000000] ACPI: DMAR 0x000000007A71B5D0 0000A8 (v01 INTEL  NUC7i5BN 0000003F INTL 00000001)
[    0.000000] DMAR: IOMMU enabled
[    0.004000] DMAR: Host address width 39
[    0.004000] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.004000] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e
[    0.004000] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.004000] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da
[    0.004000] DMAR: RMRR base: 0x0000007a65b000 end: 0x0000007a67afff
[    0.004000] DMAR: RMRR base: 0x0000007b800000 end: 0x0000007fffffff
[    0.004000] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.004000] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.004000] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.004000] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.839908] DMAR: No ATSR found
[    0.839937] DMAR: dmar0: Using Queued invalidation
[    0.840130] DMAR: dmar1: Using Queued invalidation
[    0.840299] DMAR: Setting RMRR:
[    0.840386] DMAR: Setting identity map for device 0000:00:02.0 [0x7b800000 - 0x7fffffff]
[    0.840422] DMAR: Setting identity map for device 0000:00:14.0 [0x7a65b000 - 0x7a67afff]
[    0.840429] DMAR: Prepare 0-16MiB unity mapping for LPC
[    0.840455] DMAR: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
[    0.840640] DMAR: Intel(R) Virtualization Technology for Directed I/O

Überprüfen ob vGPU von der CPU unterstützt wird mit ll /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
Eine typische Ausgabe wäre:

drwxr-xr-x  3 root root 0 Jun 21 20:47 i915-GVTg_V5_2
drwxr-xr-x  3 root root 0 Jun 21 20:47 i915-GVTg_V5_4
drwxr-xr-x  3 root root 0 Jun 21 20:47 i915-GVTg_V5_8

Sollte hier nichts aufgelistet sein muss eventuell das Modul kvmgt noch geladen werden. Manuell per modprobe kvmgt. Damit das beim booten automatisch passiert in der /etc/modules einfach kvmgt mit eintragen.

Je nach Aperature Size (im Bios einstellen) können 1 bis 4 vGPU's erstellt werden.
Eine UUID generieren (uuidgen) und dann die vGPU erstellen:

echo "b3dfe34f-0fdf-4321-8d03-42c4267ab5e1" > "/sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"

Möchte man das dies bei einem Reboot automatisch passiert kann ein systemd Service angelegt werden. Folgende Datei erstellen /etc/systemd/system/gvtvgpu0.service
Mit dem Inhalt:

[Unit]
Description=Create Intel GVT-g vGPU0

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo 'b3dfe34f-0fdf-4321-8d03-42c4267ab5e1' > /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"
ExecStop=/bin/sh -c "echo '1' > /sys/bus/pci/devices/0000:00:02.0/b3dfe34f-0fdf-4321-8d03-42c4267ab5e1/remove"
RemainAfterExit=yes

[Install]
WantedBy=graphical.target

Anschließend den Service noch aktivieren systemctl enable gvtvgpu0

Um die vGPU in einer KVM zu benutzen folgendes in die Konfig eintragen:
args: -device vfio-pci,sysfsdev=/sys/bus/pci/devices/0000:00:02.0/b3dfe34f-0fdf-4321-8d03-42c4267ab5e1,rombar=0

Windows 10 RDP Framerate auf 60 erhöhen
Auf dem zu steuernden Gerät folgendes in der Registry einstellen.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations
Dort einen neuen DWORD(32-bit) Schlüssel erstellen mit dem Namen DWMFRAMEINTERVAL und dem Wert 15 (Decimal). Danach rebooten.

Windows 10 RDP h264 Hardware Encoding nutzen
Anzumerken ist das dies nur im LAN benutzt werden sollte.
Weiterführende Infos: https://techcommunity.microsoft.com/t5/Enterprise-Mobility-Security/Remote-Desktop-Protocol-RDP-10-AVC-H-264-improvements-in-Windows/ba-p/249588
gpedit.msc ausführen und zu folgendem Pfad navigieren:
Computerkonfiguration -> Administrative Vorlagen -> Windows-Komponenten -> Remotedesktopdienste -> Remotedesktopsitzungs-Host -> Umgebung für Remotesitzung
Hier nun die folgenden beiden Schlüssel auf aktiv setzen:
H.264/AVC 444-Grafikmodus für Remotedesktopverbindungen priorisieren
H.264/AVC-Hardwarecodierung für Remotedesktopverbindungen konfigurieren

Einstellungen für optimale Performance und Optik:
rdp