在当前的虚拟化和容器化技术趋势中,Proxmox VE(Virtual Environment)提供了一个强大的平台来运行和管理基于 Linux 的容器,即 LXC(Linux Containers)。LXC 是一种轻量级的虚拟化技术,允许用户在隔离的环境中运行多个虚拟 Linux 系统。这些容器相比传统的虚拟机提供了更低的资源开销和更快的启动时间,非常适合于部署微服务和应用。
在多媒体处理和视频监控领域,GPU 加速已成为提升性能的关键技术。例如,Jellyfin —— 一个开源的媒体解决方案,可以通过利用 GPU 加速 FFmpeg 来提供更高效的视频编码和解码功能。FFmpeg 是一个强大的多媒体框架,能够处理几乎所有类型的视频和音频格式,GPU 加速可以显著提高其处理视频的能力。
然而,在 Proxmox VE 中直接在 LXC 容器内使用 GPU 需要一些额外的配置。主要挑战在于如何将宿主机的 GPU 资源透明地挂载到 LXC 容器中,并确保这些资源能够被容器内部署的 Docker 容器正确识别和利用。这涉及到修改 LXC 容器的配置文件以允许硬件直通,配置正确的设备权限,以及保证容器内的操作系统和应用能够识别并使用这些硬件资源。
本系列文章将详细指导您如何在 Proxmox VE 中设置和配置 LXC 容器,以支持 Docker 容器使用宿主机的 GPU 进行 FFmpeg 加速,从而实现在如 Jellyfin 这样的应用中高效的视频处理。通过实际的命令行操作和配置说明,您将能够充分利用您的硬件,优化您的应用性能。
一、PVE宿主机设置
1.查看设备
首先确认 Proxmox VE 系统是否正确识别了 Intel N5105 的集成显卡:
#输入
lspci | grep VGA
#输出
00:02.0 VGA compatible controller: Intel Corporation JasperLake [UHD Graphics] (rev 01)
2.查看驱动
确认正确的驱动程序是否已经安装,并检查设备文件是否存在:
#输入
ls -l /dev/dri
#输出
total 0
drwxr-xr-x 2 root root 80 Apr 13 23:54 by-path
crw-rw---- 1 root video 226, 0 Apr 13 23:54 card0
crw-rw---- 1 root render 226, 128 Apr 13 23:54 renderD128
如果看到 card0
和 renderD128
,这表明显卡驱动程序正常加载。
3.查看固件
固件是在硬件上运行的软件,提供必要的指令来控制设备如何操作。在这里,关注的是 Intel 显卡固件,这些固件文件支持图形硬件的功能和性能优化。
#输入
cd /lib/firmware/i915 && ls ehl_guc*.bin && ls ehl_huc*.bin && ls icl_dmc*.bin
#输出
ehl_guc_62.0.0.bin ehl_guc_70.1.1.bin
ehl_huc_9.0.0.bin
icl_dmc_ver1_09.bin
4.修改配置并重启
为了启用更高级的特性或修复特定的问题,修改内核模块的配置可能是必要的:
echo "options i915 enable_guc=3" >> /etc/modprobe.d/i915.conf
reboot
5.启动后检查
journalctl -b -o short-monotonic -k | egrep -i "i915|dmr|dmc|guc|huc"
输出的内容中有GuV
HuC
,则表明驱动和固件已成功加载并配置:
[ 6.535468] pve kernel: Setting dangerous option enable_guc - tainting kernel
[ 6.742040] pve kernel: i915 0000:00:02.0: [drm] VT-d active for gfx access
[ 6.742080] pve kernel: i915 0000:00:02.0: vgaarb: deactivate vga console
[ 6.742146] pve kernel: i915 0000:00:02.0: [drm] Using Transparent Hugepages
[ 6.745023] pve kernel: i915 0000:00:02.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 6.748624] pve kernel: i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/icl_dmc_ver1_09.bin (v1.9)
[ 7.602139] pve kernel: i915 0000:00:02.0: [drm] [ENCODER:238:DDI A/PHY A] failed to retrieve link info, disabling eDP
[ 7.610754] pve kernel: i915 0000:00:02.0: [drm] GT0: GuC firmware i915/ehl_guc_70.1.1.bin version 70.1.1
[ 7.610763] pve kernel: i915 0000:00:02.0: [drm] GT0: HuC firmware i915/ehl_huc_9.0.0.bin version 9.0.0
[ 7.626568] pve kernel: i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
[ 7.626926] pve kernel: i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[ 7.626928] pve kernel: i915 0000:00:02.0: [drm] GT0: GUC: SLPC disabled
[ 7.629408] pve kernel: [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.0 on minor 0
[ 7.631569] pve kernel: snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 8.482851] pve kernel: i915 0000:00:02.0: [drm] Cannot find any crtc or sizes
[ 9.370493] pve kernel: i915 0000:00:02.0: [drm] Cannot find any crtc or sizes
[ 10.222866] pve kernel: i915 0000:00:02.0: [drm] Cannot find any crtc or sizes
如果以上任意一个步骤存在问题,可能需要更新 Linux 内核(对于N5105可能至少需要5.19版本以后的内核)
对于特定硬件的支持,如 GPU 直通,通常需要更新到支持该功能的 Linux 内核版本。这可以通过 Proxmox 的包管理系统安全地完成:
检查当前内核版本并比较官方文档中推荐的版本:
uname -r
使用 apt 更新到最新的内核版本:
apt update && apt dist-upgrade
重启并验证新内核是否加载:
reboot && uname -r
二、LXC容器配置
创建LXC容器时需要取消勾选“无特权的容器”(如果已经创建LXC容器,下一步可以通过手动更改LXC容器配置文件)
1. 编辑 LXC 容器配置文件
修改核心显卡直通,需要使用 PVE 宿主机的命令行修改 LXC 容器的配置文件
使用nano文本编辑器打开对应容器的配置文件,容器ID 104对应的文件是 104.conf
,路径是 /etc/pve/lxc/
,配置文件路径为:
nano /etc/pve/lxc/104.conf
打开后默认的配置如下:
arch: amd64
cores: 4
hostname: debian
memory: 4096
net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=AA:BB:CC:DD:EE:FF,ip=dhcp,type=veth
ostype: debian
rootfs: local-lvm:vm-104-disk-0,size=16G
swap: 4096
2. 添加直通设备配置
在配置文件中,您需要添加以下行来配置设备直通:
lxc.cap.drop:
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
这些配置参数是针对 Linux 容器(通常是 LXC 容器)的一些安全和资源控制设置,用于限制容器内部的行为和访问。以下是每个配置项的作用解释:
lxc.cap.drop:
不删除任何默认的 Linux 功能能力(capabilities),容器继承主机的所有能力。lxc.apparmor.profile: unconfined
设置容器的 AppArmor 安全策略为不限制,赋予容器内的进程更高权限。lxc.cgroup.devices.allow: a
容器允许访问所有设备。lxc.cgroup2.devices.allow: c 226:0 rwm
容器内的进程可对设备号为226:0
的设备进行读、写、映射操作。lxc.cgroup2.devices.allow: c 226:128 rwm
容器内的进程可对设备号为226:128
的设备进行读、写、映射操作。lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
将宿主机的/dev/dri/card0
设备节点挂载到容器的相同路径,设置为绑定挂载。lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
将宿主机的/dev/dri/renderD128
设备节点挂载到容器的相同路径,设置为绑定挂载。
3. 修改无特权容器配置
如果已经创建LXC容器,并且勾选了“无特权的容器”, LXC 容器的配置文件应该会存在以下内容
(在PVE的管理页面里面这个东西是灰色的没法修改,就算把容器关闭了也还是灰色的。)
unprivileged: 1
改为unprivileged: 0
或者删除此行即可,保存启动lxc容器,果然看到Unprivileged container选项已经变成No了
4. 保存并启动 LXC 容器
修改完成后,保存文件并重启容器以应用更改:
pct start 104
通过这些步骤,您的 LXC 容器现在应该能够使用宿主机的核心显卡进行 GPU 加速了。
5. 检查核显
等容器启动成功后,进入容器,使用命令行检查 /dev/dri
路径下挂载的文件,card0
和 renderD128
都正常
#输入
ls -l /dev/dri
#输出
total 0
crw-rw---- 1 root video 226, 0 Apr 13 23:54 card0
crw-rw---- 1 root input 226, 128 Apr 13 23:54 renderD128
查看 PCI 也能看到核心显卡,说明挂载成功
lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation JasperLake [UHD Graphics] (rev 01)
三、jellyfin安装及配置
目前常用的jellyfin有三种不同的docker镜像nyanmisaka/jellyfin、linuxserver/jellyfin、jellyfin/jellyfin,这里推荐安装nyanmisaka或者linuxserver的镜像
特性 / 镜像 | nyanmisaka/jellyfin | linuxserver/jellyfin | jellyfin/jellyfin |
---|---|---|---|
维护者 | Nyanmisaka (Jellyfin项目贡献者) | LinuxServer.io(社区团队) | 官方Jellyfin团队 |
特殊功能 | 针对特定硬件的优化,如Intel Arc GPU支持 | 稳定性、易用性、社区支持,优化层次 | 最新Jellyfin版本和功能 |
优化与兼容性 | 硬件加速和高级视频流处理功能 | 广泛的系统兼容性,一般性能优化 | 直接从源代码构建,标准优化 |
目标用户 | 需要高级硬件支持和视频流处理优化的用户 | 寻求稳定可靠设置的用户 | 想要最新功能和官方支持的用户 |
更新与维护 | 定期更新,注重特定硬件的支持和视频处理功能 | 定期更新,重视稳定性和社区需求 | 频繁更新,与官方版本同步 |
社区与支持 | 活跃于Jellyfin社区,贡献了多个重要功能 | 广泛的社区支持和文档 | 官方支持渠道,丰富的文档 |
关于jellyfin的详细安装及优化配置(IPV6、缓存、插件推荐)详见jellyfin的详细安装及优化配置(IPV6、缓存、字体、插件推荐),以下只涉及硬件转码的相关内容
1.nyanmisaka中国特供版镜像
在部署docker容器时,只需要映射相应的device即可
--device=/dev/dri:/dev/dri
2.linuxserver镜像
Intel
To enable the OpenCL based DV, HDR10 and HLG tone-mapping, please refer to the OpenCL-Intel mod from here:
需要额外添加一个环境变量
-e DOCKER_MODS="linuxserver/mods:jellyfin-opencl-intel"
(linuxserver的VPP好像兼容性存在问题)
评论区