[转载] PVE显卡VGPU教程,支持消费级显卡VGPU免授权

QQ20250905-144934.png

前置教程 & 可选优化选项

强烈建议在查看和使用本教程之前,先查看下列教程:
PVE安装教程:《Proxmox VE虚拟化平台安装和基本优化教程》
PVE直通教程:《Proxmox VE直通核显独显以及PCI设备教程》
PVE去虚拟化:《Proxmox VE去虚拟化痕迹教程支持网游检测》

配置 NVIDIA VGPU Unlock 服务

VGPU_Unlock是解锁 NVIDIA 消费级显卡虚拟化功能的VGPU补丁,消费卡必须安装,原生支持的专业卡,数据中心卡可选安装(推荐也安装,可以解锁NVIDIA限制)。

# 创建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://yun.yangwenqing.com/NVIDIA/vGPU/NVIDIA/17.0/libvgpu_unlock_rs_only_17.0.so

安装 NVIDIA VGPU HOST 驱动

在宿主机PVE下安装VGPU的HOST驱动,17版本需要加-m=kernel参数

# 安装用到的依赖包和header头文件
apt install build-essential dkms mdevctl pve-headers-$(uname -r)

# 下载显卡驱动
wget "https://yun.yangwenqing.com/NVIDIA/vGPU/NVIDIA/17.0/NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run"

# 赋予执行权限
chmod +x NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run

# 安装驱动(默认一路回车直至安装完成即可)
./NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run -m=kernel

# 重启
reboot


其他补充提示:
1) 如要升级VGPU驱动,则需要先卸载,再安装

# 卸载显卡驱动
./NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run --uninstall

# 移除显卡相关程序
sudo apt-get remove --purge nvidia-*

# 再开始安装驱动(默认一路回车直至安装完成即可)
./NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.run -m=kernel

2) 下载慢?试试aria2吧

# 在pve安装aria2
apt install aria2

# 4线程下载文件
aria2c -s 4 -x 4 -j 10 'https://yun.yangwenqing.com/NVIDIA/vGPU/NVIDIA/17.0/NVIDIA-Linux-x86_64-550.54.10-vgpu-kvm-patched-kernel6.8-OA5500.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}

2948808237.png

随后使用nvidia-smi

root@pve8:~# nvidia-smi
Sun Jul 21 19:09:09 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.10              Driver Version: 550.54.10      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  NVIDIA P106-100                Off |   00000000:01:00.0 Off |                  N/A |
| 23%   44C    P0             28W /  120W |      27MiB /   6144MiB |      1%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

以及mdevctl types查看

root@pve8:~# mdevctl types
0000:01:00.0
  nvidia-522
    Available instances: 0
    Device API: vfio-pci
    Name: NVIDIA RTXA6000-1B
    Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=32
  nvidia-523
    Available instances: 0
    Device API: vfio-pci
    Name: NVIDIA RTXA6000-2B
    Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=24
  nvidia-524
    Available instances: 0
    Device API: vfio-pci
    Name: NVIDIA RTXA6000-1Q
    Description: num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=32
  nvidia-525
    Available instances: 0
    Device API: vfio-pci
    Name: NVIDIA RTXA6000-2Q
    Description: num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=24

搭建fastapi-dls授权服务

NVIDIA VGPU并非免费产品,需要对vGPU驱动购买许可才能正常使用vGPU,这里我用fastapi-dls项目来取得90天的试用许可。
你可以在内网或者外网部署好Docker环境,然后搭建fastapi-dls授权服务,我这里提供一个PVE LXC容器部署到内网进行授权。
顺带把作者90天的延续周期调整为365天。

# 安装aria2 多线程下载工具
apt install aria2
# 进入pve备份文件夹
cd /var/lib/vz/dump/
# 使用aria2 8个线程下载lxc fastapi-dls容器备份包
aria2c -s 8 -x 8 -j 10 'https://yun.yangwenqing.com/Proxmox/LXC/FASTAPI-DLS/vzdump-lxc-888-2024_10_20-01_12_57.tar.zst'

LXC容器信息:
NVIDIA vGPU 驱动授权服务器(365天授权期,服务器需要一直开启才能自动续期)
默认IP:10.10.10.99 网关:10.10.10.10
登录LXC账号:root
登录LXC密码:123123

1)将下载下来的LXC容器进行还原
932192344.png

2)并将原来的IP改为自己内网的IP,我这里用的就是10.10.10.99就不改了。
1687065759.png

3)开机并登录LXC容器(账号:root密码:123123)并创建fastapi-dls授权服务:

