-
Notifications
You must be signed in to change notification settings - Fork 293
Proxmox VE 7 配置 nvidia vGPU (vgpu_unlock)
- 这里使用的是 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 输出 虚拟机内驱动版本太新或者太旧的错误信息
- 准备工作
你可能需要先升级 bios
apt update
apt upgrade
apt install pve-headers
reboot
- 如果 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
- 如果 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
- 重启后安装 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
- 重启后确定
mdevctl types
能看到很多 vGPU 配置后, 新建虚拟机(win10 为例)
- 不要选开机启动, 安装的 iso 镜像设置好(当然按照你的情况设置), 类别选 windows
- BIOS 选择 OVMF(UEFI), 存储选好, 机器(machine) 选 q35
- 硬盘只要改个 '磁盘大小', CPU 核数设置好, 内存设置好, 网络默认不要动
- 其他设置均默认即可
-
开启虚拟机, 打开 noVNC 开始安装 windows, 安装完成后关闭 windows
-
修改
/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
- 开启虚拟机, 进入后到 nvidia 官网下载对应伪装的 GPU 驱动, 不知道怎么选版本号? 看最上面的 概念说明
100 是你的虚拟机 ID
qm start 100