1940 字
10 分钟
Unraid P4 vGPU使用小结

前言(可跳过)#

之前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如下:

stl88083365
/
unraid-nvidia-vgpu-driver
Waiting for api.github.com...
00K
0K
0K
Waiting...

后续也有其他的大佬封装好了驱动,本教程会使用@novidio提供的这个驱动:

novidio
/
unraid-novidio-vgpu-driver
Waiting for api.github.com...
00K
0K
0K
Waiting...

如果你觉得这些第三方封装的不够安全,可以fork他们的仓库然后用@midi1996的打包脚本自行封装驱动,这样自由度更高,仓库如下:

midi1996
/
unraid-nvidia-vgpu-driver-builder
Waiting for api.github.com...
00K
0K
0K
Waiting...

接下来就在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,可以看到一些相关信息。

image-20251111084024464

这里我们要保证vgpu_unlock里的unlock = false,因为P4本身是根正苗红的服务器卡,不需要unlock。

这里要把P4的PCI号抄下来,图片里呢就是10:00.0

定义设备类型#

10:00呢是pci设备号,我们要找个记事本记下,Mdevctl types的意思是你可以虚拟化出什么样的显卡,找一个举例:

nvidia-49
Available instances: 5
Device API: vfio-pci
Name: GRID V40-4Q
Description: 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 list
5ab6d3d4-4e07-4592-abd0-5f973d22a0a1 0000:10:00.0 nvidia-49 auto (defined)

好,看着是启动了!

绑定到虚拟机#

你可以新建虚拟机,也可以改现有的,但无论如何你要把虚拟控制台协议从VNC切换为SPICE,据说VNC和vGPU驱动天生不合。

接下来在右上角点击“表单视图”

image-20251111085703173

然后你就能看到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驱动下载#

  1. Nvidia官网,用企业身份注册,完事了可以下载。
  2. Nvidia的好队友GoogleCloud,在他们的文档里可以下载到所有的vgpu grid驱动,不需要注册。考虑到谷歌的背景,链接应该会长期存在:https://cloud.google.com/compute/docs/gpus/grid-drivers-table?hl=zh-cn
  3. 百度

。。。

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第三方留存的镜像:

GreenDamTan
/
fastapi-dls_mirror
Waiting for api.github.com...
00K
0K
0K
Waiting...

部署的话很简单,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”,点击小齿轮配置一下监控的显卡就可以了。

image-20251111111916249

image-20251111111951914

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

Unraid P4 vGPU使用小结
https://naturesuki.net/posts/2025_11_11_vgpu/
作者
Matsuzaka Yuki
发布于
2025-11-11
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时