在Proxmox VE 8下开启vGPU – Tesla P4为例

1、对于 Proxmox VE 8,需要使用16.0+版本的 vGPU 驱动程序,低版本的驱动程序不支持 Linux 6.x 内核。

vGPU
vGPU 技术通过将硬件 GPU 分割成多个虚拟 GPU 以支持多个虚拟机。每个虚拟 GPU 可以被分配给不同的虚拟机,从而使多个虚拟机拥有“独显”。

2、关于 PVE 使用 GPU 有三种方法:
显卡直通
普通显卡 + vGPU-unlock
数据中心显卡 vGPU

3、NVIDIA® 虚拟 GPU 软件支持的 GPU(NVIDIA® Virtual GPU Software Supported GPUs)

4、物理宿主机
主板 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 里,用于加载所需的内核模块
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
 
# 屏蔽开源驱动
echo "blacklist nouveau" >> /etc/modprobe.d/pve-blacklist.conf
 
# 开启IOMMU
#编辑grub,请不要盲目改。根据自己的环境,选择设置
vi /etc/default/grub
#在里面找到:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
#然后修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
#如果是amd cpu请改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
#如果是需要显卡直通,建议在cmdline再加一句video=vesafb:off video=efifb:off video=simplefb:off,加了之后,pve重启进内核后停留在一个画面,这是正常情况
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt video=vesafb:off video=efifb:off video=simplefb:off"

修改完成之后,直接更新grub 
update-grub

注意,如果此方法还不能开启iommu,请修改 
 /etc/kernel/cmdline文件
并且使用proxmox-boot-tool refresh 更新启动项
 
# 安装依赖包
apt install build-essential dkms mdevctl pve-headers-$(uname -r)
 
# 重启机器
reboot

重启之后,在终端输入
dmesg | grep iommu
出现如下例子。则代表成功

[ 1.341100] pci 0000:00:00.0: Adding to iommu group 0
[ 1.341116] pci 0000:00:01.0: Adding to iommu group 1
[ 1.341126] pci 0000:00:02.0: Adding to iommu group 2
[ 1.341137] pci 0000:00:14.0: Adding to iommu group 3
[ 1.341146] pci 0000:00:17.0: Adding to iommu group 4

5、安装 NVIDIA Host 驱动
NVIDIA 官网的驱动是非公开的,需要注册 NVIDIA 商业账户才可访问;
vGPU16.7 KVM 驱动 NVIDIA-GRID-Linux-KVM-535.183.04-53...
链接:https://pan.baidu.com/s/181yNg67-nr1u5kF6unjrIQ?pwd=w3lh
提取码:w3lh

# 本次安装环境:PVE版本7.4-3,Linux内核版本5.15.107-2,驱动版本15.1
chmod +x NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run
./NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run
 
# 安装过程完成后可以使用以下命令验证
$ dkms status
nvidia, 525.85.07, 5.15.107-2-pve, x86_64: installed
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07    Driver Version: 525.85.07    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            On   | 00000000:81:00.0 Off |                    0 |
| N/A   53C    P8    12W /  75W |   1899MiB /  7680MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
 

6、划分 PCI-E 设备给虚拟机
通过 mdevctl types | grep '^[^ ]*$' 查看所有生成了 mdev 的 PCI 设备 ID,然后通过 PVE 网页控制台给虚拟机分配 PCI 设备,设备选择刚才查到的设备 ID。该处的 MDev 字段,后面半段的数字为显存容量,字母为 vGPU 类型,这里选 Q 全能型即可,显存按需分配。

7、Debian 系统安装vGPU。

# 禁用 nouveau 并安装必须软件包
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
apt install build-essential gcc-multilib dkms mdevctl
update-initramfs -k all -u
reboot
 
# 重启完成后安装 Guest 驱动
chmod +x NVIDIA-Linux-x86_64-430.63-grid.run
./NVIDIA-Linux-x86_64-430.63-grid.run
 
# 验证安装是否成功
dkms status
nvidia-smi
nvidia-smi -q | grep License # 查看授权,Unlicensed (Unrestricted) 表示未授权

8、安装授权
Windows
使用管理员身份启动 PowerShell 执行如下命令
# <ls-hostname-or-ip>为你的授权服务IP端口
curl.exe --insecure -L -X GET https://<dls-hostname-or-ip>/-/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

Linux
root 执行如下命令
# <ls-hostname-or-ip>为你的授权服务IP端口
curl --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok
 
service nvidia-gridd restart

9、查看授权
Windows
使用管理员身份启动 PowerShell 执行如下命令
nvidia-smi.exe -q | Select-String License # 查看授权状态

Linux
root 执行如下命令
nvidia-smi -q | grep License # 查看授权状态

向Windows Server 2016系统添加virtio驱动教程

Virtio 是 KVM 虚拟环境下针对 I/O 虚拟化的最主要的一个通用框架。
向Windows Server 2016系统添加virtio(Virtio)驱动,集成virtio驱动的Windows Server 2016的ISO镜像,在Vultr测试通过。
dism
向Windows Server 2016添加VirtIO驱动教程 集成virtio驱动的Windows Server 2016
步骤
1、安装软碟通(UltraISO)和Haozip, Haozip附带的虚拟光驱也要装上
2、安装ADK部署工具 https://developer.microsoft.com/en-us/windows/hardware/windows-assessment-deployment-kit
3、加载系统镜像cn_windows_server_2016_x64_dvd_9327743.iso到虚拟光驱
4、将boot.wim和install.wim发送到C盘
5、在C盘创建文件夹mount,将驱动解压到C盘virtio

6、以管理员权限运行”Windows PowerShell”或”Command”进入WAIK目录使用DISM (部署映像服务和管理)
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools

查看wim文件包含的版本个数
dism /get-wiminfo /wimfile:C:/boot.wim 2
dism /get-wiminfo /wimfile:C:/install.wim 4

PS C:\Program Files\Windows AIK\Tools\PETools> dism /get-wiminfo /wimfile:C:/install.wim
索引: 1
名称: Windows Server 2016 Standard
描述: 此选项(推荐使用)仅安装运行大多数服务器角色和应用程序所需的内容,从而减少了
管理和维护工作量。它不包括 GUI,但你可以使用 Windows PowerShell 或其他工具通过本
地或远程方式完全管理服务器。有关更多详细信息,请参阅“Windows Server 安装选项”

大小: 9,615,846,310 个字节

索引: 2
名称: Windows Server 2016 Standard (桌面体验)
描述: 当需要 GUI 时,此选项很有用(例如,为无法在服务器核心安装上运行的应用程序提
供向后兼容性)。支持所有服务器角色和功能。有关更多详细信息,请参阅“Windows Serve
r 安装选项”。
大小: 15,599,232,154 个字节

索引: 3
名称: Windows Server 2016 Datacenter
描述: 此选项(推荐使用)仅安装运行大多数服务器角色和应用程序所需的内容,从而减少了
管理和维护工作量。它不包括 GUI,但你可以使用 Windows PowerShell 或其他工具通过本
地或远程方式完全管理服务器。有关更多详细信息,请参阅“Windows Server 安装选项”

大小: 9,617,008,508 个字节

索引: 4
名称: Windows Server 2016 Datacenter (桌面体验)
描述: 当需要 GUI 时,此选项很有用(例如,为无法在服务器核心安装上运行的应用程序提
供向后兼容性)。支持所有服务器角色和功能。有关更多详细信息,请参阅“Windows Serve
r 安装选项”。
大小: 15,595,966,258 个字节

