Skip to content

Instantly share code, notes, and snippets.

@yankcrime
Last active September 20, 2022 09:02
Show Gist options
  • Save yankcrime/7384d99bdc88eb1d53439ad30c6941b6 to your computer and use it in GitHub Desktop.
Save yankcrime/7384d99bdc88eb1d53439ad30c6941b6 to your computer and use it in GitHub Desktop.
Intel QuickSync accelerated video in Docker via LXC on PVE

Transcoding via Intel Quicksync in an Docker container under LXC on PVE

For Reasons™ I run Plex in a Docker container in LXC on Proxmox. Here's some configuration notes on making it work.

LXC container creation

  • It needs to be a privileged container
  • Needs to have nesting enabled

Once the container has been created, you need to manually add the following options to the container's configuration file (/etc/pve/lxc/<id>.conf):

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/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file

The full file should look like:

arch: amd64
cores: 4
features: nesting=1
hostname: plex
memory: 4096
net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=62:AC:94:D0:65:50,ip=dhcp,type=veth
ostype: debian
rootfs: local-lvm:vm-100-disk-0,size=8G
swap: 512
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/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file

Start the container and then verify you can see the GPU:

root@plex:~# apt install -y vainfo pciutils
[..]
root@plex:~# vainfo
error: can't connect to X server!
libva info: VA-API version 1.10.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_10
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.10 (libva 2.10.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 21.1.1 ()
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSliceLP
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSliceLP
      VAProfileJPEGBaseline           :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointVLD
      VAProfileHEVCMain10             :	VAEntrypointVLD
      VAProfileVP9Profile0            :	VAEntrypointVLD
      VAProfileVP9Profile2            :	VAEntrypointVLD
root@plex:~# lspci -v -s $(lspci | grep VGA | cut -d" " -f 1)
00:02.0 VGA compatible controller: Intel Corporation Device 9bca (rev 04) (prog-if 00 [VGA controller])
	DeviceName:  GPU
	Subsystem: Intel Corporation Device 2081
	Flags: bus master, fast devsel, latency 0, IRQ 173, IOMMU group 1
	Memory at 6022000000 (64-bit, non-prefetchable) [size=16M]
	Memory at 4000000000 (64-bit, prefetchable) [size=256M]
	I/O ports at 3000 [size=64]
	Expansion ROM at 000c0000 [virtual] [disabled] [size=128K]
	Capabilities: [40] Vendor Specific Information: Len=0c <?>
	Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00
	Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-
	Capabilities: [d0] Power Management version 2
	Capabilities: [100] Process Address Space ID (PASID)
	Capabilities: [200] Address Translation Service (ATS)
	Capabilities: [300] Page Request Interface (PRI)
	Kernel driver in use: i915

Now we can pass through that device to Plex in Docker.

Plex

If you use the linuxserver Plex image then this is very simple, you just need to pass the /dev/dri device through as mentioned in the documentation:

# docker run --device=/dev/dri:/dev/dri \
  --net=host -v $(pwd)/.plex:/config -v /syn/video:/video \
  --name plex -d lscr.io/linuxserver/plex:latest
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment