3 min read

Jellyfin - Hardwarebeschleunigung mit VAAPI im LXC Container | Proxmox

Mittlerweile bin ich vom Plex Media Server zu Jellyfin gewechselt, hauptsächlich wegen quelloffenem Code, der Erweiterbarkeit (bspw. CSS oder LDAP Login) und sowie keinerlei Datensammlung oder Tracking. Da mein Proxmox Host einen AMD Ryzen 2200G Prozessor mit iGPU besitzt, geht es in diesem Artikel darum die Videobeschleunigung der iGPU zu nutzen.

In diesem Falle nutze ich die Implementation VAAPI (Video Acceleration API), eine Open Source Library die den Zugriff auf Hardware beschleunigte Kodierung und Dekodierung zur Verfügung stellt. Weiterhin wäre noch die Verwendung von AMF (Advanced Media Framework) möglich, Voraussetzungen sind hier eine Zen CPU und die Closed Source Treiber von AMD, jedoch ist die Performance im Vergleich geringer.
Alternativ wären unter Linux noch NVIDIA NVENC oder Intel QuickSync möglich, beide scheiden aufgrund der vorhandenen Hardware aus.

Somit fiel die Wahl auf VAAPI, welches mind. mesa 20.1 für das Decoden von HVEC (= H.265) kodierten Dateien benötigt, meine Mediathek besteht aktuell zu 37.9% aus HVEC kodierten Material:

Quelle: Tdarr (https://github.com/HaveAGitGat/Tdarr)

Das daraus resultierende Problem ist, dass die aktuelle Mesa Version in den Buster (Debian 10) Repos mesa 18.3.6 ist. Beim Versuch eine aktuelle mesa Version zu kompilieren (Link) bin ich dann auf Probleme gestoßen, so dass ich mich entschieden habe als OS Arch Linux im LXC Container zu verwenden.

Vorbereitungen auf Proxmox Host

Also zunächst einmal sollte auf dem Proxmox Host der Command ls -l /dev/dri/ ein ähliches Output erzeugen und die vorhandenen Videogeräte anzeigen:
crw-rw---- 1 root video  226,   0 Jul 19 13:22 card0
crw-rw---- 1 root render 226, 128 Jul 19 13:22 renderD128

Nun müssen in der Konfigdatei des LXC Containers (unter /etc/pve/lxc/<ID des Containers>.conf) folgende Zeilen hinzugefügt werden, die den Zugriff auf das Video Device erlauben:
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.autodev: 1

(cgroup2 bei Proxmox Version 7, sonst nur cgroup!)

Der LXC Container muss übrigens privilegiert sein, damit er darauf zugreifen kann.
Außerdem muss die Zeile
lxc.hook.autodev:/var/lib/lxc/<ID des Containers>/mount_hook.sh
hinzugefügt werden damit das Skript mount_hook.sh beim Start des Containers ausgeführt wird. Dieses Skript enthält:
mkdir -p ${LXC_ROOTFS_MOUNT}/dev/dri
mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/dri/card0 c 226 0
mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/dri/renderD128 c 226 128

Nun sollte der Container neugestartet werden können, ohne das ein Fehler auftritt. Falls doch ein Fehler auftritt, die Informationen habe ich dem Plex Forum entnommen.

Installation von mesa

Nun sollte die Ausgabe von ls -l /dev/dri/ im Container gleich aussehen.
Natürlich muss unter Arch dann noch mesa installiert werden:
sudo pacman -S mesa

Konfiguration von Jellyfin

Im Webinterface muss noch unter Admin Übersicht > Server Wiedergabe > VAAPI aktiviert werden und als Gerät /dev/dri/renderD128 angegeben werden. Überprüft kann die Funktionalität dann mit dem Tool radeontop werden, sowohl auf dem Proxmox Host als auch im Container sollte das Tool dann beim abspielen von Medien Auslastung anzeigen. Bei einem Test mit 3 offenen Tabs (3x HVEC 1080p, 60 Mbps) sah die Auslastung so aus:

Fazit

Vor einem halben Jahr lief bei mir die Hardware Transcoding Option nicht mehr. Ich schätze das dies aus Fehlern beim Container oder vom Host resultierte. Eine schnelle Lösung dafür ist dann, die Option wieder in den Einstellungen auszuschalten. Doch läuft der Dienst seit ca. einer Woche wieder stabil bei mir, und ich konnte keine Fehler beobachten. Zusätzlich zum hilreichen Artikel kann ich auch noch das Subreddit r/Proxmox empfehlen, wo ich auch einige Informationen heraus entnommen habe.


Autor: peterge