Cant get Hardware encoding to work (intel igpu, proxmox lxc)

Hello,

I recently switched from my old fileserver to an Asus NUC with Intel Core 7 Ultra 220H Processor with built-in iGPU.

I tinkered around with Plex in an LXC and followed what felt like a thousand guides ans howtos and problem-solvers, but to no avail…

Hardware accelleration works when I first set up my LXC (privileged, unprivileged, Debian, Ubuntu, set up by myself, setup with the community script login).

Plex will see all my files and play them and unless I reboot the LXC or the Host running proxmox, Hardware transcoding is doing fine. As soon as I reboot, I abolutely cant get it to work. I analyzed (also with the help of threads, videos and AI tools) what was going on, but still no luck.

I am absolutely willing to start from scratch (I dont think it makes sense to debug my current FUBAR situation) with a new LXC and I dont mind if I have to use a privileged or unprivileged container.

I am running Proxmox 9 and have a Plex pass.

Any help ist really appreciated.

The easiest and best success I’ve had with Proxmox and iGPU is using the TTECK helper scripts.

It will setup the entire thing for you.

The hostname it creates is plex.

Create the mount point and then perform the mount for the media (if needed) in Proxmox.

Mine looks like this (glock is the NFS server with all the media)

1 Like

Yes, did that. Worked out of the box, wonderful script.
Then a reboot of my host .- no way to get HW accelleration back to work (which worked flawlessly!) and I have no Idea why.

Is the LXC launching at host boot ?

Yes. I thought about race conditions (driver not available on lxc startup), but shouldnt this be solved by a simple restart?

Container restart should solve it.
Does it say unprivileged: no ? (double negative)

I am using Proxmox 8.

I do not know anything about 9. I would have to scrap this instance and build fresh for 9.

Could you be missing Debian package / update ?

system has been updated. its a privileged container (tried with unpriviledged, gave me a headache, abandoned it).
if it was a missing package or update i would not expect it to work in first place.

Thanks for your help, its really appreciated.

I’ll read through the boot / low level config options.

It sounds like the script made a change which isn’t compatible with Prox 9.

Maybe?

Now its getting weirder:
I deleted my LXC and reinstalled with the helper script.
Transcoding has been activated in plex configuration page and I see my Intel Arrowlake iGPU and can choose. But when I do a intel_gpu_top on the host, it now shows 0% usage….frown

I have no idea whats going on here anymore

PMS should know your CPU/GPU by name. Does it?

with the intel gpu top – make certain to invoke with sudo.

Please show me the output of ls -laR /dev/dri

Yes, I can see Intel Arrowlake igpu in plex web interface.

root@plex:~# ls -laR /dev/dri
/dev/dri:
total 0
drwxr-xr-x 3 root video 120 Nov 1 23:01 .
drwxr-xr-x 10 root root 660 Nov 1 23:01 ..
drw-rw---- 2 root root 80 Nov 1 17:04 by-path
---------- 1 root root 0 Nov 1 23:01 card0
crw-rw---- 1 root video 226, 1 Nov 1 19:32 card1
crw-rw---- 1 root render 226, 128 Nov 1 19:32 renderD128

/dev/dri/by-path:
total 0
drw-rw---- 2 root root 80 Nov 1 17:04 .
drwxr-xr-x 3 root video 120 Nov 1 23:01 ..
lrwxrwxrwx 1 root root 8 Nov 1 17:04 pci-0000:00:02.0-card → ../card1
lrwxrwxrwx 1 root root 13 Nov 1 17:04 pci-0000:00:02.0-render → ../renderD128

I see the problem.

package udev isn’t working correctly.

Here’s Proxmox 8 on an AlderLake CPU

intel-gpu-top: 8086:46d1 @ /dev/dri/card0 -    0/   0 MHz; 100% RC6;  0.00/ 0.58 W
          0 irqs/s

         ENGINES     BUSY                                             MI_SEMA MI_WAIT
intel-gpu-top: 8086:46d1 @ /dev/dri/card0 -   48/ 563 MHz;   0% RC6;  0.12/ 2.68 W
         57 irqs/s

         ENGINES     BUSY                                             MI_SEMA MI_WAIT
       Render/3D    4.91% |██▏                                      |      0%      0%
         Blitter    0.00% |                                         |      0%      0%
           Video    6.94% |██▉                                      |      0%      0%
    VideoEnhance    0.00% |                                         |      0%      0%

^C
root@plex:~# ls -laR /dev/dri
/dev/dri:
total 0
drwxr-xr-x  3 root root        100 Sep 13 23:41 .
drwxr-xr-x 10 root root        660 Sep 13 23:41 ..
drwxr-xr-x  2 root root         80 Oct 27 23:28 by-path
crw-rw----  1 root render 226,   0 Oct 27 23:28 card0
crw-rw----  1 root render 226, 128 Oct 27 23:28 renderD128

