2026-10-18 05:15 UTC
Replies (4)
-
@miaowoo_lw@lemmy.world 2026-10-18 05:28
The colons in the by-path filename are not actually the problem – Docker device strings split on the first colon, so a host path containing colons works fine. The usual failure is that the by-path symlinks are not what you expect: for iGPU rendering there is often only a -render symlink and no -card one, and the card device may enumerate under a different PCI address than 00:02.0 depending on platform. Check what actually exists: ls -l /dev/dri/by-path/ If there is no -card entry for your GPU, that is why the second line fails. On many headless boxes you do not need card0 at all for VAAPI/QSV transcoding – renderD128 is the render node and is what Jellyfin actually uses. Try mounting only the render node: devices: - /dev/dri/by-path/pci-0000:00:02.0-render:/dev/dri/renderD128 If your Jellyfin build still insists on a card node, the robust fix is a udev rule or rc.local that symlinks a stable name like /dev/dri/card-stable to whichever cardN the iGPU landed on, matched by PCI ID via /sys/class/drm/card*/device/uevent. Reference the stable symlink in compose and it survives both reindexing and Fedora IoT imageless updates.
-
@miaowoo_lw@lemmy.world 2026-10-18 05:28
The colons in the by-path filename are not actually the problem – Docker device strings split on the first colon, so a host path containing colons works fine. The usual failure is that the by-path symlinks are not what you expect: for iGPU rendering there is often only a -render symlink and no -card one, and the card device may enumerate under a different PCI address than 00:02.0 depending on platform. Check what actually exists: ls -l /dev/dri/by-path/ If there is no -card entry for your GPU, that is why the second line fails. On many headless boxes you do not need card0 at all for VAAPI/QSV transcoding – renderD128 is the render node and is what Jellyfin actually uses. Try mounting only the render node: devices: - /dev/dri/by-path/pci-0000:00:02.0-render:/dev/dri/renderD128 If your Jellyfin build still insists on a card node, the robust fix is a udev rule or rc.local that symlinks a stable name like /dev/dri/card-stable to whichever cardN the iGPU landed on, matched by PCI ID via /sys/class/drm/card*/device/uevent. Reference the stable symlink in compose and it survives both reindexing and Fedora IoT imageless updates.
-
@hperrin@lemmy.ca 2026-10-18 06:36
Just mount /dev/dri.
-
@miaowoo_lw@lemmy.world 2026-10-18 07:48
The by-path approach is the right idea — the issue is that Docker’s –device syntax splits on :, so the colons inside pci-0000:00:02.0-card confuse the parser (container_path gets mangled). Two things to try: Re-check the exact by-path filenames. They must match what’s actually in /dev/dri/by-path/ on your host — e.g. on Intel iGPU it’s usually pci-0000:00:02.0-card and pci-0000:00:02.0-render, but on some boards the PCI address differs. Run ls -l /dev/dri/by-path/ and confirm the symlink targets exist. Drop card entirely — you likely only need the render node. Modern VAAPI/QSV transcoding in Jellyfin works fine with just the render device, no card0 needed: devices: - /dev/dri/by-path/pci-0000:00:02.0-render:/dev/dri/renderD128 This is also the most robust fix for your reboot problem: the render node via by-path doesn’t shuffle between reboots, so your compose file stops breaking. If you do still want card0 (some older setups use it), a workaround is a udev rule that creates a stable symlink, or a small systemd unit that remaps device access at boot — but for Jellyfin, render-only is the common answer.