Ahao's Studio.

私人云游戏服务器搭建

2024/03/20

方案:PVE8.1.x 安装 P40 vGPU 驱动并授权

术语说明

简单介绍后面内容中的几个术语:

  • vGPU

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

  • vGPU-unlock

    从硬件上来看,同代的数据中心显卡和消费者显卡 GPU 架构是一样的,只是驱动层限制了支持的特性。通过修改型号与宿主驱动等方式,将消费级显卡伪装成具有相同核心型号的专业卡,使得普通消费者显卡也可以支持虚拟化;对于虚拟机,同时在 vGPU 启动前后进行 hook,绕过特定检查、汇报虚假结果等,使得虚拟机的 vGPU 能正常启动。目前支持的消费卡型号可以参考此文章的第三点。

  • vGPU 授权机制

    在宿主机上,驱动无需授权。不过,只有企业级 GPU 能够被 vGPU 宿主机驱动所识别,消费级显卡无法合法地用于 vGPU 硬件。

    在虚拟机上,使用 vGPU 客户端驱动需要获得 NVIDIA 授权。不同能力的 vGPU 子设备被分为 A、B、C、Q 四类,并对应不同的授权费用。未获得授权的驱动会逐渐降低 vGPU 子设备的性能,最终导致无法使用。可参考:关于 NVIDIA vGPU 软件许可

    在几种 vGPU 类型中,覆盖应用场景最广的是 Q 型 vGPU,授权为 vWS。

前情提要

关于 PVE 使用 GPU 有三种方法:

  • 显卡直通
  • 普通显卡 + vGPU-unlock
  • 数据中心显卡 vGPU

Tesla P40 是数据中心卡,原生支持 vGPU 功能,所以本文不涉及 vGPU-unlock,如需了解可以参考 PolloLoco 的 NVIDIA vGPU Guide

安装流程(需自行配置BIOS)

宿主机

  1. 主板 BIOS 配置(需自行配置)

    需要在主板 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 设备被多个虚拟机使用,常用于网卡等设备共享。

  2. PVE 宿主机配置

    配置软件源,安装必要的软件包,配置内核,配置引导

  3. 安装 NVIDIA Host 驱动

    NVIDIA 官网的驱动是非公开的,你需要注册 NVIDIA 商业账户才可访问;当然你也可以去网上寻找驱动包,比如:APQA 网盘GitHub 等

确认系统和驱动版本

版本信息:
root@pve :~# pveversion
pve-manager/8.1.4/ec 5 affc 9 e 41 f 1 d 79 (running kernel: 6.5.13-1-pve)

(已废弃方案:kernel 降级安装 16.0 的 vGPU 驱动)

内核版本和 vGPU 软件版本对应可参考 NVIDIA vGPU on Proxmox VE - Proxmox VE

pve-manager kernel vGPU Software Branch NVIDIA Host drivers
7.2-7 5.15.39-2-pve 14.1 510.73.06
7.2-7 5.15.39-2-pve 14.2 510.85.03
7.4-3 5.15.107-2-pve 15.2 525.105.14
7.4-17 6.2.16-20-bpo11-pve 16.0 535.54.06
8.1.4 6.5.11-8-pve 16.3 535.154.02
8.1.4 6.5.13-1-pve 16.3 535.154.02

本文使用 535.154.02 ,16.3 版本的驱动

开始部署

配置环境

  • 在开始下列步骤之前,需要在主板 BIOS 中开启开启 IOMMU / VT-d、Above 4 G Decoding、SR-IOV,不同的主板选项所在位置可能不同,需要自行查找,本文在此不作举例。

禁用企业源,添加国内源

  • Web 后台 禁用企业源

Pastedimage20240301140858

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载中科大的GPG KEY
wget https://mirrors.ustc.edu.cn/proxmox/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg

# 使用Proxmox非企业版源
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list

# 将Debian官方源替换为中科大源
sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list

# 替换Ceph源
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription" > /etc/apt/sources.list.d/ceph.list

# 替换CT镜像下载源
sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

安装必要软件包

1
apt update && apt install dkms  git build-essential pve-kernel-5.15 pve-headers-5.15 dkms cargo jq uuid-runtime -y

配置内核

1
2
3
4
5
6
7
echo vfio >> /etc/modules 
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
update-initramfs -k all -u

配置引导

1
2
3
4
5
6
7
8
9
10
11
12
13
#编辑grub,请不要盲目改。根据自己的环境,选择设置
nano /etc/default/grub
#在里面找到:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
#然后修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
#如果是amd cpu请改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
#更新引导
update-grub

#环境配置完成,重启生效
reboot

验证环境配置

再次检查内核版本

1
2
uname -r
#6.5.13-1-pve

验证是否开启iommu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

dmesg | grep iommu #查询命令

出现有如下iommu group说明成功
root@pve:~# dmesg | grep iommu
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.5.13-1-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on
[ 0.588407] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.5.13-1-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on
[ 2.479162] iommu: Default domain type: Translated
[ 2.479162] iommu: DMA domain TLB invalidation policy: lazy mode
[ 2.551750] pci 0000:80:01.0: Adding to iommu group 0
[ 2.551840] pci 0000:80:02.0: Adding to iommu group 1

...

[ 2.588880] pci 0000:ff:1f.2: Adding to iommu group 100
[ 50.303181] nvidia-vgpu-vfio 00000000-0000-0000-0000-000000000104: Adding to iommu group 101

验证nouveau是否未启用

1
2
3
4
5
6

lsmod | grep nouveau #查询命令

无输出,代表未启用
root@pve3:~# lsmod|grep nouveau
root@pve3:~#

下载并安装vGPU 驱动

  • 从 APQA 云盘下载驱动压缩包 下载链接
    (包括宿主机-host 和虚拟机-guest 的驱动程序和文档等,十分贴心)

  • 下载压缩包解压后,将 Host_Drivers 文件夹中的 NVIDIA-Linux-x 86_64-535.154.02-vgpu-kvm. run上传到 pve,并执行安装

1
2
3
4
5
6
#r如果安装了显卡驱动,先卸载
./NVIDIA-Linux-x86_64-535.154.02-vgpu-kvm.run --uninstall
sudo apt-get remove --purge nvidia-*

chmod +x NVIDIA-Linux-x86_64-535.154.02-vgpu-kvm.run
./NVIDIA-Linux-x86_64-535.154.02-vgpu-kvm.run

(示例安装图是旧版方案的,懒得替换了,流程是一致的)
Pastedimage20240306094701

以DKMSs方式安装驱动(选择 YES)

Pasted image 20240306094717
Pasted image 20240306094730

显示安装完成后,检查驱动

1
nvidia-smi
  • 如正常显示,则安装成功可进行下一步。
  • Pasted image 20240316203655

直通设备给虚拟机

Win 10

获取物理 GPU 的 PCI 设备 bus/device/function (BDF):

  • 获取 GPU 设备的 BDF
1
lspci | grep NVIDIA

此时看到的物理 GPU 设备如下:
04:00.0 3D controller: NVIDIA Corporation GP102GL [Tesla P40] (rev a1)
这里显示输出的 04:00.0 就是 GPU 的 PCI 设备 BDF

扫描输出对应的 NVIDIA Virtual GPU 组合设备规格:

使用 mdevctl types 命令扫描 mdev_suppo #Site01rted_types  目录获得 NVIDIA Virtual GPU (vGPU) 设备配置

1
mdevctl types

可以看到不同规格 vGPU 命名以及对应配置, 即为配置完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@pve:~# mdevctl types
0000:04:00.0
nvidia-156
Available instances: 0
Device API: vfio-pci
Name: GRID P40-2B
Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12
nvidia-215
Available instances: 0

... ...

Description: num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=1280x1024, max_instance=1
nvidia-62
Available instances: 0
Device API: vfio-pci
Name: GRID P40-1B
Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24

  • 每种规格末尾有一个 A/B/C/Q 标识类型
  • vGPU 类型和用途关系
类型 建议用途
A 虚拟应用程序(Virtual Applications / vApps)
B 虚拟桌面(Virtual Desktops / vPC)
C AI/机器学习/训练( vCS or vWS )
Q 虚拟工作站 (Virtual Workstations / vWS)

给虚拟机分配 vGPU

登录 PVE Web 后台,在对应的 Windows 虚拟机下添加原始设备(对应设备 BDF)
按需配置显存大小,本例使用 Q 通用型 12G 显存

Pasted image 20240317083344

Windows 安装 GRID 驱动

  • 为后续方便操作,建议提前在 PVE Web 后台使用 NoVNC 操作开启对应虚拟机 RDP

启动 Windows 虚拟机,将驱动包中的 Guest_Drivers 中的538.15_grid_win10_win11_server2019_server2022_dch_64bit_international.exe
上传到虚拟机,并安装(过程略,下一步就行)

驱动安装时记得选择安装虚拟屏幕驱动,最高支持 7680 x 5120 的分辨率,(虽然串流只支持 4K

vGPU 授权

授权流程

授权方法分为如下几种方式:

  1. 向 NVIDIA 申请 90 天 free license(NVIDIA 中国只面向企业用户发放免费授权,个人可以尝试去海外官网申请),到期后购买 license
    (注册后要和邮件说明注册理由,地址填 HongKong 给我安排纯英文商务邮件)
  2. Rust-based vgpu_unlock,通过 vGPU 伪装,从而可以在虚拟机使用不需要授权的消费级显卡驱动,此方式是唯一支持消费级显卡的方式
  3. vGPU_LicenseBypass,此方式将不限制性能的时间从 20 分钟延长为一天,并且每天定时重启驱动,以达成一直不受限的目地,但不适合需要长时间运行 GPU 的场景
  4. FastAPI-DLS,此方式通过模拟正规流程的激活服务器,对虚拟机进行许可证授权,支持容器部署

对于原生支持 vGPU 的显卡而言,使用 FastAPI-DLS 为最优解,整套方案除授权服务器虚假外与正规流程无异。而且只要不更新虚拟机驱动,证书验证算法不变,理论具有等同于正规授权的稳定性。

搭建授权服务器

  1. 首先安装容器环境,此步略过。
  2. 启动容器,原项目需要自行创建证书,这里使用一个二次封装的免证书容器镜像。
  • 本例中使用授权服务器 IP 10.0.0.6,仅作举例,记得替换成自己的
    1
    2
    3
    # 此处的DLS_URL与DLS_PORT是后续生成授权文件,告知Guest如何访问授权容器IP地址和端口
    # 需替换DLS_URL为授权服务器ip(可在本机docker环境搭建,替换为本机IP)
    docker run -d -e DLS_URL=10.0.0.6 -e DLS_PORT=443 -p 443:443 makedie/fastapi-dls

获取授权

  • 使用管理员身份启动 PowerShell 执行如下命令
1
2
3
4
5
6
# <ls-hostname-or-ip>为你的授权服务IP端口
curl.exe --insecure -L -X GET https://10.0.0.6/-/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
# 查看授权状态

Pasted image 20240317094525

  • 现在 vGPU 已经可以正常使用了,只要确保授权服务容器正常运行,grid 驱动就会自动续期
  • DEBUG:如显示授权失败可尝试 # 来自民间的NVIDIA VGPU授权fastapi-dls 中最后的”应用授权“部分方法手动下载文件,然后重启

# pve 7/8 kvmqemu 反虚拟化检测(可选)

1.更为安全的方式:参照上文和项目对应 kvm 版本(或 PVE 版本),自行编译(在此不再赘述)

2.最简单快捷的方式:在 Q群中) 找到对应版本已经编译好的 deb 文件,直接安装
请务必确认版本,Web 端左上角 Virtual Environment 8.1.4 这个和 kvm 包比如 8.0.2-4 版本是不一样的哈

查看你目前使用的 kvm 版本:

1
dpkg -l | grep kvm 

Pasted image 20240317091446

下载并上传到 pve ,
使用 dpkg 安装

1
dpkg -i pve-qemu-kvm_Your_KVM_Version_amd64_anti_detection.deb

在 Web 后台修改对应虚拟机 bios 为 ovmf,机型选 i440

然后在虚拟机配置文件中添加参数
虚拟机配置文件在 /etc/pve/qemu-server/xxx.conf ( xxx 为对应的虚拟机 ID )
使用 vim 打开,并添加:

1
args: -cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true, -smbios type=0,vendor="American Megatrends International LLC.",version=H3.7G,date='02/21/2023' -smbios type=1,manufacturer="Maxsun",product="MS-Terminator B760M",version="VER:H3.7G(2022/11/29)" -smbios type=2,manufacturer="Maxsun",product="MS-Terminator B760M",version="VER:H3.7G(2022/11/29)" -smbios type=17,manufacturer="KINGSTON",speed=3200,serial=DF1EC466,part=SED3200U1888S

Pasted image 20240317092447

启动 Windows 虚拟机,如看到下图所示设备名,则配置完成

Pasted image 20240317101032

可顺带使用群内虚拟机检测软件进行测试

Pastedimage20240317101047

Linux (还没开始玩)


至此,完成部署


游戏串流

使用方案

实测

  • 需要每次开机后使用 RDP 连接,然后 vGPU 验证授权才会执行,之后就可以使用 Parsec 串流了(小问题)

  • 串流时没间隔一段时间有卡顿(瞬时延迟高、编解码耗时长),未找到原因,怀疑是 SATA 固态读写问题,考虑换 NVME (nmon 查看磁盘读写占用在地图加载等场景中占用高)

  • Snipaste_2024-03-14_21-31-54

  • blog111

  • 我的 PVE (一堆虚拟机)上唯一一块 Intel 1.6T SATA 固态盘:

  • 245d0a87d1c985e4723604fde01b9a0

  • 2024 年 3 月 28 日更新:已购入二手 Inte; P4610 1.6 T ,待部署,后面补充换盘后测试结果。

图穷匕见

其实,这一篇教你怎么PVE8.1.x 安装 P40 vGPU 驱动并授权,实现私人云游戏 玩原神的文章

欸嘿⭐~

参考文献

ProTechEx/vgpu-proxmox (github.com)
GreenDamTan/fastapi-dls (github.com)
zhaodice/proxmox-ve-anti-detection: A patch to hide PVE itself (github.com)
安装NVIDIA Virtual GPU Manager — Cloud Atlas beta 文档 (cloud-atlas.readthedocs.io)
第四章 配置vGPU — Proxmox VE Nvidia-vGPU doc 6.4 文档 (pve-doc-cn.readthedocs.io)
在Proxmox VE下开启vGPU - Tesla P4为例 - 雾时之森 (fairysen.com)
vGPU在Proxmox VE下的配置与使用 – 雪林荧光 (xinalin.com)
PVE+Tesla P4 vGPU All IN ONE NAS 折腾小记 | 梓喵出没 (azimiao.com)
佛西博客 - 基于Proxmox VE的VDI云桌面解决方案 (buduanwang.vip)
佛西博客 - Proxmox VE vGPU 教程汇总 (buduanwang.vip)

CATALOG
  1. 1. 方案:PVE8.1.x 安装 P40 vGPU 驱动并授权
  2. 2. 术语说明
  3. 3. 前情提要
  4. 4. 安装流程(需自行配置BIOS)
    1. 4.1. 宿主机
  5. 5. 确认系统和驱动版本
  6. 6. 开始部署
    1. 6.1. 配置环境
      1. 6.1.1. 禁用企业源,添加国内源
      2. 6.1.2. 安装必要软件包
      3. 6.1.3. 配置内核
      4. 6.1.4. 配置引导
    2. 6.2. 验证环境配置
    3. 6.3. 下载并安装vGPU 驱动
    4. 6.4. 直通设备给虚拟机
      1. 6.4.1. Win 10
        1. 6.4.1.1. 获取物理 GPU 的 PCI 设备 bus/device/function (BDF):
        2. 6.4.1.2. 扫描输出对应的 NVIDIA Virtual GPU 组合设备规格:
      2. 6.4.2. 给虚拟机分配 vGPU
      3. 6.4.3. Windows 安装 GRID 驱动
      4. 6.4.4. vGPU 授权
        1. 6.4.4.1. 授权流程
        2. 6.4.4.2. 搭建授权服务器
        3. 6.4.4.3. 获取授权
    5. 6.5. # pve 7/8 kvmqemu 反虚拟化检测(可选)
      1. 6.5.1. Linux (还没开始玩)
  7. 7. 游戏串流
    1. 7.1. 使用方案
    2. 7.2. 实测
  8. 8. 图穷匕见