7、添加virtio驱动到install.wim
dism /mount-wim /wimfile:C:/install.wim /index:1 /mountdir:C:/mount 挂载install.wim映像第一个索引
添加驱动
dism /mount-wim /wimfile:C:/install.wim /index:1 /mountdir:C:/mount
dism /image:C:\mount /add-driver /driver:C:\virtio\NetKVM\2k16\amd64\netkvm.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\vioscsi\2k16\amd64\vioscsi.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\viostor\2k16\amd64\viostor.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\viorng\2k16\amd64\viorng.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\vioserial\2k16\amd64\vioser.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\Balloon\2k16\amd64\balloon.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\qxldod\2k16\amd64\qxldod.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\pvpanic\2k16\amd64\pvpanic.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\qemupciserial\2k16\amd64\qemupciserial.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\qemufwcfg\2k16\amd64\qemufwcfg.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\vioinput\2k16\amd64\vioinput.inf
Dism /Image:C:\mount /Add-Package /PackagePath:E:\HOTFIX #添加补丁文件
dism /image:C:\mount /get-drivers #获取添加的驱动信息
dism /unmount-wim /mountdir:C:/mount /commit #卸载

添加virtio驱动后查看一下安装信息,查看是否添加到映像里面。如果驱动没经过微软认证的话,记得在添加驱动那一步结尾加上”/forceunsigned”参数
dism /image:C:\mount /get-drivers

dism /unmount-wim /mountdir:C:/mount /commit 卸载映像

第二个索引
dism /mount-wim /wimfile:C:/install.wim /index:2 /mountdir:C:/mount 挂载install.wim映像第二个索引
....
....
第三个索引
dism /mount-wim /wimfile:C:/install.wim /index:3 /mountdir:C:/mount 挂载install.wim映像第三个索引
....
....
第四个索引
dism /mount-wim /wimfile:C:/install.wim /index:4 /mountdir:C:/mount 挂载install.wim映像第四个索引
....
....
7、添加virtio驱动到boot.wim
dism /get-wiminfo /wimfile:C:/boot.wim
部署映像服务和管理工具
版本: 10.0.14393.0

映像的详细信息: C:/boot.wim

索引: 1
名称: Microsoft Windows PE (x64)
描述: Microsoft Windows PE (x64)
大小: 1,745,492,664 个字节

索引: 2
名称: Microsoft Windows Setup (x64)
描述: Microsoft Windows Setup (x64)
大小: 1,863,239,432 个字节

dism /mount-wim /wimfile:C:/boot.wim /index:1-2 /mountdir:C:/mount
dism /image:C:\mount /add-driver /driver:C:\virtio\NetKVM\2k16\amd64\netkvm.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\vioscsi\2k16\amd64\vioscsi.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\viostor\2k16\amd64\viostor.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\viorng\2k16\amd64\viorng.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\vioserial\2k16\amd64\vioser.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\Balloon\2k16\amd64\balloon.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\qxldod\2k16\amd64\qxldod.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\pvpanic\2k16\amd64\pvpanic.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\qemupciserial\2k16\amd64\qemupciserial.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\qemufwcfg\2k16\amd64\qemufwcfg.inf
dism /image:C:\mount /add-driver /driver:C:\virtio\vioinput\2k16\amd64\vioinput.inf
Dism /Image:C:\mount /Add-Package /PackagePath:E:\HOTFIX #添加补丁文件
dism /image:C:\mount /get-drivers #获取添加的驱动信息
dism /unmount-wim /mountdir:C:/mount /commit #卸载
----------------------------------------
NetKVM/: Virtio Network driver
viostor/: Virtio Block driver
vioscsi/: Virtio SCSI driver
viorng/: Virtio RNG driver
vioser/: Virtio serial driver
Balloon/: Virtio Memory Balloon driver
qxl/: QXL graphics driver for Windows 7 and earlier. (build virtio-win-0.1.103-1 and later)
qxldod/: QXL graphics driver for Windows 8 and later. (build virtio-win-0.1.103-2 and later)
pvpanic/: QEMU pvpanic device driver (build virtio-win-0.1.103-2 and later)
guest-agent/: QEMU Guest Agent 32bit and 64bit MSI installers
qemupciserial/: QEMU PCI serial device driver
*.vfd: VFD floppy images for using during install of Windows XP
-----------------------------------------------------------------------------------
添加virtio驱动脚本(未测试)

