Technical

Device /dev/dri/card0 does not exist in LXC after update: fix the bind mount and cgroup rule

Device /dev/dri/card0 does not exist in LXC after update: fix the bind mount and cgroup rule

Device /dev/dri/card0 does not exist in your LXC after an update? It’s almost always one of three things: the bind mount is missing, the cgroup rule is wrong for your Proxmox version, or the container is unprivileged and needs an extra line. Here’s the checklist.

Detailed image of a server rack with glowing lights in a modern data center.

1. The bind mount

First, make sure /dev/dri is actually passed through. In your container config (/etc/pve/lxc/<CTID>.conf), you need:

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

If that line is missing, the device won’t show up no matter what else you do. Add it, restart the container, check again.

2. The cgroup allow rule — version matters

This is where the forum threads get messy. Proxmox 7 and earlier use cgroup v1, so the rule looks like:

lxc.cgroup.devices.allow: c 226:0 rwm

But if you’re on Proxmox 8 (or a newer kernel), cgroup v2 is the default and that line does nothing. Instead you need:

lxc.cgroup2.devices.allow: c 226:0 rwm

Yes, the ‘2’ matters. Mixing these up is the most common reason the device disappears after an update — the update changed the cgroup version under you.

System with various wires managing access to centralized resource of server in data center

3. Unprivileged containers need an extra rule

If your container is unprivileged (the default in Proxmox), the cgroup allow alone won’t cut it. You also need to add the device to the container’s device list:

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.cgroup2.devices.deny: a

The deny-all line at the end is the key — without it, the allow rule is ignored for unprivileged containers. If you’re still getting ‘Device /dev/dri/card0 does not exist’, check that deny line is there.

My take

This is a stupid default. Proxmox could easily detect the cgroup version and warn you, but instead you get a silent failure after an update. If you’re not sure which version you’re on, run mount | grep cgroup on the host. If you see cgroup2, use the cgroup2 syntax. If you see cgroup, use the old one. Don’t mix them.

And if you’re passing through a GPU for Plex or Jellyfin transcoding, this is exactly the kind of thing that breaks after every major Proxmox upgrade. Keep a note of your container config somewhere — it’ll save you an evening later.

Related: Migrate VM OS to Physical Device: A Proxmox V2P Walkthrough

Leave a comment

Comments are reviewed before they appear. Your email is never published.