/dev/dri/by-path:
total 0
drwxr-xr-x 2 root root  80 Oct 27 23:28 .
drwxr-xr-x 3 root root 100 Sep 13 23:41 ..
lrwxrwxrwx 1 root root   8 Oct 27 23:28 pci-0000:00:02.0-card -> ../card0
lrwxrwxrwx 1 root root  13 Oct 27 23:28 pci-0000:00:02.0-render -> ../renderD128
root@plex:~# 

Notice there is no card1

card0 & renderD128 are a pair.
card1 & renderD129 are a pair.

renderD128 does the transcode. card0 does the tone mapping

Is there another GPU in the box?

Thanks for looking into it. but any idea how this has been f*cked up in my system and - more important - what do I do now?
no, single GPU only. There are currently other machines in my pve (1 Windows VM without pci passthrough and 3 other LXC, only one of them using der igpu (which also does not work properly) and this is switched off so there is no interference hopefully.

Sorry, just migrating to PVE, so please excuse me if i am dumb :wink:

Go to the PVE level and open a Shell ( or ssh into it )

root@pve:~# lspci
00:00.0 Host bridge: Intel Corporation Alder Lake-N Processor Host Bridge/DRAM Registers
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:14.0 USB controller: Intel Corporation Alder Lake-N PCH USB 3.2 xHCI Host Controller
00:14.2 RAM memory: Intel Corporation Alder Lake-N PCH Shared SRAM
00:14.3 Network controller: Intel Corporation CNVi: Wi-Fi
00:15.0 Serial bus controller: Intel Corporation Device 54e8
00:15.1 Serial bus controller: Intel Corporation Device 54e9
00:16.0 Communication controller: Intel Corporation Alder Lake-N PCH HECI Controller
00:17.0 SATA controller: Intel Corporation Alder Lake-N SATA AHCI Controller
00:19.0 Serial bus controller: Intel Corporation Device 54c5
00:19.1 Serial bus controller: Intel Corporation Device 54c6
00:1c.0 PCI bridge: Intel Corporation Alder Lake-N PCI Express Root Port
00:1d.0 PCI bridge: Intel Corporation Alder Lake-N PCI Express Root Port
00:1e.0 Communication controller: Intel Corporation Alder Lake-N Serial IO UART Host Controller
00:1e.3 Serial bus controller: Intel Corporation Device 54ab
00:1f.0 ISA bridge: Intel Corporation Alder Lake-N PCH eSPI Controller
00:1f.3 Audio device: Intel Corporation Alder Lake-N PCH High Definition Audio Controller
00:1f.4 SMBus: Intel Corporation Alder Lake-N SMBus
00:1f.5 Serial bus controller: Intel Corporation Alder Lake-N SPI (flash) Controller
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
02:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM951/PM951 (rev 01)
root@pve:~# 

You should see only 1 GPU device (VGA Compatible Controller) at 00:02.0
That’s the iGPU

I am NO expert. I had lots of help.

I normally run Ubuntu server on my machines to avoid all this fuss.
If I need containers, I run incus (former LXD/LXC)

root@proxmox:~# lspci
00:00.0 Host bridge: Intel Corporation Device 7d06 (rev 05)
00:01.0 PCI bridge: Intel Corporation Meteor Lake-H PCIe Root Port (rev 10)
00:02.0 VGA compatible controller: Intel Corporation Arrow Lake-P [Intel Graphics] (rev 03)
00:04.0 Signal processing controller: Intel Corporation Meteor Lake-P Dynamic Tuning Technology (rev 05)
00:07.0 PCI bridge: Intel Corporation Meteor Lake-P Thunderbolt 4 PCI Express Root Port #0 (rev 10)
00:07.2 PCI bridge: Intel Corporation Meteor Lake-P Thunderbolt 4 PCI Express Root Port #2 (rev 10)
00:08.0 System peripheral: Intel Corporation Device 774c
00:0a.0 Signal processing controller: Intel Corporation Meteor Lake-P Platform Monitoring Technology (rev 01)
00:0b.0 Processing accelerators: Intel Corporation Meteor Lake NPU (rev 05)
00:0d.0 USB controller: Intel Corporation Meteor Lake-P Thunderbolt 4 USB Controller (rev 10)
00:0d.2 USB controller: Intel Corporation Meteor Lake-P Thunderbolt 4 NHI #0 (rev 10)
00:0d.3 USB controller: Intel Corporation Meteor Lake-P Thunderbolt 4 NHI #1 (rev 10)
00:12.0 Serial controller: Intel Corporation Device 7745
00:14.0 USB controller: Intel Corporation Device 777d
00:14.2 RAM memory: Intel Corporation Device 777f
00:14.3 Network controller: Intel Corporation Device 7740
00:16.0 Communication controller: Intel Corporation Device 7770
00:1c.0 PCI bridge: Intel Corporation Device 773c
00:1f.0 ISA bridge: Intel Corporation Device 7702
00:1f.3 Multimedia audio controller: Intel Corporation Device 7728
00:1f.4 SMBus: Intel Corporation Device 7722
00:1f.5 Serial bus controller: Intel Corporation Device 7723
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9C1a (DRAM-less)
56:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04)

