PVE8.X N卡虚拟化VGPU--基于1050Ti

顺带接有偿部署,有需要可以加博主微信
微信:ha_July

记录一下pve8.X 配置N卡虚拟化的一些设置,基于GTX1050Ti。

PVE8.1.4

硬件配置

配置型号
系统PVE 8.1.4
内核Linux 6.5.11-8-pve
CPUIntel Core i5-7500 @ 3.4GHz 4核4线程
显卡GTX1050 Ti 4096MB
VGPU驱动535.129.03

PVE基本设置

安装PVE过程略过,提前将pve安装好,在安装VGPU前先将pve底层设置优化一下
本篇文章将大量使用nano文本编辑命令,至于怎么使用自行百度,这里不重复造轮子了。 知道如何保存就行Ctrl +X 输入“Y”回车保存

BIOS设置

提前在BIOS开启以下参数

  • 开启VT-d --硬件直通必须开启
  • 开启SRIOV --如有
  • 开启Above 4G --如有
  • 关闭安全启动 --在security菜单 secure boot 改disabled

更换系统源

国内清华源

# 编辑sources.list
nano /etc/apt/sources.list
# 将原有的源链接在句首加 # 注释掉,更换以下清华源信息
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware

更换企业源

国内清华源

# 编辑pve-enterprise.list
nano /etc/apt/sources.list.d/pve-enterprise.list
# 将原有的源链接在句首加 # 注释掉,更换以下清华源信息
deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm pve-no-subscription

修复源401错误

# 编辑ceph.list
nano /etc/apt/sources.list.d/ceph.list
# 将原有的源链接在句首加 # 注释掉,添加中科大ceph源
deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription

执行更新源

apt update 

LXC容器更源

国内清华源

# 备份APLInfo.pm
cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
# 替换为清华源:
sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
# 重启服务后生效
systemctl restart pvedaemon.service

PVE常用优化脚本

去掉登录订阅提示,合并local-lvm以最大化利用硬盘空间,添加CPU频率硬盘温度,删掉不用的内核等信息

# 下载pve_source二进制文件到/root目录
wget https://yangwenqing.com/files/pve/pve_source && chmod +x pve_source && ./pve_source

开启硬件直通

需要提前在主板BIOS开启虚拟化功能,才能开启硬件直通。在BIOS开启vt-d,AMD平台是iommu,并且开启SRIOVAbove 4G选项
使用nano命令编辑/etc/default/grub

Intel CPU

nano /etc/default/grub 
# 开启iommu分组,在里面找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet"项将其修改为
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"
# 更新grub
update-grub

加载内核模块

编辑nano /etc/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

屏蔽设备

添加设备黑名单,编辑pve-blacklist.conf

# 编辑pve-blacklist.conf
nano /etc/modprobe.d/pve-blacklist.conf
# 直通AMD显卡,请使用下面命令
blacklist radeon
blacklist amdgpu 
# 直通NVIDIA显卡,请使用下面命令
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
# 直通INTEL核显,请使用下面命令
blacklist i915
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
# 允许不安全的设备中断
options vfio_iommu_type1 allow_unsafe_interrupts=1

执行更新initramfs

# 更新initramfs
update-initramfs -u -k all
# 重启
reboot

验证是否开启直通

# 验证是否开启iommu
dmesg | grep iommu
或者
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

出现如下例子。则代表成功

[ 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

此时输入命令

find /sys/kernel/iommu_groups/ -type l 
#出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
lsmod | grep vfio
# 检测模块是否加载
vfio_pci               16384  4
vfio_pci_core          94208  1 vfio_pci
vfio_iommu_type1       49152  2
vfio                   57344  17 vfio_pci_core,vfio_iommu_type1,vfio_pci
iommufd                73728  1 vfio
irqbypass              16384  41 vfio_pci_core,kvm
#出现这类信息,就代表成功了。

配置VGPU_Unlock

# 创建vgpu_unlock文件夹
mkdir /etc/vgpu_unlock
# 创建profile_override.toml文件
touch /etc/vgpu_unlock/profile_override.toml
# 创建nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d启动服务
mkdir /etc/systemd/system/{nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d}
# 写入路径信息
echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf
echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf
# 重新加载服务
systemctl daemon-reload

执行完成后,cat下查看服务配置是否与下边一致

cat /etc/systemd/system/{nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d}/*
[Service]
Environment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so
[Service]
Environment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so

下载预编译好的libvgpu_unlock_rs.so文件

mkdir -p /opt/vgpu_unlock-rs/target/release
cd /opt/vgpu_unlock-rs/target/release
wget -O libvgpu_unlock_rs.so https://yangwenqing.com/files/pve/vgpu/vgpu_unlock/rust/libvgpu_unlock_rs_20230207_44d5bb3.so

安装VGPU驱动

安装显卡驱动需要用到的依赖

apt install build-essential dkms mdevctl pve-headers-$(uname -r)
# 下载显卡驱动
wget "https://yun.yangwenqing.com/ESXI_PVE/vGPU/NVIDIA/16.2/NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm-patched.run"
# 赋予执行权限
chmod +x NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm-patched.run
# 安装驱动(默认回车直至安装完成即可)
./NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm-patched.run
# 重启
reboot

其他补充提示:

1) 如之前安装过了显卡驱动,则需要先卸载,再安装

# 卸载显卡驱动
./NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm-patched.run --uninstall
# 移除显卡相关程序
sudo apt-get remove --purge nvidia-*
# 安装驱动(默认回车直至安装完成即可)
./NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm-patched.run

2) 下载慢?试试aria2吧

# 在pve安装aria2
apt install aria2
# 4线程下载文件
aria2c -s 4 -x 4 -j 10 'https://yun.yangwenqing.com/ESXI_PVE/vGPU/NVIDIA/16.2/NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm-patched.run'

重启完成后查看相关服务状态

# 查看相关服务状态
systemctl status {nvidia-vgpud.service,nvidia-vgpu-mgr.service}
# 重新启动相关服务
systemctl restart {nvidia-vgpud.service,nvidia-vgpu-mgr.service}
# 停止相关服务
systemctl stop {nvidia-vgpud.service,nvidia-vgpu-mgr.service}

查看相关服务状态
随后使用nvidia-smi
nvidia-smi
以及mdevctl types查看
mdevctl types

搭建fastapi-dls授权服务

你可以在内网或者外网部署好Docker环境,然后搭建fastapi-dls授权服务,我这里提供一个pve lxc的Docker容器,部署到内网进行授权。

# 进入pve备份文件夹
cd /var/lib/vz/dump/
# 使用wget命令下载lxc docker 容器备份包
wget https://yun.yangwenqing.com/ESXI_PVE/PVE/Docker/vzdump_lxc_docker_root_123123.tar.zst
# 或者使用aria2c命令多线程下载lxc docker 容器备份包
aria2c -s 4 -x 4 -j 10 'https://yun.yangwenqing.com/ESXI_PVE/PVE/Docker/vzdump_lxc_docker_root_123123.tar.zst'
# 重命名为vzdump-lxc-100-2023_11_14-15_docker.tar.zst
mv vzdump_lxc_docker_root_123123.tar.zst vzdump-lxc-100-2023_11_14-15_docker.tar.zst

LXC容器信息:

  • 默认IP地址:192.168.3.74
  • 账号:root
  • 密码:123123

1)将下载下来的LXC容器进行还原
还原LXC容器
2)并将原来的IP改为自己内网的IP,我这里用的就是3网段就不改了。
修改IP
3)登录LXC容器(账号:root密码:123123)并创建授权服务:
创建授权服务

# 删除旧的容器
docker rm af06b7705582
# 创建授权服务,注意下边的IP(192.168.3.74)改为刚刚自己修改好的
docker run --restart always -d -e DLS_URL=192.168.3.74 -e DLS_PORT=443 -p 443:443  makedie/fastapi-dls

把LXC容器设置开机自启

创建虚拟机(Win10为例)


创建win10虚拟机
勾选ROM-Bar和PCIE在Mdev类型中选择vgpu设备

其中 GRID P40-1Q 是 mdev 的名字,P40--显卡名,1--1G 显存,Q 代表 vWS
关于最后一位字母,如下
A = Virtual Applications (vApps)
B = Virtual Desktops (vPC)
C = AI/Machine Learning/Training (vCS or vWS)
Q = Virtual Workstations (vWS)(性能最佳)
在配置vgpu的时候,选择正确的型号型号即可。

资源下载

# Windows 10 Enterprise LTSC 2021 (x64) - DVD (Chinese-Simplified).ISO
https://yun.yangwenqing.com/Windows/MSDN/Windows_Desktop/Windows10/Windows%2010%20Enterprise%20LTSC%202021%20(x64)%20-%20DVD%20(Chinese-Simplified).ISO
# virtIO驱动
https://yun.yangwenqing.com/ESXI_PVE/PVE/virtio-win-0.1.240.iso
# NVIDIA Guest驱动 537.70
https://yun.yangwenqing.com/ESXI_PVE/vGPU/NVIDIA/16.2/Guest_Drivers/537.70_grid_win10_win11_server2019_server2022_dch_64bit_international.exe

安装NVIDIA Guest驱动

创建好系统之后,在系统中开启远程功能。如远程桌面,todesk,vnc,向日葵,parsec等然后安装 NVIDIA Guest驱动
安装NVIDIA Guest驱动

启用授权

1)在浏览器访问fastapi-dls授权服务:https://192.168.3.74/-/client-token会自动下载好授权文件
下载授权文件
2)下载后放入C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\这个目录下
将授权文件放到指定路径
3) 重启NVIDIA Display Container Ls服务,即可获得授权
也可以在cmd窗口使用nvidia-smi -q命令查看授权情况
如授权失败,需要检查电脑时间是否对得上授权服务器时间
重启服务
4)使用Todesk远程工具连接上虚拟机跑个鲁大师测试一下,显卡是否正常工作
鲁大师


想解除60帧?
编辑nano /etc/vgpu_unlock/profile_override.toml文件,加入以下信息重启pve生效。

[profile.nvidia-46]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
cuda_enabled = 1
frl_enabled = 0

参数说明:
[profile.nvidia-46]nvidia-46 为vgpu型号的参数。如选的不是46则改成自己选的那个型号。
num_displays 最大显示器数量
display_width = 1920
display_height = 1080
max_pixels = 2073600 这3个是虚拟显示器的分辨率,max_pixels是长宽的乘积
cuda_enabled = 1是否开启cuda
frl_enabled = 0 是否限制帧数,0为不限制


突破60帧限制
5)在PVE后台查看是否调用成功
nvidia-smi

创建虚拟机(Ubuntu23.04为例)

Ubuntu23.04

资源下载

# ubuntu-23.04-desktop-amd64.iso
https://yun.yangwenqing.com/Linux/Ubuntu/ubuntu-23.04-desktop-amd64.iso
# NVIDIA Guest驱动 535.129
https://yun.yangwenqing.com/ESXI_PVE/vGPU/NVIDIA/16.2/Guest_Drivers/NVIDIA-Linux-x86_64-535.129.03-grid.run

1) 安装显卡驱动前先将需要的依赖文件打上

# 安装ssh工具,使用第三方SSH工具(putty,终端)连接到Ubuntu,PVE里面控制台无法复制命令
sudo apt-get install openssh-server
# 开机自启ssh
sudo systemctl enable ssh.service
# 重启ssh服务
sudo systemctl restart ssh.service
# 需要所需依赖
sudo apt install build-essential linux-headers-generic libglvnd-dev pkg-config -y
# 安装dkms
sudo apt install dkms -y
# 安装32位兼容库
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386 -y

2)屏蔽自带的显卡驱动

# 创建blacklist-nouveau.conf文件
sudo nano /etc/modprobe.d/blacklist-nouveau.conf
# 在blacklist-nouveau.conf文件添加如下内容:
blacklist nouveau
options nouveau modeset=0
# 重载内核initramfs
sudo update-initramfs -u
# 重启Ubuntu
sudo reboot
# 重启完成后检查nouveau是否已禁用,没有任何输出说明已经禁用
lsmod | grep nouveau
# 切换到文本命令行控制台
sudo chvt 3
# 关闭图形界面服务
sudo service gdm stop

3)安装显卡驱动

# 使用aria2c命令多线程下载 NVIDIA Guest驱动 535.129
aria2c -s 4 -x 4 -j 10 'https://yun.yangwenqing.com/ESXI_PVE/vGPU/NVIDIA/16.2/Guest_Drivers/NVIDIA-Linux-x86_64-535.129.03-grid.run'
# 给可执行权限
chmod +x NVIDIA-Linux-x86_64-535.129.03-grid.run
# 安装驱动(默认回车直至安装完成即可)
./NVIDIA-Linux-x86_64-535.129.03-grid.run
# 安装完成重启Ubuntu
reboot

4)重启完成后,使用nvidia-smi验证

root@Ubuntu23:~# nvidia-smi
Tue Feb 20 16:22:12 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03             Driver Version: 535.129.03   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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  GRID P40-1Q                    On  | 00000000:01:00.0 Off |                  N/A |
| N/A   N/A    P8              N/A /  N/A |      7MiB /  1024MiB |      0%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A       801      G   /usr/lib/xorg/Xorg                            6MiB |
+---------------------------------------------------------------------------------------+

启用授权

# 获取授权文件
wget --no-check-certificate -O /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok https://192.168.3.74/-/client-token
# 或者
curl --insecure -L -X GET https://192.168.3.74/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok

验证授权

# 重启服务
sudo service nvidia-gridd restart
# 验证授权获取情况
nvidia-smi -q | grep License
# 看到有Licensed字样,就授权好了。
root@Ubuntu23:~# nvidia-smi -q | grep License
    vGPU Software Licensed Product
        License Status                    : Licensed (Expiry: 2024-5-20 9:40:22 GMT)

虚拟机去虚拟化

# 查看你当前安装的qemu版本
dpkg -l|grep kvm
# 我这里是8.1.5-3
ii  pve-qemu-kvm                         8.1.5-3                             amd64        Full virtualization on x86 hardware

安装去虚拟化qemu版本

# 如果你的版本是8.1.5-3,执行一下指令
wget https://yun.yangwenqing.com/ESXI_PVE/PVE/pve%E5%8F%8D%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A3%80%E6%B5%8B%E7%8E%A9%E6%B8%B8%E6%88%8F%E5%8C%85/pve-qemu-kvm_8.1.5-3_amd64_anti_detection20240302.deb
dpkg -i pve-qemu-kvm_8.1.5-3_amd64_anti_detection20240302.deb
# 如果你的版本是7.2.0-8,执行一下指令
wget https://yun.yangwenqing.com/ESXI_PVE/PVE/pve%E5%8F%8D%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A3%80%E6%B5%8B%E7%8E%A9%E6%B8%B8%E6%88%8F%E5%8C%85/pve-qemu-kvm_7.2.0-8_amd64_anti_detection20230901.deb
dpkg -i pve-qemu-kvm_7.2.0-8_amd64_anti_detection20230901.deb 

Intel核显直通,加入以下参数

args: -cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true, -smbios type=0,version=UX305UA.201 -smbios type=1,manufacturer=ASUS,product=UX305UA,version=2021.1 -smbios type=2,manufacturer=Intel,version=2021.5,product='Intel i7-12700' -smbios type=3,manufacturer=XBZJ -smbios type=17,manufacturer=KINGSTON,loc_pfx=DDR4,speed=3200,serial=114514,part=FF63 -smbios type=4,manufacturer=Intel,max-speed=3200,current-speed=3200

AMD核显直通,Intel、AMD、NVIDIA三家独显直通,加入以下参数

args: -cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true, -smbios type=0,version=UX305UA.201 -smbios type=1,manufacturer=ASUS,product=UX305UA,version=2021.1 -smbios type=2,manufacturer=Intel,version=2021.5,product='Intel i7-12700' -smbios type=3,manufacturer=XBZJ -smbios type=17,manufacturer=KINGSTON,loc_pfx=DDR4,speed=3200,serial=114514,part=FF63 -smbios type=4,manufacturer=Intel,max-speed=3200,current-speed=3200

相关文章参考

佛西博客-在Proxmox VE 7.1 中开启vGPU_unlock,实现显卡虚拟化
佛西博客-在Proxmox VE 7.4 中开启NVIDIA P106显卡虚拟化(vGPU)

Last modification:June 11th, 2024 at 08:16 pm
If you think my article is useful to you, please feel free to appreciate