显卡虚拟化,Tesla P4在PVE8下的vgpu配置方案,兼容多显卡直通

前言 UP主最近买了一张Tesla P4.

前言

UP主最近买了一张Tesla P4的显卡,准备折腾一下显卡虚拟化。主要需求来自于我每天都会使用家里的几台虚拟机完成不同的工作任务。因为虚拟机没有显卡所以很多操作比较卡,用着不是那么顺手。也正因为也是办公使用,直通一张高性能显卡性价比比较低,也没法给多台虚拟机使用。正好最近P4显卡价格不贵,所以准备买张来试试。

由于我平时没有使用NAS的方案,所以就没有验证vgpu在NAS下的编解码能力,但是根据其他up主的视频来看,在jellyfin下的编解码是没有问题的。

目前vgpu_unlock项目只支持Time-sliced技术,也就是单GPU实例性能会动态分配。如一张P4,如果只有一个GPU实例,那么多获得接近100%的性能,同时2个GPU实例,会分别获得1/2的性能。

整体的虚拟化逻辑如图,大致分为虚拟机、宿主机、GPU虚拟化授权服务器三个部分。

PVE版本

8.1.4(kernel-6.5.13)我这里因为升级过kernel所以版本是比较新。

BIOS设置

需要在主板中开启IOMMU(内存虚拟化相关技术)、VT-d/AMD-V(Intel/AMD家的cpu虚拟化技术)、Above 4G Decoding(pci-e寻址相关技术)、SR-IOV(PCIE设备虚拟化相关技术)功能。

二、系统配置

1、加载虚拟化驱动

cat >/etc/modules<<EOF
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
EOF
2、屏蔽开源驱动

echo “blacklist nouveau” >> /etc/modprobe.d/pve-blacklist.conf
3、内核配置IOMMU(显卡直通用)

修改grub文件中的GRUB_CMDLINE_LINUX_DEFAULT参数: vim /etc/default/grub

# intel cpu
GRUB_CMDLINE_LINUX_DEFAULT=”quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off”

# amd cpu
GRUB_CMDLINE_LINUX_DEFAULT=”quiet intel_iommu=on iommu=pt video=efifb:off”
4、更新grub

update-grub
5、安装依赖

apt install build-essential dkms mdevctl
6、重启系统

7、验证配置

重启后可以看到vfio模块已经加载,iommu已经开启

三、获取驱动

https://foxi.buduanwang.vip/pan/vGPU/17.0/NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run

下载后执行 ./NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run -m kernel

vgpu相关的驱动需要注册企业账号才能获取,所以我们这里需要先注册一个企业账号。大家也可以通过其他人共享的网盘获取相应的驱动。

注意事项:vgpu驱动和Linux内核版本有一个最开始的支持版本关系,大家需要按照要求下载驱动。例如,如果是PVE8(6版本Linux内核)则需要下载16.0以上的vgpu驱动。链接是PVE官方对vgpu的支持信息:https://pve.proxmox.com/wiki/NVIDIA_vGPU_on_Proxmox_VE

1、注册nvidia企业账号

注册企业账号时有几个注意点,第一是必须要使用企业邮箱,不行可以自己注册一个域名配置一个邮箱;第二可以选择台湾的一个地址作为公司注册地(只要地址确实存在即可);第三申请的VDI数量可以选最少的,下面是我注册时候的选项,供大家参考。

账号注册页面链接:https://enterpriseproductregistration.nvidia.com/?LicType=EVAL&ProductFamily=vGPU

我注册时过程还是比较顺利的,不需要人工审核环节,信息提交后一会儿便收到了验证邮件,验证通过后即可下载驱动了。

2、获取驱动

使用刚刚注册的账号登录https://nvid.nvidia.com。选择software download,平台选择Linux KVM,平台版本选择所有,因为PVE8内核版本为6.5所以这里选择了大版本为16的最新小版本16.4,点击下载。

这里既可以使用Linux通用版本的驱动,也可以选择ubuntu版本的驱动,一种是通过编译安装,一种是通过dpkg来安装。在dpkg安装完成后可以通过apt –fix-broken install来安装依赖。

3、驱动文件

