DELL R730 Proxmox VE下开启vGPU - Tesla P4
DELL R730 Proxmox VE下开启vGPU - Tesla P4
对于 Proxmox VE 8,需要使用16.0+版本的 vGPU 驱动程序,低版本的驱动程序不支持 Linux 6.x 内核
前因:DELL R730 Promox VE 安装Tesla P4 通过vGPU 分配给Jellyfin硬解使用 记录使用过程
术语说明
简单介绍后面内容中的几个术语:
vGPU
vGPU 技术通过将硬件 GPU 分割成多个虚拟 GPU 以支持多个虚拟机。每个虚拟 GPU 可以被分配给不同的虚拟机,从而使多个虚拟机拥有“独显”。
vGPU-unlock
从硬件上来看,同代的数据中心显卡和消费者显卡 GPU 架构是一样的,只是驱动层限制了支持的特性。通过修改型号与宿主驱动等方式,将消费级显卡伪装成具有相同核心型号的专业卡,使得普通消费者显卡也可以支持虚拟化;对于虚拟机,同时在 vGPU 启动前后进行 hook,绕过特定检查、汇报虚假结果等,使得虚拟机的 vGPU 能正常启动。
vGPU 授权机制
在宿主机上,驱动无需授权。不过,只有企业级 GPU 能够被 vGPU 宿主机驱动所识别,消费级显卡无法合法地用于 vGPU 硬件。
在虚拟机上,使用 vGPU 客户端驱动需要获得 NVIDIA 授权。不同能力的 vGPU 子设备被分为 A、B、C、Q 四类,并对应不同的授权费用。未获得授权的驱动会逐渐降低 vGPU 子设备的性能,最终导致无法使用。
在几种 vGPU 类型中,覆盖应用场景最广的是 Q 型 vGPU,授权为 vWS。
安装流程
关于 PVE 使用 GPU 有三种方法:
显卡直通
普通显卡 + vGPU-unlock
数据中心显卡 vGPU
Tesla P4 是数据中心卡,原生支持 vGPU 功能
宿主机
安装好计算卡,查看系统是否识别到
root@pve-hanjy:~# lspci|grep -i tesla
82:00.0 3D controller: NVIDIA Corporation GP104GL [Tesla P4] (rev a1)
主板 BIOS 配置
需要开启 IOMMU / VT-d、Above 4G Decoding、SR-IOV,不同的主板选项所在位置可能不同,需要自行查找。
IOMMU 是一种地址映射技术,而 VT-d 是 Intel 对该技术的别称;Above 4G Decoding 关系到 PCI-E 设备 RAM 的 64 位寻址能力,通常用于需要让 CPU 访问全部显存的场景,使用 vGPU 时推荐开启;SR-IOV 允许一个 PCI-E 设备被多个虚拟机使用,常用于网卡等设备共享。
PVE 宿主机配置
# 把下面几行追加到 /etc/modules 里,用于加载所需的内核模块(intel主板,AMD主板略有不同) root@pve-hanjy:~# vim /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. vfio vfio_iommu_type1 vfio_pci vfio_virqfd #屏蔽开源驱动 root@pve-hanjy:~# echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf root@pve-hanjy:~# cat /etc/modprobe.d/blacklist.conf blacklist nouveau #安装所需依赖 root@pve-hanjy:~# apt install build-essential dkms mdevctl proxmox-headers-$(uname -r) -y #安装完成后重启 root@pve-hanjy:~# reboot
安装 NVIDIA Host 驱动
NVIDIA 官网的驱动是非公开的,你需要注册 NVIDIA 商业账户才可访问;当然你也可以去网上寻找驱动包,传送门:GitHub
# 本次安装环境:PVE版本8.0.4,Linux内核版本6.2.16-8,驱动版本16+ root@pve-hanjy:~# chmod +x NVIDIA-Linux-x86_64-535.54.06-vgpu-kvm.run root@pve-hanjy:~# ./NVIDIA-Linux-x86_64-535.54.06-vgpu-kvm.run
安装时需要注意是否有对应的内核头文件;路径为/usr/src 内核路径为:/boot/vmlinuz-* ,若没有则需要手动安装,以Linux内核版本6.2.16-8为例: apt install proxmox-headers-6.2.16-8-pve,否则安装驱动会报错
安装完成
验证是否安装成功并重启
root@pve-hanjy:~# dkms status nvidia/535.54.06, 6.2.16-8-pve, x86_64: installed zfs/2.1.11, 6.1.0-10-amd64, x86_64: installed zfs/2.1.11, 6.1.0-11-amd64, x86_64: installed root@pve-hanjy:~# nvidia-smi Sun Aug 27 19:42:13 2023 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.54.06 Driver Version: 535.54.06 CUDA Version: N/A | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 Tesla P4 Off | 00000000:82:00.0 Off | Off | | N/A 48C P0 24W / 75W | 32MiB / 8192MiB | 1% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| #重启 root@pve-hanjy:~# reboot
划分 PCI-E 设备给虚拟机
通过
mdevctl types | grep '^[^ ]*$'
查看所有生成了 的 PCI 设备 ID,然后通过 PVE 网页控制台给虚拟机分配 PCI 设备,设备选择刚才查到的设备 ID。该处的 MDev 字段,后面半段的数字为显存容量,字母为 vGPU 类型,这里选 Q 全能型即可,显存按需分配。root@pve-hanjy:~# mdevctl types | grep '^[^ ]*$' 0000:82:00.0
虚拟机
下面来到虚拟机的部分,从下载的驱动包内,找到文件名包含 grid
的对应系统驱动包,上传至虚拟机。
Nvidia vGPU 管理程序允许虚拟机使用旧版本 GRID 驱动,但是有一个最小的版本。
Nvidia vGPU 管理程序不允许虚拟机使用比管理程序高的 GRID 驱动。
参 考:https://docs.nvidia.com/grid/14.0/grid-vgpu-release-notes-generic-linux-kvm/index.html# vm-old-drivers-gpu-start-failure
Windows
双击运行直接根据引导安装即可,安装完成后打开 PowerShell,输入命令:
nvidia-smi.exe # 验证是否安装成功 nvidia-smi.exe -q | Select-String License # 查看授权,Unlicensed (Unrestricted) 表示未授权
至此驱动安装已经完成,再来解决授权的问题。
Linux
2.1 debian
此处以debian 系统演示,其他发行版的用户请酌情微调命令。
# 和宿主安装驱动相似,禁用 nouveau 并安装必须软件包 root@hanjy:~# echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf root@hanjy:~# apt install build-essential gcc-multilib dkms mdevctl root@hanjy:~# update-initramfs -k all -u root@hanjy:~# reboot # 重启完成后安装 Guest 驱动 root@hanjy:~# chmod +x NVIDIA-Linux-x86_64-535.54.03-grid.run root@hanjy:~# ./NVIDIA-Linux-x86_64-535.54.03-grid.run # 验证安装是否成功 root@hanjy:~# dkms status root@hanjy:~# nvidia-smi root@hanjy:~# nvidia-smi -q | grep License # 查看授权,Unlicensed (Unrestricted) 表示未授权
2.2 rocky8
禁用 nouveau 并安装必须软件包
[root@rocky8 ~]# lsmod |grep nouvea #查看是否开启了nouvea 有结果视为开启 nouveau 2367488 0 mxm_wmi 16384 1 nouveau wmi 32768 2 mxm_wmi,nouveau video 53248 1 nouveau i2c_algo_bit 16384 1 nouveau drm_dp_helper 139264 1 nouveau drm_kms_helper 176128 6 drm_dp_helper,bochs,drm_vram_helper,nouveau drm_ttm_helper 16384 3 bochs,drm_vram_helper,nouveau ttm 73728 3 drm_vram_helper,drm_ttm_helper,nouveau drm 565248 8 drm_dp_helper,drm_kms_helper,bochs,drm_vram_helper,drm_ttm_helper,ttm,nouveau 1)把驱动加入黑名单中: /etc/modprobe.d/blacklist.conf 在后面加入: [root@rocky8 ~]# echo -e ' blacklist nouveau \n options nouveau modeset=0' >> /etc/modprobe.d/blacklist.conf [root@rocky8 ~]# cat /etc/modprobe.d/blacklist.conf blacklist nouveau options nouveau modeset=0 2) 使用 dracut重新建立 initramfs nouveau 并且备份 initramfs nouveau image镜像 [root@rocky8 ~]# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak 3) 重新建立新的 the initramfs file [root@rocky8 ~]# dracut -v /boot/initramfs-$(uname -r).img $(uname -r) 4)重启,检查nouveau driver确保没有被加载! [root@rocky8 ~]# reboot [root@rocky8 ~]# lsmod | grep nouveau
开始安装驱动
#安装依赖
[root@rocky8 ~]# dnf install epel-release #安装epel源并修改国内源
[root@rocky8 ~]# sed -e 's!^metalink=!#metalink=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!https\?://download\.fedoraproject\.org/pub/epel!https://mirrors.cernet.edu.cn/epel!g' \
-e 's!https\?://download\.example/pub/epel!https://mirrors.cernet.edu.cn/epel!g' \
-i /etc/yum.repos.d/epel*.repo
[root@rocky8 ~]# dnf -y install gcc kernel-devel dkms
[root@rocky8 ~]# dnf install libglvnd-devel.x86_64
#上传驱动程序后进行安装
[root@rocky8 ~]# chmod +x NVIDIA-Linux-x86_64-535.54.03-grid.run
[root@rocky8 ~]# ./NVIDIA-Linux-x86_64-535.54.03-grid.run
#验证是否安装成功
[root@rocky8 ~]# dkms status
[root@rocky8 ~]# nvidia-smi
[root@rocky8 ~]# nvidia-smi -q | grep License # 查看授权,Unlicensed (Unrestricted) 表示未授权
至此驱动方面的安装已经完成,下面来获取授权。
授权流程
使用FastAPI-DLS授权,此方式通过模拟正规流程的激活服务器,对虚拟机进行许可证授权,支持容器部署
对于原生支持 vGPU 的显卡而言,使用 FastAPI-DLS 为最优解,整套方案除授权服务器虚假外与正规流程无异。而且只要不更新虚拟机驱动,证书验证算法不变,理论具有等同于正规授权的稳定性。
搭建授权服务器
首先安装容器环境,此步略过。
启动容器,原项目需要自行创建证书,这里使用一个二次封装的免证书容器镜像。
# 此处的DLS_URL与DLS_PORT是后续生成授权文件,告知Guest如何访问授权容器IP地址和端口 docker run -d -e DLS_URL=172.16.1.249 -e DLS_PORT=9003 -p 9003:443 makedie/fastapi-dls
获取授权
Windows
使用管理员身份启动 PowerShell 执行如下命令
# <ls-hostname-or-ip>为你的授权服务IP端口 curl.exe --insecure -L -X GET https://172.16.1.249:9003/-/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 nvidia-smi.exe -q | Select-String License # 查看授权状态
Linux
root 执行如下命令
# <ls-hostname-or-ip>为你的授权服务IP端口 curl --insecure -L -X GET https://172.16.1.249:9003/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok service nvidia-gridd restart nvidia-smi -q | grep License # 查看授权状态
本文部分内容出自于在Proxmox VE下开启vGPU - Tesla P4为例 - 雾时之森 (fairysen.com)