docker run --restart always --name fastapi-dls -d -e DLS_URL=10.10.10.99 -e DLS_PORT=443 -p 443:443 yangwenqing/fastapi-dls
# 检查fastapi-dls容器是否正在运行
docker ps

创建虚拟机(Win10为例)


虚拟机名称:Win10(自定义)
内存:8G(如要给足8G内存虚拟机,则取消勾选Ballooning)
处理器:host,核心数量8(按需设置,host拥有最好的性能)
BIOS:OVMF(UEFI模式)
显示:默认(安装好并且能通过远程连接上虚拟机后,建议改成无)
机型:q35(版本最新就行)
SCSI控制器:VirtIO SCSI single(WIN下推荐用这个,性能最好)
CD/DVD启动器(ide0)(加载镜像用,安装完系统记得删除掉)
硬盘:SATA 大小120G(系统盘推荐安装到固态,总线SCSI要优于SATA,但需要驱动,硬盘格式raw要优于qcow2,但不能打快照)
网络:Intel E1000 网卡(网卡可以安装好再来添加,免得在配置系统时要登录微软账号,virto网卡要优于E1000,但需要驱动)
EFI磁盘:UEFI(OVMF启动的话需要)
PCI设备:nvidia显卡(勾选ROM-Bar和PCIE在Mdev类型中选择vgpu设备524)
音频设备:ich9-intel-hda/后端驱动器:无(不添加的话,parsec串流游戏没有声音)

2141807305.png


其中 NVIDIA RTXA6000-1Q 是 mdev 的名字,RTXA6000--显卡名,1--1G 显存,Q 代表 vWS
关于最后一位字母,如下:
Q:为需要Quadro技术的性能和功能的创意和技术专业人员提供的虚拟工作站 - CUDA OpenGL
C:计算密集型服务器工作负载,如人工智能、深度学习或高性能计算。- CUDA Only
B:为业务专业人员和知识工作者提供的虚拟桌面 - 45FPS MAX
A:为虚拟应用的用户,提供应用流或基于会话的解决方案 - Good for RDSH
3D渲染,游戏,AI运算,请选择Q系列型号即可。

安装 NVIDIA vGPU_GUEST 驱动

安装好系统并配置好相关的远程桌面服务后。就可以给虚拟机安装 NVIDIA vGPU Guest驱动了,GRID驱动的安装就跟平常打驱动一样,默认下一步直至安装完成就行不再赘述。(如果你不想用GRID驱动和授权驱动这类方式,可以翻到底部FAQ问答系列来模拟专业卡安装Quadro驱动)

# NVIDIA Guest驱动 551.61
# 直链下载
https://yun.yangwenqing.com/NVIDIA/vGPU/NVIDIA/17.0/NVIDIA-GRID-Linux-KVM-550.54.10-550.54.14-551.61/Guest_Drivers/551.61_grid_win10_win11_server2022_dch_64bit_international.exe
# 备用下载
https://share.feijipan.com/s/T2F5gSzv

2222426300.png

授权驱动
1)在浏览器访问fastapi-dls授权服务:https://10.10.10.99/-/client-token会自动下载好授权文件

1928696848.png

2)下载后放入C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\这个目录下
2303419304.png

3) 重启NVIDIA Display Container Ls服务,即可获得授权
也可以在cmd窗口使用nvidia-smi -q命令查看授权情况
如授权失败,需要检查电脑时间是否对得上授权服务器时间
726252973.png

4)使用远程桌面工具连接上虚拟机跑个鲁大师测试一下显卡是否正常驱动并工作
921613960.png

5)在PVE后台查看是否调用成功

root@pve8:~# nvidia-smi
Sun Jul 21 19:43:31 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.10              Driver Version: 550.54.10      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  NVIDIA P106-100                On  |   00000000:01:00.0 Off |                  N/A |
| 23%   42C    P8              7W /  120W |    1045MiB /   6144MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      5675    C+G   vgpu                                         1018MiB |
+-----------------------------------------------------------------------------------------+

优化选项

想解除60帧?


编辑nano /etc/vgpu_unlock/profile_override.toml文件,加入以下信息关闭虚拟机重新开机生效。

[profile.nvidia-524]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
cuda_enabled = 1
frl_enabled = 0
vgpu_type = "NVS"
framebuffer = 939524096
framebuffer_reservation = 134217728

参数说明:

