Skip to content

Proxmox VE 7 配置 nvidia vGPU (vgpu_unlock)

woniuzfb edited this page Aug 17, 2021 · 1 revision

概念说明

  • 这里使用的是 vgpu_unlock 脚本解锁, 但是不通过 PVE 的 webui 添加 GPU, 而是直接修改虚拟机的配置文件添加一行 args 在虚拟机内伪装成其他显卡(或者仍然伪装是自己?)
  • 为什么不通过 PVE 的 webui 添加 GPU 设备呢? 简单的说就是无法指定虚拟机伪装, 无法指定虚拟机伪装就很可能只能在虚拟机(比如 win10)使用 nvidia 的 vGPU 的 win10 驱动, 这个驱动需要验证授权, 所以还要安装 license server, 相当的麻烦, 授权试用期还只有 90 天
  • 再说伪装成其他显卡, 一般消费级显卡都能在 vgpu_unlock 找到对应的官方支持 vgpu 的显卡, 比如 vgpu_unlock 将 1080Ti 在 host(比如 proxmox) 伪装成 Tesla P40, 这样就可以欺骗 host 上的 nvidia Grid vgpu 驱动(P40 确实是官方支持 vgpu 的显卡), 但是这并不妨碍你在 guest(虚拟机, 比如 win10) 伪装成其他显卡. 而且虚拟机 win10 内无法安装 Tesla P40 的官网驱动. 所以你可以伪装成 Quadro P6000, 然后在虚拟机内安装 nvidia 官网的驱动就可以
  • 在虚拟机伪装显卡只要在虚拟机配置文件添加 args: -device 'vfio-pci,sysfsdev=/sys/bus/mdev/devices/[UUID],display=off,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,x-pci-vendor-id=0x10de,x-pci-device-id=[PCI-ID],x-pci-sub-vendor-id=0x10de,x-pci-sub-device-id=0x11A0' -uuid [UUID] UUID 随机的可以, pve 下安装 uuid-runtime, 然后使用 uuidgen 就能生成 UUID. 最重要的是 [PCI-ID], 这是伪装其他显卡的关键, 以 1080Ti 为例, 我们可以在 这里 查到你的显卡的 pci-id, 然后伪装成其他 Quadro P6000(0x1b30) 或者 Tesla P40(0x1b38), 这里的情况下选择 0x1b30
  • 我们还需要在 host 控制 mdev, 我们用 mdevctl , 安装很方便, 看下面
  • 最后要考虑的是版本问题, 包括 host 下 Grid vGPU 驱动版本和虚拟机内驱动版本. Proxmox VE 7 下我已经测试过了最合适的是 460.32.04 版本, 这个版本可以完美通过 mdevctl 控制. nvidia 限制了 host 驱动版本和虚拟机内驱动版本的关系, 简单的说就是如果 host 版本是 460.32.04, 虚拟机内的驱动你只能安装 460~462(可能不包含462) 版本的驱动, 注意驱动下载链接一定不含 dch 字样, 应该是这样, 别下载错了. 否则你在 /var/log/syslog 里看到 nvidia-vgpu-mgr 输出 虚拟机内驱动版本太新或者太旧的错误信息

安装步骤

  1. 准备工作

可能需要先升级 bios

apt update
apt upgrade
apt install pve-headers
reboot
  1. 如果 systemd-boot 启动的 (有 /etc/kernel/cmdline 文件存在)

i915.enable_gvt=1 是顺便添加, 用于 intel 核显 GVT-g 直通, 你可以省略

在文件 /etc/kernel/cmdline 内

Intel CPU 的添加:
intel_iommu=on iommu=pt i915.enable_gvt=1 pcie_acs_override=downstream,multifunction

Amd CPU 的添加:
amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction

proxmox-boot-tool refresh
  1. 如果 Grub 启动的 (没有 /etc/kernel/cmdline 文件)

i915.enable_gvt=1 是顺便添加, 用于 intel 核显 GVT-g 直通, 你可以省略