驱动下载后是一个压缩包,其中主要分为两类文件,一类是Host_Drivers表示是宿主机(PVE)上安装的驱动、另一类是Guest_Drivers表示为pve虚拟机上需要安装的驱动。

安装驱动

获取补丁源码【已包含vgpu_unlock】【指定版本525.125】【如果下载到已经更新好的驱动,直接跳到5.b】

git clone –recursive https://github.com/VGPU-Community-Drivers/vGPU-Unlock-patcher -b 525.125

更新驱动

4.1、将驱动文件复制到vGPU-Unlock-patcher文件夹内部

cp NVIDIA-Linux-x86_64-525.125* /root/vGPU-Unlock-patcher/

cd /root/vGPU-Unlock-patcher/

4.2、更新驱动【6.2内核需要指定 –lk6-patches;融合驱动桌面+vgpu指定 general-merge;普通驱动指定vgpu-kvm】

./patch.sh –lk6-patches general-merge

安装驱动

如果pve安装了桌面系统,需要执行以下命令,关闭桌面环境

init 3

5.a【接三、四,手动更新驱动】

cd NVIDIA———patched

./nvidia-installer –dkms

5.b【跳过三、四,直接下载-patched驱动】

进入驱动目录执行如下命令

chmod +x NVIDIA——.run

./NVIDIA——.run –dkms

chmod +x NVIDIA-Linux-x86_64-525.105.17-merged-vgpu-kvm-kernel-6.2.16-patched.run

./NVIDIA-Linux-x86_64-525.105.17-merged-vgpu-kvm-kernel-6.2.16-patched.run –dkms

1、当出现如下报错时表示我们没有安装kernel-devel相关的内核开发包,这个包对应在pve下的名字是pve-headers,所以我们需要安装该包,安装后pve将默认安装最新的内核包和相关依赖。

在完成pve-headers后需要重启服务器,重启后可以通过uname -r命令查看到内核版本已经更新。

如果使用的是PVE7的话这里可以通过指定headers版本的方式来安装:

apt install pve-headers-$(uname -r)
2、安装的过程中会提示,是否用dkms来管理驱动,这里可以选择是的话dkms会在内核发生更新后自动帮你重新编译驱动,如果在执行安装脚本时添加命令行参数–dkms也是等效的。如果不想使用dkms管理的话选否就可以了。

通过dkms管理的驱动可以通过dkms status命令查看

验证驱动安装结果

dkms status

启动vgpu服务并查看服务状态

systemctl daemon-reload

systemctl restart nvidia-{vgpu-mgr,vgpud}.service

systemctl status nvidia-{vgpu-mgr,vgpud}.service

验证最终结果

nvidia-smi

nvidia-smi -q

mdevctl types

如果需要重返桌面环境

init 5

 

附: 驱动状态查询及卸载【如需要更新内核或驱动】

dkms status

dkms uninstall -m nvidia -v 525.105.17

dkms remove -m nvidia -v 525.105.17

驱动下载地址

https://github.com/justin-himself/NVIDIA-VGPU-Driver-Archive/releases

桌面驱动

https://download.nvidia.com/XFree86/Linux-x86_64/

 

chmod 755 NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run
./NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run

3、安装完成后可以通过nvidia-smi查看显卡状态

可以通过mdevctl types命令查看显卡支持的拆分模式,我这里里输入命令后没有显示,经过排查发现是部分依赖导致,所以通过apt –fix-broken install命令进行了修复。

修复完成后查询到的信息如下:

五、vGPU的类型

对于上面步骤中查询到的vgpu类型,我们可以得知P4显卡支持A、B、Q三种切分方案,每种方案的使用场景如下,根据我的使用场景就选择Q型切分方案了。

六、配置显卡拆分

在PVE控制台选择Datacenter- Resource Mappings,找到相应的显卡选择创建。

选择一台虚拟机,点击add添加一个PCI设备,选择Mapped Device,选择刚刚创建的p4配置,选择切分类型,2Q中2的意思就是2G显存,这样一块P4最多能拆分成4块vgpu。

需要注意的是,同时只能使用一种vgpu类型,如果其中一台虚拟机绑定了GRID P4-2Q类型的vgpu则其他几台虚拟机也只能绑定该类型。

七、虚拟机安装驱动

