PVE 下 fnOS 飞牛影视 vGPU 转码播放错误排障记录:NVIDIA vGPU Host/Guest 驱动版本不匹配
这次折腾的是 PVE 里安装的 fnOS,显卡已经做了 NVIDIA vGPU 虚拟化,fnOS 里也能看到显卡,但飞牛影视一旦选择转码播放就提示播放错误。
最后确认根因不是 Docker 配置,也不是飞牛影视本身不能用显卡,而是 PVE vGPU Host Manager 和 fnOS Guest Driver 不属于同一 NVIDIA vGPU/Grid release branch 的官方支持组合。
本次排障经验我也整理成了一个 Codex Skill,方便以后复用:
Warm-rain/fix-pve-vgpu-transcoding
环境概况
- 虚拟化平台:PVE / Proxmox VE
- Guest:fnOS
- 应用:飞牛影视,原生应用,不是 Docker 容器
- GPU:NVIDIA vGPU
- PVE Host vGPU Manager:
580.126.08
- 修复前 fnOS Guest Driver:
580.65.06
- 修复后 fnOS Guest Driver:
580.126.09-grid
关键点:
飞牛影视是 fnOS 原生应用时,不需要按 Docker GPU passthrough 思路排查。
重点应该先看 guest driver、/dev/dri、mediasrv、ffmpeg、NVENC/NVDEC。
问题现象
fnOS 里显卡看起来是存在的,部分简单测试也能跑,但飞牛影视转码播放报错。
典型日志包括:
receive_from_worker(...) timeout 40000 ms
force kill child
neSend error, errno=-1
PVE host 内核日志里还能看到:
vgpu_mmio_fault
nvidia_vgpu_vfio
飞牛影视早期还出现过找不到 DRI card path 的情况:
couldn't get card path
no gpu working
force using cpu transcoding
排查过程
1. 先确认是不是 Docker 问题
一开始容易往 Docker GPU 配置方向想,但飞牛影视在 fnOS 里是原生应用,不是容器应用。
所以这类问题不要先去配 Docker,而是应该检查:
nvidia-smi
ls -l /dev/nvidia*
ls -l /dev/dri
ls -l /dev/dri/by-path
systemctl status mediasrv.service
tail -n 300 /usr/trim/logs/mediasrv.log
2. 检查 fnOS 里的 NVIDIA driver
修复前 fnOS 里虽然装了 NVIDIA guest driver,但实际和 PVE host vGPU manager 不匹配。
这类情况下可能出现一种很迷惑的状态:
nvidia-smi 可能能显示
- 简单
h264_nvenc 可能能跑
- 但真实视频
NVDEC + NVENC 会卡死或超时
- 飞牛影视转码播放失败
所以不能只看 nvidia-smi。
3. 对照 NVIDIA vGPU Host/Guest 官方组合
这次 PVE host 是:
580.126.08
对应的 Linux guest driver 应该是:
580.126.09-grid
也就是说,host 和 guest 不一定版本号逐字完全一样,但必须来自同一 NVIDIA vGPU/Grid release branch 的官方支持组合。
修复前 guest 是:
580.65.06
这个组合不对。
修复步骤
1. 给 VM 做快照
改驱动前一定先做快照:
qm snapshot before-vgpu-driver-fix-$(date +%Y%m%d-%H%M%S)
2. 准备匹配的 Guest Driver
本次使用:
NVIDIA-Linux-x86_64-580.126.09-grid.run
并校验 SHA256,确认安装包正确后再继续。
3. 停止媒体和 GPU 相关服务
systemctl stop mediasrv.service 2>/dev/null || true
systemctl stop nvidia-persistenced.service 2>/dev/null || true
systemctl stop resmon_service.service 2>/dev/null || true
pkill -f 'ffmpeg|nvidia-smi' 2>/dev/null || true
4. 安装匹配的 Guest Driver
chmod +x NVIDIA-Linux-x86_64-580.126.09-grid.run
./NVIDIA-Linux-x86_64-580.126.09-grid.run
code