在 /etc/default/grub 文件修改 GRUB_CMDLINE_LINUX_DEFAULT 这一行
添加 GRUB_CMDLINE_LINUX_DEFAULT 的值:

Intel CPU 的添加:
intel_iommu=on iommu=pt i915.enable_gvt=1 pcie_acs_override=downstream,multifunction

Amd CPU 的添加:
amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction

update-grub
cat >> /etc/modules << EOF
kvmgt
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
EOF

echo 'options kvm ignore_msrs=1 report_ignored_msrs=0' >> /etc/modprobe.d/kvm.conf

cat >> /etc/modprobe.d/nvidia.conf << EOF
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915
blacklist radeon
blacklist nouveau
options nouveau modeset=0
EOF

update-initramfs -u -k all

reboot
  1. 重启后安装 Grid vGPU 驱动

上传 NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run 到 pve 的 /root/ 目录

上传 460.32.04.patch 到 pve 的 /root/ 目录

上传 cvgpu.c 到 pve 的 /root/ 目录

apt install dkms python3 python3-pip git uuid-runtime patchelf mdevctl

pip install frida

cd /opt

git clone https://github.com/DualCoder/vgpu_unlock

sed -i 's/#if 0/#if 1/' vgpu_unlock/vgpu_unlock_hooks.c

cd ~

gcc -fPIC -shared -o cvgpu.o cvgpu.c

sh NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run -x

cd NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm

patch -p1 < ../460.32.04.patch

./nvidia-installer --dkms

patchelf --add-needed /root/cvgpu.o /usr/bin/nvidia-smi

reboot

  1. 重启后确定 mdevctl types 能看到很多 vGPU 配置后, 新建虚拟机(win10 为例)
  • 不要选开机启动, 安装的 iso 镜像设置好(当然按照你的情况设置), 类别选 windows
  • BIOS 选择 OVMF(UEFI), 存储选好, 机器(machine) 选 q35
  • 硬盘只要改个 '磁盘大小', CPU 核数设置好, 内存设置好, 网络默认不要动
  • 其他设置均默认即可
  1. 开启虚拟机, 打开 noVNC 开始安装 windows, 安装完成后关闭 windows

  2. 修改 /etc/pve/qemu-server/100.conf 在第一行插入

100 是你的虚拟机 ID

[UUID] (2个地方) 换成 uuidgen 输出的内容, 比如 c8e2ebf4-250a-4278-be9f-a45e3a8c45b2

[PCI-ID] 换成你想要伪装的(怎么知道? 看最上面的 概念说明)

args: -device 'vfio-pci,sysfsdev=/sys/bus/mdev/devices/[UUID],display=off,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,x-pci-vendor-id=0x10de,x-pci-device-id=[PCI-ID],x-pci-sub-vendor-id=0x10de,x-pci-sub-device-id=0x11A0' -uuid [UUID]

[UUID] 替换成上面的 uuidgen 输出的内容

nvidia-49 是什么? 用 mdevctl types 查看可供的选择, 主要看 framebuffer, 我这里 nvidia-49 是 4096M, 即虚拟机占用 4G

0000:01:00.0 替换成用 lspci -Dnnk 查找到你的 GPU 的对应值

mdevctl start -u [UUID] -p 0000:01:00.0 --type nvidia-49
  1. 开启虚拟机, 进入后到 nvidia 官网下载对应伪装的 GPU 驱动, 不知道怎么选版本号? 看最上面的 概念说明

100 是你的虚拟机 ID

qm start 100
  1. 驱动安装完成后, windows 设置里电源休眠改为从不, 然后可以选择开启 RDP 或者用 parsec + VB-Cable + rtss, 重启完成, 通过 RDP(硬解需要另外设置) 或者 parsec 连接虚拟机

  2. 关闭虚拟机后可以执行 mdevctl stop -u [UUID], 再开虚拟机之前执行 mdevctl start -u [UUID] -p 0000:01:00.0 --type nvidia-49, 如果要开机自动打开, 可以执行 mdevctl define --auto -u [UUID]

  3. 监控 vGPU 执行命令 nvidia-smi -l 1 每一秒刷新状态

Clone this wiki locally