前言(可跳过)
之前NAS的方案是Intel的DG1作为jellyfin的转码卡,虽然折腾成功,但是实际上用着问题不少。考虑到后续还是想给VM加上gpu,最后还是花300巨资购买了一个P4计算卡。
到手后上机通电也没啥问题,遂开始折腾
部署
环境
Unraid版本:7.1.4 (版本很重要,对应系统内核就是6.12.24)
显卡:Tesla P4 (如果你也买了,建议和小散热风扇一起买)
vGPU驱动安装
首先要知道nvidia的计算卡的vgpu是单独的驱动,所以呢你不能安装unraid商店里的nvidia驱动,如果装了,立刻卸载并重启。
这个驱动最早应该是@stl88083385 封好的,不过这个驱动已经不适用于目前的unraid了(7.1.4是绝对不行),应该是7.0时代的驱动了,repo如下:
后续也有其他的大佬封装好了驱动,本教程会使用@novidio提供的这个驱动:
如果你觉得这些第三方封装的不够安全,可以fork他们的仓库然后用@midi1996的打包脚本自行封装驱动,这样自由度更高,仓库如下:
接下来就在unraid内安装好vgpu插件,我们打开插件 - 安装插件页面,根据novidio的指引安装vgpu插件,这里需要注意的是novidio封装的Unraid 7.2 (对应6.12.54)版本的驱动是无法和docker共享显卡的,所以如果你想让jellyfin容器也吃到p4显卡的编解码,就得降级到7.1.4,或者单开一个VM做好文件夹共享,这个不做赘述。
在插件界面的网址处输入:https://github.com/novidio/unraid-novidio-vgpu-driver/blob/master/novidio-vgpu-driver.plg
这里需要注意的是他的驱动是从github拉的,你需要自行解决网络问题(比如说:自行修改plg文件,在153行DL_URL处使用github的加速节点)。
装好后打开shell输入nvidia-smi,看到P4说明成了。
关闭ecc(可选)
ECC是个好东西,不过我们这里不需要。NV的ECC是占用一部分显存实现的,所以你的卡到手用nvidia-smi看只有7G左右的显存,你可以关了它。
nvidia-smi -e 0随后无论如何,都需要重启
vGPU配置
重启完成后打开设置里的VGpuDriver,可以看到一些相关信息。

