外观
媒体服务器与核显转码
媒体服务器(Jellyfin、Plex 等)最吃资源的环节不是播放,是转码——客户端网络带宽不够,或者设备不支持原始编码时,服务器要实时把视频转成另一种格式。用 CPU 软转码,一路 4K 转码就能吃满好几个核;用核显(Intel Quick Sync、AMD VCN)做硬件转码,同样的负载 CPU 占用可能只有个位数百分比。
这篇讲用哪种客户机形态跑媒体服务器,以及怎么把核显接给它用。具体软件用开源的 Jellyfin 举例,其他方案思路类似。
适合谁:容器还是虚拟机
| 形态 | 优点 | 代价 |
|---|---|---|
| LXC 容器(推荐) | 直接共享宿主机的核显(/dev/dri),资源占用小,配置简单 | 只能用宿主机现有的核显,不能独占一张独立显卡 |
| 虚拟机 + GPU 直通 | 可以直通一张独立显卡,转码能力更强(NVENC 等),也适合同时跑其他需要该显卡的服务 | 这张显卡宿主机和其他客户机都不能用了;虚拟机不能快照/迁移 |
多数家庭场景核显的转码能力就够用(现代 Intel 核显能同时处理好几路 4K 转码),优先选容器方案。只有当你需要独立显卡的编码能力、或者要把显卡同时用于其他重负载(AI 推理等)时,才考虑虚拟机直通,见显卡直通。
核显不能同时给多个客户机独占使用
核显在容器方案里是共享的——同一块核显的 /dev/dri 设备节点可以映射给多个 LXC 容器同时使用(Linux 的 DRM 驱动支持多进程共享)。这和 PCI 直通不同,直通是排他的,一旦直通给某台虚拟机,宿主机和其他客户机都用不了。
资源规划
| 项 | 建议 | 说明 |
|---|---|---|
| 形态 | 非特权 LXC 容器,Debian/Ubuntu 模板 | 默认就应该用非特权,见特权与非特权容器 |
| vCPU | 2–4 | 硬件转码本身不太吃 CPU,但字幕处理、封装格式转换、缩略图生成仍然用 CPU |
| 内存 | 2–4 GB | 视媒体库大小和是否开启重度的元数据/封面抓取而定 |
| 系统盘 | 8–16 GB | 只放程序和配置,不放媒体文件 |
| 媒体存储 | 单独的存储,通过 bind mount 挂进容器 | 见下文 |
媒体文件不要放在容器的系统盘里
容器的根文件系统通常比较小,也不是为存放几百 GB 到几 TB 的媒体库设计的。把实际的电影/剧集目录放在宿主机的一块单独存储上(参见加一块新盘),再通过 bind mount 挂进容器,方便扩容、备份和以后换容器时不用搬数据。
创建容器
按创建第一个容器的步骤建一个 Debian 或 Ubuntu 的非特权容器,装好之后按官方安装方式装 Jellyfin(apt 仓库或官方安装脚本,以 Jellyfin 官方文档 为准)。
挂载媒体目录:容器创建后到 资源 → 添加 → 挂载点,把宿主机上存放媒体的目录挂进容器(例如挂到 /mnt/media)。非特权容器下会遇到 UID 映射导致的权限问题,处理方式见特权与非特权容器里的挂载点权限一节。
把核显接给容器
这是启用硬件转码的关键步骤:把宿主机的 /dev/dri(DRM/VAAPI 渲染节点)设备映射进非特权容器,并处理好宿主机和容器内的用户组权限。这部分配置细节(设备号、render 组的 GID 映射、PVE 9 起的 Web UI 设备透传方式)见 在容器里使用核显。
装好之后在 Jellyfin 的 控制台 → 回放 → 转码 里,把硬件加速类型改成对应你 CPU 厂商的选项(Intel 通常是 VAAPI 或 QSV,AMD 是 VAAPI),并按 Jellyfin 官方硬件加速文档勾选支持的编解码格式。
先确认核显在宿主机上能用
在容器里排查之前,先在宿主机 shell确认核显本身工作正常:
sh
ls /dev/dri/
vainfo看到 renderD1xx 设备节点、vainfo 能列出支持的编码格式,说明宿主机这一侧没问题,再去处理容器的设备映射。宿主机上看不到,说明是驱动或 BIOS 里核显被关闭的问题,和容器无关。
检查结果
- Jellyfin 网页界面能正常访问,媒体库扫描能看到 bind mount 进来的文件。
- 播放一个客户端不支持直接播放的格式(或者手动强制降低画质),触发转码。
- 播放的同时在宿主机 shell执行
intel_gpu_top(Intel)或对应厂商的工具,能看到视频引擎有负载,说明确实走了硬件转码而不是 CPU 软转码。 - 对比同一段素材软转码和硬转码时的 CPU 占用(
htop),硬件转码应该明显更低。 - Jellyfin 播放日志或转码信息里能看到
VAAPI/QSV之类的加速器标识,而不是libx264纯软件编码器。
常见问题
转码时 CPU 还是很高,看不出核显在工作。 大概率是转码设置没有真正启用硬件加速,或者容器里进程用户没有权限访问 renderD* 设备。回到在容器里使用核显检查设备映射和用户组。
No VA display found 或权限被拒绝。 检查容器内 Jellyfin 运行用户是否已加入映射后对应的组,以及设备节点的属主/权限是否与映射的 GID 一致。
想同时用这块核显跑别的容器(比如另一个转码任务)。 可以,核显支持多进程共享,重复上面的设备映射步骤给另一个容器即可,注意观察总体负载,核显的编码引擎数量有限。
想用独立显卡(更强的编码能力)。 换成虚拟机 + PCI 直通的方案,见显卡直通,代价是这张显卡会被这台虚拟机独占。