将之前下载的驱动压缩包中的Guest_Drivers目录中中的windows驱动拷贝至虚拟机中并安装驱动。安装完成后就可以在设备管理器中看到我们的显卡了。

八、搭建GPU虚拟化授权服务器

因为英伟达的限制,如果vgpu不配置授权的话虚拟机帧率会逐渐降低,最终至3帧/秒。所以我们需要为vgpu配置相应的license(宿主机上的gpu无需配置)。所幸已经有大神帮我们把license服务器配置好了,并且打包成了镜像,我们只需要稍作配置即可。

https://lic.nvidia.space/genClientToken

上面地址下载授权文件,保存到(注意不要修改文件名):C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\
# 重启服务
Restart-Service NVDisplay.ContainerLocalSystem
# 确认license状态
nvidia-smi.exe -q | Select-String License

linux放到这里:/etc/nvidia/ClientConfigToken/
# 重启服务
service nvidia-gridd restart
# 确认license状态
nvidia-smi -q | grep License

 

1、通过如下的docker-compose文件拉起license服务器(DLS_URL修改为你的服务器内网地址,LEASE_EXPIRE_DAYS表示license的有效期我这里填了5年):

version: ‘3’
services:
dls:
container_name: dls
image: collinwebdesigns/fastapi-dls:latest
restart: always
environment:
– TZ=Asia/Shanghai
– DLS_URL=10.10.20.20
– DLS_PORT=443
– LEASE_EXPIRE_DAYS=1825
– DATABASE=sqlite:////app/database/db.sqlite
– DEBUG=false
network_mode: host
volumes:
– ./cert:/app/cert
– ./db:/app/database
2、通过docker run命令拉起服务器:

docker run -d -e DLS_URL=10.10.20.20 -e DLS_PORT=443 -p 443:443 makedie/fastapi-dls
九、激活服务器

1、windows下在powershell下以管理员运行如下命令。注意将ip替换为上一步中license服务器的地址

# 获取license
curl.exe –insecure -L -X GET https://10.10.20.20/-/client-token -o “C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_$($(Get-Date).tostring(‘dd-MM-yy-hh-mm-ss’)).tok”
# 重启服务
Restart-Service NVDisplay.ContainerLocalSystem
# 确认license状态
nvidia-smi.exe -q | Select-String License
2、linux下。注意将ip替换为上一步中license服务器的地址

# 获取license
curl –insecure -L -X GET https://10.10.20.20/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date ‘+%d-%m-%Y-%H-%M-%S’).tok
# 重启服务
service nvidia-gridd restart
# 确认license状态
nvidia-smi -q | grep License
执行结果 作者:爱科技的橙子 https://www.bilibili.com/read/cv33513142/ 出处:bilibili

十、配置显卡直通

接下来我们按照常规的直通流程将另一张显卡直通给虚拟机就可以了,现在我们就可以愉快的玩耍了,在虚拟机里开个Parsec用来串流玩游戏也是完全没问题的。

结语:

这样我们同时支持显卡虚拟化和显卡直通的PVE配置就完成了。大家如果有什么问题的话也欢迎和我交流。

 

已知问题:

1、我在epyc的cpu进行直通时只有启动服务器的第一次直通是有效的,如果使用期间对直通显卡所在的虚拟机进行停机的话就会导致虚拟机无法启动的情况。但是在5700x下就没有这个问题,到底是虚拟机配置还是平台导致的这一问题还有待研究;

2、理论上同架构的10系的显卡也支持进行虚拟化,只是需要配置vgpu unlock,但是因为我手里没有10系的显卡所以这里就没有进行测试;

3、显卡在配置license的情况下帧率也只能达到60帧,这种情况需要对vgpu进行伪装,将其伪装成消费级gpu才可以突破限制,因为我这里只是给虚拟机使用,没有用它来做nas相关的视频编解码操作,所以就没有进行测试了。

 

参考链接:

https://pve.proxmox.com/wiki/NVIDIA_vGPU_on_Proxmox_VE

https://fairysen.com/844.html

https://foxi.buduanwang.vip/virtualization/1683.html/

https://hub.docker.com/r/collinwebdesigns/fastapi-dls/tags 作者:爱科技的橙子 https://www.bilibili.com/read/cv33513142/ 出处:bilibili