@echo off
set bootvar=0
set /p bootwimpath=请输入wim文件完整路径例如(D:\boot.wim):
set /p installlwimpath=请输入wim文件完整路径例如(D:\install.wim):
set /p temppath=请输入临时目录完整路径确保文件夹为空(例如:D:\temp):
set /p driverpath=请输入要加入的驱动路径(例如:D:\win2008r2):
dism /get-wiminfo /wimfile:%bootwimpath%
set /p bootcount=请输入当前boot.wim文件所包含的版本个数:
dism /get-wiminfo /wimfile:%installlwimpath%
set /p installcount=请输入当前install.wim文件所包含的版本个数:
rem ************循环开始了
:bootcontinue
set /a bootvar+=1
echo boot.wim第%bootvar%次循环 >>dism.log
echo ====================================================================================== >>dism.log
echo 为boot.wim加载驱动 >> dism.log
dism /mount-wim /wimfile:%bootwimpath% /index:%bootvar% /mountdir:%temppath% >>dism.log
dism /image:%temppath% /add-driver /driver:%driverpath% /recurse /forceunsigned >>dism.log
dism /unmount-wim /mountdir:%temppath% /commit >>dism.log
echo 等待5s准备导入下一版本,如需取消请立即按Ctrl+C >>dism.log
rem 等待10秒 ping本机10次不使用默认的次数,nul是不显示ping信息:
@ping -n 5 127.1>nul
if %bootvar% lss %bootcount% goto bootcontinue
rem ************循环结束了
echo boot.wim循环执行完毕 >>dism.log

set varinstall=0
rem ************循环开始了
:installcontinue
set /a varinstall+=1
echo install.wim第%varinstall%次循环 >>dism.log
echo ====================================================================================== >>dism.log
dism /mount-wim /wimfile:%installlwimpath% /index:%varinstall% /mountdir:%temppath% >>dism.log
dism /image:%temppath% /add-driver /driver:%driverpath% /recurse /forceunsigned >>dism.log
dism /unmount-wim /mountdir:%temppath% /commit >>dism.log
echo 等待5s准备导入下一版本,如需取消请立即按Ctrl+C >>dism.log
rem 等待10秒 ping本机10次不使用默认的次数,nul是不显示ping信息:
@ping -n 5 127.1>nul
if %varinstall% lss %installcount% goto installcontinue
rem ************循环结束了
echo install.wim循环执行完毕 >>dism.log
pause
在D:根目录创建一个test.bat文件,将上面脚本拷入文件中,执行脚本,输入所需路径参数 ,boot.wim版本数为2
-----------------------------------------------------------------------------------

8、封装处理
使用UltraISO, 打开cn_windows_server_2016_x64_dvd_9327743.iso将镜像里的boot.wim和install.wim删除(路径:/sources),
再将刚开始从镜像里提取到c盘的boot.wim和install.wim添加进去,然后保存即可。

Haozip http://haozip.com/
Windows 10 (Windows Server 2016) ADK https://developer.microsoft.com/en-us/windows/hardware/windows-assessment-deployment-kit
virtio驱动下载地址 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
virtio驱动相关说明 http://pve.proxmox.com/wiki/Windows_VirtIO_Drivers
DISM – 部署映像服务和管理 (DISM) 技术参考 http://technet.microsoft.com/zh-cn/library/hh824821.aspx

集成virtio驱动的Windows Server 2016的ISO镜像 http://arv.asuhu.com/cn_windows_server_2016_vl_x64_dvd_11636695_vitio_20180415.iso
集成virtio驱动的Windows 10 的ISO镜像 http://arv.asuhu.com/cn_windows_10_multi-edition_vl_version_1709_updated_dec_2017_x64_dvd_100406208_virtio_20180202.iso