Solucionar VAAPI en Jellyfin LXC sin privilegios de Proxmox
Este post es la continuación de Jellyfin cortes 4K y disco lleno. Hace un par de días parecía que todo estaba arreglado y que la transcodificación funcionaba bien, pero resulta que no: la GPU no estaba bien configurada y los cortes seguían apareciendo.
Problema – Error de transcodificación en Jellyfin
Jellyfin muestra la siguiente excepción:
Device creation failed: -542398533.
Failed to set value 'vaapi=va:,vendor_id=0x8086,driver=iHD' for option 'init_hw_device': Generic error in an external library
Error parsing global options: Generic error in an external library
Esto ocurre aunque la comprobación de vainfo funciona dentro del contenedor y el driver iHD está presente.
Diagnóstico – ¿Por qué Jellyfin no accede a /dev/dri?
En el nodo Proxmox:
ls -la /dev/dri/
# crw-rw---- 1 root video 226, 1 card1
# crw-rw---- 1 root render 226, 128 renderD128
Al inspectar el LXC (ID 108) los dispositivos aparecen como root:root en lugar de root:video / root:render, bloqueando el acceso del usuario jellyfin.
Solución – Hook script de Proxmox para cambiar permisos
# Create the snippets directory if it doesn't exist
mkdir -p /var/lib/vz/snippets
# Create the hook script
cat > /var/lib/vz/snippets/lxc-108-dri-perms.sh << 'EOF'
#!/bin/bash
VMID="$1"
PHASE="$2"
if [ "$VMID" != "108" ] || [ "$PHASE" != "post-start" ]; then
exit 0
fi
sleep 2
lxc-attach -n 108 -- chown root:render /dev/dri/renderD128
lxc-attach -n 108 -- chown root:video /dev/dri/card1
EOF
chmod +x /var/lib/vz/snippets/lxc-108-dri-perms.sh
# Register the hook script in the LXC config
pct set 108 --hookscript local:snippets/lxc-108-dri-perms.sh
# Restart the LXC (pct restart does not exist in Proxmox 9)
pct stop 108 && pct start 108
Al instalar y registrar el script (pct set 108 --hookscript local:snippets/lxc-108-dri-perms.sh) los dispositivos adquieren la propiedad correcta.
Verifica:
pct exec 108 -- ls -la /dev/dri/
# crw-rw---- 1 root video 226, 1 card1
# crw-rw---- 1 root render 226, 128 renderD128
Con los permisos corregidos, Jellyfin transcodifica vía VAAPI sin errores.
Resultados – Transcodificación confiable y sin disrupciones
Jellyfin ahora accede a todos los dispositivos DRI y la funcionalidad de hardware transcoding con Intel Quick Sync funciona de manera estable.
FAQ
¿Qué diferencia hay entre <em>card1</em> y <em>renderD128</em> en /dev/dri?
card1 es el dispositivo principal de renderizado de la GPU; renderD128 permite la entrada VRAM sin asociarse directamente a la pantalla, usado para streaming e Inteligencia Artificial.
¿Necesito reiniciar el contenedor cada vez que cambie los permisos?
Solo es necesario hacerlo una vez después de instalar el hook. Posteriormente el script corre en post-start automáticamente.
¿Puedo usar este script en Proxmox 8?
Sí, la lógica permanece igual. Solo ajusta la path y el ID del contenedor.
¿Alguien más ha tenido un error similar?
Este patrón es frecuente en LXC sin privilegios: los dispositivos se mapean con root:root por defecto.
Conclusión
Con el hook script y la corrección de permisos, Jellyfin transcodifica sin errores. Mantén este esquema en tu entorno Proxmox para evitar caídas inesperadas de la biblioteca de VAAPI. ¿Tienes dudas con la configuración? Escríbeme o deja un comentario. Compártelo si te ha gustado. ¡Y hasta aquí por hoy!
Artículos relacionados
Cómo resolví los cortes de Jellyfin en 4K: disco lleno y más
Películas en 4K que se cortan a los 5 minutos, salvapantallas que salta solo... No era la red. El disco del LXC estaba al 100%. Descubrí y solucioné cinco problemas encadenados: disco lleno que impedía escribir logs y segmentos de transcoding, archivo MKV corrupto con error EBML, falta de aceleración por hardware Quick Sync en Intel HD Graphics 530, montaje NTFS incorrecto que no permitía borrar archivos, y NFS que no detectaba archivos nuevos por falta de inotify. Aprende a diagnosticar con journalctl, ffprobe y ffmpeg.
Ansible: cómo automatizar tu Home Lab de principio a fin
Ansible es una herramienta de automatización de código abierto que gestiona todos tus servidores y contenedores desde un solo punto mediante SSH. Usa playbooks en YAML, es idempotente y no requiere agentes. Olvídate de actualizar cada servicio a mano.
Vaultwarden: contraseñas seguras en tu servidor, sin pagos
Vaultwarden es una implementación ligera de Bitwarden escrita en Rust. Obtén todas las funcionalidades premium gratis: TOTP, archivos adjuntos y acceso de emergencia. Compatible con todos los clientes oficiales, cifrado del lado del cliente y tus datos en tu propio servidor.