这里我们要保证vgpu_unlock里的unlock = false,因为P4本身是根正苗红的服务器卡,不需要unlock。
这里要把P4的PCI号抄下来,图片里呢就是10:00.0
定义设备类型
10:00呢是pci设备号,我们要找个记事本记下,Mdevctl types的意思是你可以虚拟化出什么样的显卡,找一个举例:
nvidia-49Available instances: 5Device API: vfio-pciName: GRID V40-4QDescription: num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=6第一行是配置名,nvidia-49,接下来你开虚拟机是要用到的。第二行的大致意思是你可以开几个这样的虚拟机,这里写的是5个。
第三第四不重要,第五行比较重要的参数包括: frl_config: 帧率,framebuffer: 显存, max_resolution: 最大分辨率
这里我觉得nvidia-49比较合适(P4就8G显存,分1个4G显存出去差不多得了),于是呢把nvidia-49记下来,方便之后建立虚拟设备
启动vGPU
这个比较简单,主要是敲命令,记得提前去生成个uuid (https://www.uuidgenerator.net/ 这个UUID要记下来),其中PCI号要修改成这个格式:0000:03:00.0
mdevctl define -u {你生成的UUID} -t {你记录的设备类型} -p {PCI号} -a例如我要在PCI号为10:00.0的P4上启动一个uuid为5ab6d3d4-4e07-4592-abd0-5f973d22a0a1 ,设备类型是 nvidia-49的vGPU,命令如下:
mdevctl define -u 5ab6d3d4-4e07-4592-abd0-5f973d22a0a1 -t nvidia-49 -p 0000:10:00.0 -a顺便一提后面这个 -a 代表自动启动,这样不需要user srcipt管理vGPU的启动。这样一来你的vgpu就配置好了,接下来需要启动。
mdevctl start -u 5ab6d3d4-4e07-4592-abd0-5f973d22a0a1嗯,如果没报错应该就是启动了,我们可以验证一下:
root@AdmireVega:~# mdevctl list5ab6d3d4-4e07-4592-abd0-5f973d22a0a1 0000:10:00.0 nvidia-49 auto (defined)好,看着是启动了!
绑定到虚拟机
你可以新建虚拟机,也可以改现有的,但无论如何你要把虚拟控制台协议从VNC切换为SPICE,据说VNC和vGPU驱动天生不合。
接下来在右上角点击“表单视图”

然后你就能看到xml文件了,接下来要在devices里面添加一段(如果你不知道xml咋编辑,就在 /vidio )后面添加
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'> <source> <address uuid='{改成你的设备的UUID}'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> </hostdev>这里uuid改成你设备的uuid,值得注意的是底下的address里面的slot属性,这个随便改,不报错就可以了。
完事了以后启动你的VM,此时打开VM里的设备管理器会发现多了一个显卡,这意味着你已经把vgpu通到了虚拟机里面,但你必须装nvidia的grid驱动才能正常使用vgpu。
Grid驱动下载
- Nvidia官网,用企业身份注册,完事了可以下载。
- Nvidia的好队友GoogleCloud,在他们的文档里可以下载到所有的vgpu grid驱动,不需要注册。考虑到谷歌的背景,链接应该会长期存在:https://cloud.google.com/compute/docs/gpus/grid-drivers-table?hl=zh-cn
- 百度
。。。
Gird驱动授权
CAUTION仅做技术探讨,测试完成后请于24小时内删除,出事与笔者无关。有能力请联系nvidia购买节点。
NVIDIA的vGPU是收费的,体现在下面几个地方:
- 普通的消费级卡没有vGPU功能,你要加一笔钱买数据中心卡才行(可以用vgpu-unlock解决)
- 调用vGPU的虚拟机要运行特定版本的驱动,这个驱动会联网验证,验证不通过就慢慢限制vgpu的性能。
你可以去nvidia相关页面注册并获得90日的试用。
好在有大佬弄了个类似于kms的东西,项目叫做fastapi-dls,项目在这里:https://git.collinwebdesigns.de/oscar.krause/fastapi-dls,这里贴出在github第三方留存的镜像:
部署的话很简单,docker一把梭就行,compose文件如下:
version: '3.9'
x-dls-variables: &dls-variables TZ: Europe/Berlin # REQUIRED, set your timezone correctly on fastapi-dls AND YOUR CLIENTS !!! DLS_URL: localhost # REQUIRED, change to your ip or hostname DLS_PORT: 443 LEASE_EXPIRE_DAYS: 90 DATABASE: sqlite:////app/database/db.sqlite DEBUG: false
services: dls: image: collinwebdesigns/fastapi-dls:latest restart: always environment: <<: *dls-variables ports: - "443:443" # internal port always is 443, so if you want to use 9443 instead, use "9443:443" and set "DLS_PORT: 9443" volumes: - /opt/docker/fastapi-dls/cert:/app/cert - db:/app/database
volumes: db:需要修改:TZ、DLS_URL,PORTS,根据实际情况做修改即可。
部署完了,进入VM访问这个地址,将密钥文件下载好:https://<dls-hostname-or-ip>/-/client-token,把下载好的密钥文件放到C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken内,随后重启VM系统即可。
重启了就会提示授权成功,这样就能愉快的调用vGPU了
Jellyfin配置
既然特地使用可以和host的容器共享的驱动,我们就顺路讲一讲如何配置jellyfin。我的jellyfin是用compose部署的,贴出我用的compose文件如下:
services: jellyfin: image: dockerproxy.19990331.xyz/nyanmisaka/jellyfin:latest container_name: jellyfin environment: - PUID=99 - PGID=100 - TZ=Asia/Shanghai - NVIDIA_VISIBLE_DEVICES=all - NVIDIA_DRIVER_CAPABILITIES=compute,utility,video volumes: - /mnt/user/appdata/jellyfin:/config - /mnt/user/appdata/certs:/certs - /mnt/user/PT_downloads/Jellyfin:/data/From_PT - /mnt/user/BT_Downloads:/data/From_BT - /mnt/cache/JellyfinCache:/cache runtime: nvidia ports: - 8096:8096 - 8920:8920 restart: unless-stopped主要的改动点:
- environment(环境变量内)添加:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
- 添加一行runtime: nvidia
接着去jellyfin的控制台 - 播放 - 转码,把硬件加速调成Nvidia NVENC,接着就能愉快的使用p4转码了。
GPU状态监视
去unraid的应用中心里面搜索“GPU Statistics”,安装即可。
装完了在仪表盘会有一个“GPU”,点击小齿轮配置一下监控的显卡就可以了。


此时从jellyfin播放个视频,即可发现已经jellyfin成功调用到了p0解码,说明配置成功。
部分信息可能已经过时