GPU AMD (VAAPI) pour Plex & Jellyfin en LXC Proxmox
Ce document décrit la configuration de la RX 6700 XT pour Plex (CT 20232400) et Jellyfin (CT 20308096) sous Proxmox VE 8, en conteneurs LXC unprivileged, avec transcodage matériel VAAPI.
1. Contexte
-
Host Proxmox
- Kernel :
6.8.12-16-pve - GPU : AMD Radeon RX 6700 XT (Navi 22), driver
amdgpu - Devices exposés sur le host :
ls -l /dev/dri # card0 -> GPU AMD # renderD128 -> node de rendu (VAAPI, ROCm, etc.)
- Kernel :
-
Conteneurs concernés
- Plex : CT
20232400, hostnameplex - Jellyfin : CT
20308096, hostnamejellyfin - Les deux sont des LXC unprivileged créés via les community-scripts (Helper-Scripts).
- Plex : CT
Objectif :
Donner accès au GPU via /dev/dri dans les deux LXC et activer le transcodage matériel VAAPI dans Plex & Jellyfin.
2. Configuration LXC côté Proxmox
2.1 Plex (CT 20232400) – /etc/pve/lxc/20232400.conf
Configuration finale (partie importante) :
# Plex LXC (Helper-Scripts)
arch: amd64
cmode: shell
cores: 12
features: keyctl=1,nesting=1
hostname: plex
memory: 4096
mp0: /mnt/pve/movie,mp=/movie
mp1: /mnt/pve/music,mp=/music
mp2: /mnt/pve/anime,mp=/anime
mp3: /mnt/pve/serie,mp=/serie
nameserver: 192.168.1.3
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=BC:24:11:2C:BF:A3,ip=192.168.1.202/24,type=veth
onboot: 1
ostype: ubuntu
rootfs: vm-docker:vm-20232400-disk-0,size=300G
searchdomain: z-server.me
startup: order=4
swap: 2048
tags: community-script;linux;lxc;marechal;media;server;share;ssh;webserver
# 🔹 Accès au GPU via /dev/dri
lxc.cgroup2.devices.allow: c 226:* rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
⚠️ Important : AUCUNE ligne
dev0:oudev1:ne doit être présente. Le bind-mount complet de/dev/drivialxc.mount.entry+ la règlec 226:*suffisent.
Après modification :
pct stop 20232400
pct start 20232400
2.2 Jellyfin (CT 20308096) – /etc/pve/lxc/20308096.conf
Configuration finale (partie importante) :
# Jellyfin LXC (Helper-Scripts)
arch: amd64
cmode: shell
cores: 12
features: keyctl=1,nesting=1
hostname: jellyfin
memory: 6144
mp0: /mnt/pve/movie,mp=/movie
mp1: /mnt/pve/music,mp=/music
mp2: /mnt/pve/anime,mp=/anime
mp3: /mnt/pve/serie,mp=/serie
nameserver: 192.168.1.3
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=BC:24:11:E7:9C:CC,ip=192.168.1.203/24,type=veth
onboot: 1
ostype: ubuntu
rootfs: vm-docker:vm-20308096-disk-0,size=100G
searchdomain: z-server.me
startup: order=5
swap: 2048
tags: community-script;linux;lxc;marechal;media;server;share;ssh;webserver
# 🔹 Accès au GPU via /dev/dri
lxc.cgroup2.devices.allow: c 226:* rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
Redémarrer :
pct stop 20308096
pct start 20308096
3. Vérifications dans les conteneurs
3.1 Plex – devices GPU visibles dans le LXC
Sur le host :
pct stop 20232400
pct start 20232400
pct console 20232400
# (Ctrl+a q pour quitter la console)
Dans le conteneur Plex :
ls -l /dev/dri
On doit voir quelque chose comme :
crw-rw---- 1 root video 226, 0 ... card0
crw-rw---- 1 root render 226, 128 ... renderD128
3.2 Jellyfin – devices GPU visibles
Sur le host :
pct stop 20308096
pct start 20308096
pct console 20308096
Dans le conteneur Jellyfin :
ls -l /dev/dri
Sortie attendue similaire avec card0 et renderD128.
4. Groupes video / render pour Plex & Jellyfin
Les applications doivent tourner avec un utilisateur membre des groupes video et render.
4.1 Plex
Dans le conteneur Plex :
grep -w 'video\|render' /etc/group
Tu avais :
video:x:44:plex
render:x:118:
On ajoute donc plex dans render :
usermod -aG video,render plex
id plex
Vérifier que la sortie contient bien video et render.
Redémarrer Plex :
systemctl restart plexmediaserver 2>/dev/null || systemctl restart plex 2>/dev/null
4.2 Jellyfin
Dans le conteneur Jellyfin :
grep -w 'video\|render' /etc/group
Tu avais :
video:x:44:jellyfin
render:x:104:jellyfin
Donc jellyfin est déjà dans les bons groupes.
Au besoin :
usermod -aG video,render jellyfin
id jellyfin
systemctl restart jellyfin
5. Validation VAAPI avec vainfo
Tu peux tester rapidement le support VAAPI dans un des conteneurs (Plex ou Jellyfin).
Installation (exemple Plex, Ubuntu 22.04) :
apt update
apt install -y vainfo mesa-va-drivers
vainfo
Exemple de sortie (résumé) :
libva info: VA-API version 1.14.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.14 (libva 2.12.0)
vainfo: Driver version: Mesa Gallium driver ... for AMD Radeon RX 6700 XT
...
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
...
Les lignes VAProfile... / VAEntrypointEncSlice confirment que l’encodage matériel est disponible.
6. Configuration dans Plex
Dans l’interface web Plex :
- Aller dans :Settings → Server → Transcoder
- Activer :
- ✅ Use hardware acceleration when available
- Garder le mode automatique / VAAPI (Plex utilisera
/dev/dri).
Pour forcer un transcodage :
- Lire un film 4K (ou au moins 1080p)
- Sur le client, réduire la qualité (ex. 720p 4 Mbps) pour obliger le transcodage.
Optionnel : vérifier dans les stats de lecture Plex que le codec porte la mention “(hw)” ou que le transcode utilise VAAPI.
7. Configuration dans Jellyfin
Dans l’interface Jellyfin :
- Aller dans :Dashboard → Playback → Transcoding
- Section Hardware acceleration :
- Choisir VAAPI
- Device :
/dev/dri/renderD128(ou laisser Automatic si Jellyfin le détecte)
- Cocher :
- Hardware decoding
- Hardware encoding (si proposé)
- Sauvegarder.
Pour tester :
- Lire une vidéo 4K ou 1080p haute qualité.
- Baisser la résolution / le bitrate côté client pour forcer le transcodage.
- Vérifier dans Dashboard → Active sessions que le codec utilise VAAPI.
8. Stress-test GPU 4K avec ffmpeg
Pour mettre la RX 6700 XT dans le rouge, on peut utiliser un fichier 4K de test dans le LXC Plex (ou Jellyfin) et transcoder via VAAPI.
8.1 Exemple de fichier 4K de test (dans Plex)
Dans le conteneur Plex :
cd /movie
mkdir -p test4k
cd test4k
# Exemple : fichier 4K téléchargé manuellement (démo 4K, film de test, etc.)
# wget "https://.../mon_fichier_4k.mp4" -O 4k-test.mp4
Remplacer l’URL par un fichier 4K réel (film de test, démo 4K, etc.) L’important : résolution 3840x2160 et bitrate élevé pour bien charger le GPU.
8.2 Transcodage 4K → H.264 via VAAPI
Toujours dans Plex LXC, dans /movie/test4k :
ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \
-i 4k-test.mp4 \
-vf 'format=nv12,hwupload' \
-c:v h264_vaapi -b:v 20M \
-f null -
Explications :
-hwaccel vaapi -vaapi_device /dev/dri/renderD128: décodage matériel via VAAPI.format=nv12,hwupload: format adapté au pipeline VAAPI.-c:v h264_vaapi: encodage H.264 sur le GPU.-f null -: la sortie vidéo n’est pas écrite sur disque (pure charge GPU).
Tu peux lancer plusieurs ffmpeg en parallèle (deux shells) pour encore plus de charge.
9. Supervision de la charge GPU sur le host
Sur le host Proxmox, pendant un transcodage (Plex, Jellyfin ou ffmpeg), tu peux surveiller la charge de la RX 6700 XT.
Installation de radeontop (si pas déjà fait) :
apt update
apt install -y radeontop
radeontop
Sinon, méthode texte simple (selon ce que le noyau expose) :
watch -n1 "cat /sys/kernel/debug/dri/0/amdgpu_pm_info | egrep 'GPU load|GPU freq|Memory freq' || echo 'no debug info'"
Tu devrais voir la charge GPU augmenter dès que :
- un transcodage Plex est en cours,
- un transcodage Jellyfin est en cours,
- ou un
ffmpegVAAPI tourne dans un LXC.
10. Résumé rapide
- Le GPU AMD est exposé dans les LXC via :
lxc.cgroup2.devices.allow: c 226:* rwmlxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
- Aucun
dev0:/dev1:dans les confs LXC : pas besoin, et ça casseautodev. - Les utilisateurs
plexetjellyfinsont dans les groupes :videorender
- Plex & Jellyfin sont configurés en VAAPI.
- Les tests 4K +
ffmpegpermettent de confirmer que la RX 6700 XT est bien utilisée.
Ce README est la référence pour la configuration GPU/VAAPI de Plex & Jellyfin sur ce cluster Proxmox.