[profile.nvidia-524]nvidia-524 为vgpu型号的参数。如选的不是524则改成自己选的那个型号。
num_displays 最大显示器数量
display_width = 1920
display_height = 1080
max_pixels = 2073600 这3个是虚拟显示器的分辨率,max_pixels是长宽的乘积
cuda_enabled = 1是否开启cuda
frl_enabled = 0 是否限制帧数,0为不限制
vgpu_type = "NVS" 修复Q系列OpenGL性能异常问题
framebuffer = 939524096 显存大小-以字节为单位
framebuffer_reservation = 134217728 显存预留-以字节为单位

自定义显卡显存大小

如要自定义修改显卡的显存大小,只需要修改framebuffer、framebuffer_reservation这2个值就好,显存不建议低于1GB,官方说低于1GB将会禁用NVENC视频编解码器
注意:vgpu会默认预留128M,所以如果要改显存,请将结果减去128M再去换算
例如,你期望显存为1GB,所以就用1024M-128M=896M
在线大小换算平台:https://www.bejson.com/convert/filesize/
1293451713.png

FAQ问答

vGPU部分

Q1: 我的显卡是Tesla P4,安装好了vGPU驱动,在Win虚拟机看到显卡变成了P40或者RTXA6000

A1: NVIDIA vGPU HOST驱动是做了修补的,所以你看到p4变成P40或者RTXA6000都是正常的并不会影响其性能。当然p4本身就是支持的vGPU卡,在17版本前直接用原生NVIDIA vGPU HOST驱动就行

Q2:我的P106-100显卡 6G显存,选用NVIDIA RTXA6000-1Q(nvidia-524)模型,那显示可用数32个,我是不是能开32个吗?

A2:错的!nvidia-524模型每开一个vgpu会占用1024M显存,6G显存理论就是1G+1G+1G+1G+1G+1G=6个。并且选了这个模型后,所有虚拟机都将采用该模型,你不能一台虚拟机使用nvidia-524模型,另一台虚拟机使用nvidia-525模型。

Q3:我不想每台虚拟机都用相同大小的显存,我能不能给每台虚拟机分配不同大小的显存?

A3:可以的,通过修改framebuffer、framebuffer_reservation这2个值就能给每台虚拟机自定义显存大小。

显存大小不建议低于1GB,低于1GB将无法启用NVENC视频编解码器,虽可改512M,384M,但你的显卡核心性能就在那,拆分的越多性能越弱,与其减小显存多开,不如多买几张卡。
例如:我要使用nvidia-524模型给101虚拟机分配4G显存,999虚拟机分配2G显存,那么我就这样写即可
nano命令编辑nano /etc/vgpu_unlock/profile_override.toml

# 自定义nvidia-524模型
[profile.nvidia-524]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
cuda_enabled = 1
frl_enabled = 0
vgpu_type = "NVS"
framebuffer = 939524096
framebuffer_reservation = 134217728

[vm.101]
# 给101虚拟机设置4G显存
framebuffer = 3959422976
framebuffer_reservation = 335544320

[vm.999]
# 给999虚拟机设置2G显存
framebuffer = 1946157056
framebuffer_reservation = 201326592

Q4:6G显存的P106-100用1G显存的nvidia-524模型开了6台虚拟机,启动到第6台虚拟机发现无法启动是怎么回事?

A4:剩余显存不足1G,所以到第6台时就没法启动了,可以执行nvidia-smi查看剩余显存,通过改小第6台虚拟机显存大小再启动即可,或者把nvidia-524模型整体显存改小
以下是些换算好的显存值,有需要可以替换到profile_override.toml文件

# 设置384M显存
framebuffer = 318767104
framebuffer_reservation = 83886080
# 设置512M显存
framebuffer = 436207616
framebuffer_reservation = 100663296
# 设置896M显存
framebuffer = 822083584
framebuffer_reservation = 117440512
# 设置1GB显存
framebuffer = 939524096
framebuffer_reservation = 134217728
# 设置2GB显存
framebuffer = 1946157056
framebuffer_reservation = 201326592
# 设置3GB显存
framebuffer = 201326592
framebuffer_reservation = 268435456
# 设置4GB显存
framebuffer = 3959422976
framebuffer_reservation = 335544320
# 设置5GB显存
framebuffer = 4966055936
framebuffer_reservation = 402653184
# 设置6GB显存
framebuffer = 5972688896
framebuffer_reservation = 469762048
# 设置8GB显存
framebuffer = 7985954816
framebuffer_reservation = 603979776
# 设置10GB显存
framebuffer = 9999220736
framebuffer_reservation = 738197504
# 设置12GB显存
framebuffer = 12012486656
framebuffer_reservation = 872415232
# 设置16GB显存
framebuffer = 16039018496
framebuffer_reservation = 1140850688
# 设置20GB显存
framebuffer = 20065550336
framebuffer_reservation = 1409286144
# 设置24GB显存
framebuffer = 24092082176
framebuffer_reservation = 1677721600
# 设置32GB显存
framebuffer = 32145145856
framebuffer_reservation = 2214592512
# 设置48GB显存