Yes, only one device.

Think I see it. i need to figure out the commands to backtrack and confirm.

Give me a few please.

Take your time, I will check tomorrow :+1:

Please do one more thing for me.

  1. Confirm DEBUG logging is enabled.
  2. Restart Plex
  3. Let it sit completely idle ( I want to capture the GPU detection )
  4. After 3 minutes, Download the server logs ZIP file
  5. Attach that ZIP here.

I think I know the problem. We faced this with Ubuntu (They ended up fixing Ubuntu). Looks like Debian/ProxMox will need to deal with it as well.

Thanks for looking into this. Before you posted this I ended up with trying with a new container. Please note that some things have changed, but still no hardware accelleration.

root@plex:~# mount -a
Created symlink /run/systemd/system/remote-fs.target.wants/rpc-statd.service → /usr/lib/systemd/system/rpc-statd.service.
root@plex:~# ls -laR /dev/dri
/dev/dri:
total 0
drwxr-xr-x 3 root video 100 Nov 1 23:35 .
drwxr-xr-x 10 root root 660 Nov 2 09:48 ..
drw-rw---- 2 root root 80 Nov 1 23:35 by-path
crw-rw---- 1 root video 226, 0 Nov 1 23:35 card0
crw-rw---- 1 root render 226, 128 Nov 1 23:35 renderD128

/dev/dri/by-path:
total 0
drw-rw---- 2 root root 80 Nov 1 23:35 .
drwxr-xr-x 3 root video 100 Nov 1 23:35 ..
lrwxrwxrwx 1 root root 8 Nov 1 23:35 pci-0000:00:02.0-card → ../card0
lrwxrwxrwx 1 root root 13 Nov 1 23:35 pci-0000:00:02.0-render → ../renderD128
root@plex:~#

If helpful, this is the LXCs config file (created by the helper script)

arch: amd64
cores: 4
features: nesting=1,fuse=1
hostname: plex
memory: 8192
mp0: /mnt/pve/media,mp=/mnt/nfs_shares/media
net0: name=eth0,bridge=vmbr0,gw=192.168.0.1,hwaddr=BC:24:11:0C:62:77,ip=192.168.0.14/22,type=veth
onboot: 1
ostype: ubuntu
rootfs: local-lvm:vm-103-disk-0,size=32G
swap: 512
tags:
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 188:* rwm
lxc.cgroup2.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir

Anyway, these are the logs. Video kept freezing every few seconds without HWA.

Plex Media Server Logs_2025-11-02_09-54-52.zip (335.3 KB)

What you show me here:

/dev/dri:
total 0
drwxr-xr-x 3 root video 100 Nov 1 23:35 .
drwxr-xr-x 10 root root 660 Nov 2 09:48 ..
drw-rw---- 2 root root 80 Nov 1 23:35 by-path
crw-rw---- 1 root video 226, 0 Nov 1 23:35 card0
crw-rw---- 1 root render 226, 128 Nov 1 23:35 renderD128

/dev/dri/by-path:
total 0
drw-rw---- 2 root root 80 Nov 1 23:35 .
drwxr-xr-x 3 root video 100 Nov 1 23:35 ..
lrwxrwxrwx 1 root root 8 Nov 1 23:35 pci-0000:00:02.0-card → ../card0
lrwxrwxrwx 1 root root 13 Nov 1 23:35 pci-0000:00:02.0-render → ../renderD128
root@plex:~#

is correct.

Now check the unprivileged setting . The container needs to be privileged .

Here is the container config I have

root@pve:~# pct config 100
arch: amd64
cores: 4
features: nesting=1
hostname: plex
memory: 8192
mp0: /glock,mp=/glock
net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:64:46:69,ip=dhcp,type=veth
onboot: 1
ostype: ubuntu
rootfs: ContainersVMs:vm-100-disk-0,size=256G
swap: 512
tags: proxmox-helper-scripts
lxc.cgroup2.devices.allow: a
lxc.cap.drop: 
lxc.cgroup2.devices.allow: c 188:* rwm
lxc.cgroup2.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/serial/by-id  dev/serial/by-id  none bind,optional,create=dir
lxc.mount.entry: /dev/ttyUSB0       dev/ttyUSB0       none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB1       dev/ttyUSB1       none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM0       dev/ttyACM0       none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM1       dev/ttyACM1       none bind,optional,create=file
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
root@pve:~#

You’r mounting the file before the directory? Out of order ?

lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir