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)
  1. 主板 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 宿主机配置

    # 把下面几行追加到 /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
  3. 安装 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

  4. 划分 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

  1. Windows

    双击运行直接根据引导安装即可,安装完成后打开 PowerShell,输入命令:

    nvidia-smi.exe # 验证是否安装成功
    nvidia-smi.exe -q | Select-String License # 查看授权,Unlicensed (Unrestricted) 表示未授权
    

    至此驱动安装已经完成,再来解决授权的问题。

  2. 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 为最优解,整套方案除授权服务器虚假外与正规流程无异。而且只要不更新虚拟机驱动,证书验证算法不变,理论具有等同于正规授权的稳定性。

搭建授权服务器

  1. 首先安装容器环境,此步略过。

  2. 启动容器,原项目需要自行创建证书,这里使用一个二次封装的免证书容器镜像。

    # 此处的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
    

获取授权

  1. 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 # 查看授权状态
    
  2. 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)