framebuffer = 48001712128
framebuffer_reservation = 3537895424

Q5:我已经用FASTAPI-DLS生成的授权文件给虚拟机NVIDIA GRID驱动成功授权了,这个有数量限制吗?

A5:目前暂未遇到数量上限,FASTAPI-DLS 授权服务器只要一直开着,GRID驱动就能长期正常使用。如遇到授权失败,需要检查虚拟机的时间是否与授权服务器一致,必须一致才能取得授权。

Q6:我不想用GRID驱动,我就想用Geforce驱动和Quadro驱动,阁下该如何应对?

A6:“既见未来,为何不拜”,如果你是全通关的天命人那就跟着我按下面操作吧!
我们的Geforce消费卡和VGPU显卡的核心其实是一样,既然VGPU_Unlock可以将消费卡改写成VGPU的设备,那么再将VGPU的设备ID改回消费卡的Id或者专业卡的ID,不就能驱动Geforce驱动或者Quadro驱动了嘛,就不需要另外给驱动授权了嘛。试了,确实可行,但只能改为专业卡的ID,消费卡缺少专业卡的部分功能打了Geforce驱动会蓝屏死机。

以P106-100为例
先来查看显卡信息,在pve shell执行
其中GP106是核心代号,10de是制造商ID,1c07是设备ID

lspci -D -nnk | grep NVIDIA
# 输出以下信息,其中GP106是核心代号,10de是制造商ID,1c07是设备ID
0000:01:00.0 3D controller [0302]: NVIDIA Corporation GP106 [P106-100] [10de:1c07] (rev a1)

知道P106-100的核心代号是GP106,就去这个网站找devicehunt.com对应GP106专业卡的设备ID和制造商ID就行,专业卡核心代号结尾都会带GL。
devicehunt.com
devicehunt.com

编辑profile_override.toml文件新增2个参数pci_id = 和pci_device_id = 将Quadro P2200专业卡的设备ID:1C31和制造商ID:10DE填入即可。
格式写法:

pci_id = 0x设备ID+制造商ID
pci_device_id = 0x设备ID

# 编辑profile_override.toml文件
nano /etc/vgpu_unlock/profile_override.toml
# 将这2个值填入profile_override.toml
pci_id = 0x1C3110DE
pci_device_id = 0x1C31

或者你也可以直接把Quadro P2200专业卡的设备ID:1C31和制造商ID:10DE填到虚拟机配置文件进行加载也行,格式是:0x10DE/0x1C31
模拟成Quadro P2200专业卡
模拟成Quadro P2200专业卡

最后就是去Nvidia官网下载对应的Quadro驱动就好了,可以从VGPU版本提供的Guest GRID驱动版本去下载对应的Quadro驱动版本,如当前PVE用的VGPU17.0版本,grid驱动为551.61那么就去下载551.61版本的Quadro驱动或者更低版本只要没出现代码43错误就能用当然不是所有的消费卡都有对应的专业卡核心代号,找不到对应的专业卡可以尝试用其他专业卡核心代号尝试。或者老老实实的用GRID驱动。

补充:我安装了对应版本号的Quadro驱动或者更低版本它还是报43错误怎么办?
可以把PVE的控制台显示给关闭掉,然后在VGPU设备勾选主GPU再试。或者换个专业卡设备ID

Q7:NVIDIA GRID驱动和NVIDIA QURDRO驱动我该怎么选择?

A7:强烈推荐授权+GRID驱动方式,可以避免很多的小问题。GRID驱动本身就是为虚拟化场景定制的,在远程虚拟桌面,远程专业图形应用程序等场景更能充分发挥其性能。迫于驱动需要购买许可获取授权才不得已选择模拟专业卡换用QURDRO驱动。用QURDRO驱动也有一定好处,驱动不需要授权且更像一张真实的专业卡而不是一张VGPU显卡设备。(社区已经弃用该方式稳定性不确定,不建议使用)

Q8:你的显卡驱动程序已过期,不符合运行《暗黑破坏神IV》的最低要求。请更新驱动程序并重试。当前版本:551.61,最低要求版本:552.74

A8:游戏需要较新的驱动才能游戏,可以尝试直接安装552.74的驱动,如果安装了新的Guest驱动报43代码错误,则你还需要升级PVE宿主机的VGPU驱动。升级宿主机VGPU驱动前记得先卸载驱动再安装

Q9:Ampere 架构的显卡要怎么开启VGPU,如A100/RTX A5000

A9:Ampere架构的显卡在PVE安装好VGPU驱动后,还需要开启VF才能使用VGPU,开启VF前你需要在BIOS打开SR-IOV功能,并且每个VF仅能选择一个Mdev类型。
在PVE Shell 新建一个Systemd自启动服务,开机自启动VF

cat > /etc/systemd/system/nvidia-sriov.service <<EOF
[Unit]
Description=Enable NVIDIA SR-IOV
After=network.target nvidia-vgpud.service nvidia-vgpu-mgr.service
Before=pve-guests.service

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/usr/lib/nvidia/sriov-manage -e ALL

[Install]
WantedBy=multi-user.target
EOF

打开VF后,就可以选Mdev类型开启VGPU给虚拟机了。

# 重新加载服务
systemctl daemon-reload
# 设置nvidia-sriov.service,开机自启动
systemctl enable nvidia-sriov.service
# 启动VF
systemctl restart nvidia-sriov.service
像RTX A5000/A6000这类带显示接口的显卡,还需要切换无显示模式才能用,先切换再安装驱动。

# 下载displaymodeselector工具到PVE根目录
wget https://yun.yangwenqing.com/NVIDIA/vGPU/NVIDIA/Tools/NVIDIA_Display_Mode_Selector_Tool/displaymodeselector
# 授权可执行文件
chmod  +x displaymodeselector
# 切换无显示模式,跟着提示步骤进行关闭
./displaymodeselector --gpumode
# 重启PVE后生效
reboot

找来个Window为例的图,将就看吧一样的操作

Q10:为啥我在PVE网页虚拟机控制台里打完显卡驱动后,就不能操作了呢?

A10:请配置好远程桌面或者安装第三方远程工具,确认能通过远程连上虚拟机再来安装显卡驱动,如果你没配置就安装了显卡驱动,则需要先删除显卡设备,配置好远程再添加上显卡设备。因为你一旦安装好显卡驱动后系统就会呈现双显示器状态,这样就会导致PVE网页虚拟机控制台黑屏,或者是副屏状态,使得无法操作虚拟机。这里推荐把PVE控制台窗口显示给关闭,即在虚拟机→硬件→显示改成无,只保留VGPU一个显示器,通过远程操作虚拟机。

如果你非要在PVE控制台操作虚拟机,不想借助外部的远程工具,可以用ToDesk远程到虚拟机,把显示屏设置改为仅控制台窗口显示,这样PVE的Web显示就能操作了。(注意:PVE控制台的窗口是独立的虚拟显卡并不调用VGPU;UEFI安装的虚拟机修改PVE的Web窗口分辨率需要在虚拟机BIOS修改,SeaBIOS安装的虚拟机在系统显示设置进行修改分辨率)

UEFI虚拟机修改PVE Web窗口分辨率操作
步骤:虚拟机开机按esc键进入BIOS → Device Manager → OVMF Platform Configuration

Q11:修改PVE的Perl模块让VNC显示窗口输出vGPU显卡画面

A11:针对上面的Q10做了优化,将PVE的VNC显示窗口直接输出vGPU显卡画面,让PVE的Web VNC窗口也支持调用vGPU,只需要在虚拟机添加vgpu显卡时勾选主GPU即可;(仅对UEFI方式的虚拟机有效)
修改QemuServer.pm
nano 命令修改QemuServer.pm文件,可以使用Ctrl+W,搜索关键字定位
nano /usr/share/perl5/PVE/QemuServer.pm

push @$devices, '-device', print_vga_device(
    $conf, $vga, $arch, $machine_version, $machine_type, undef, $qxlnum, $bridges);

添加判断语句到 ; 号前

if $vga->{type} ne 'gpu'
修改后的效果

push @$devices, '-device', print_vga_device(
    $conf, $vga, $arch, $machine_version, $machine_type, undef, $qxlnum, $bridges) if $vga->{type} ne 'gpu';

修改PCI.pm
nano 命令修改PCI.pm文件,可以使用Ctrl+W,搜索关键字定位
nano /usr/share/perl5/PVE/QemuServer/PCI.pm
添加以下代码

        # If GPU is installed, read the frame from GPU
        if ($d->{'x-vga'}) {
            my $mdevtype = $d->{mdev} // "";
            $mdevtype =~ s/^(.*?)-.*$/$1/;
    
            $devicestr .= ",x-igd-opregion=on" if $mdevtype eq "i915";
            $devicestr .= ",display=on,ramfb=on,driver=vfio-pci-nohotplug";
            $vga->{type} = 'gpu';
        }
修改后的效果

        if ($j == 0) {
        $devicestr .= ',rombar=0' if defined($d->{rombar}) && !$d->{rombar};
        $devicestr .= "$xvga";
        $devicestr .= ",multifunction=on" if $multifunction;
        $devicestr .= ",romfile=/usr/share/kvm/$d->{romfile}" if $d->{romfile};
        $devicestr .= ",bootindex=$bootorder->{$id}" if $bootorder->{$id};
        for my $option (qw(vendor-id device-id sub-vendor-id sub-device-id)) {
            $devicestr .= ",x-pci-$option=$d->{$option}" if $d->{$option};
        }
    
        # If GPU is installed, read the frame from GPU
        if ($d->{'x-vga'}) {
            my $mdevtype = $d->{mdev} // "";
            $mdevtype =~ s/^(.*?)-.*$/$1/;
    
            $devicestr .= ",x-igd-opregion=on" if $mdevtype eq "i915";
            $devicestr .= ",display=on,ramfb=on,driver=vfio-pci-nohotplug";
            $vga->{type} = 'gpu';
        }
        }

重启PVE服务

systemctl restart {pvedaemon,pveproxy}

设置虚拟机
将虚拟机的显卡 PCI 设备将主 GPU (x-vga) 勾选, 重启虚拟机即可
如果虚拟机安装了显卡, 默认显示设备会被禁用, VNC 将从显卡读取画面

虚拟机部分

Q1:我虚拟机分配的内存给多少pve就占用多少,且在pve控制台不能操作关机和不显示IP是怎么回事?

A1:VMware平台有VMwareTools,KVM平台有qemu-guest-agent。PVE下给虚拟机安装qemu-guest-agent可解决虚拟机无法关机和内存不同步IP不显示等问题。
在PVE先给虚拟机开启qemu-guest-agent再安装qemu-guest-agent
qemu-guest-agent
qemu-guest-agent

Windows虚拟机为例
访问网站 Virtio驱动下载页 下载 Virtio 驱动,例如 virtio-win-0.1.240.iso,上传到虚拟机。加载镜像文件后安装 virtio-win-gt-x64.msi和virtio-win-guest-tools.exe,然后重启系统。
qemu-ga-x86_64.exe
qemu-ga-x86_64.exe

Q2:我的虚拟机运行的多了,虚拟机变卡了怎么办?

A2:资本家给你开一份工作的钱,让你去完成10个人的工作量,效率还得高,牛马要怎么做?既要又要还要=啥也不是
1)硬件已经做了虚拟化,CPU,硬盘,网卡等设备都得依靠处理器支持,所以处理器性能越强虚拟机性能越好;
2)虚拟机运行的快慢取决于你的CPU和硬盘,硬盘IO读写越快虚拟机越流畅,虚拟机开的越多IO下降的越严重,不要所有虚拟机都跑在一个硬盘,也不要在一台机器高负荷跑。将虚拟磁盘的缓存模式改为Write back回写模式可以提升读写速度,但更推荐用pcie4.0 x4速率的nvme硬盘,7000M/s的速率也就白菜价
3) 虚拟机网速不达标,跑不满。CPU瓶颈。网卡支持sriov的话可以做sriov拆分不占用CPU有一定改善。当然前提排除网线和路由交换机等问题,
4) 虚拟机显卡跑分低。CPU拉了后腿。显卡无法充分发挥其性能。当然前提是显卡散热良好,显存充足下。

Q3:克隆后的虚拟机机器码是不是都一样的?

A3:在PVE中克隆后的虚拟机,主板,硬盘,网卡mac都会生成新的uuid,以避免与原虚拟机冲突。并不会存在相同信息,具有唯一的标识。

Q4:我是做游戏工作室的,一台台部署环境是不是太浪费时间了?

A4:PVE是可以跟Windows一样预封装好,然后还原到其他机器的,学会这项技能,你就不需要一台台部署啦。有兴趣可以看我这篇文章

Last modification:September 9, 2025
If you think my article is useful to you, please feel free to appreciate