菜单

沣大哈
发布于 2025-03-23 / 40 阅读
0
0

Hyper-V虚拟机中使用宿主机的显卡

前言

这半年在折腾虚拟机的时候遇到了很多问题,比如说虚拟机的类型啊,还有虚拟机的设置之类的,上网找了很多资料。这次结合网上的资料和DeepSeek给出的注释,记录一下在Hyper-V中的虚拟机使用宿主机的显卡的步骤,网上教程很多,只是稍稍总结一下,更方便看。

这种方式并不是所谓的“显卡直通”,即把我们主机上的物理设备直通给虚拟机使用,是专一的,只有被直通的系统才能使用,其它系统(包括宿主机)都不能使用的那种。现在讲的这种类似于“显卡虚拟化”,也叫“vGPU”,是将宿主机的GPU分成若干个分区,之后供虚拟机使用。但是吧,他又不完全是显卡虚拟化,因为明确的显卡虚拟化是要显卡支持vGPU这项技术的,我现在用的A770官方是由明确说明不支持显卡虚拟化的,但是也能成功。我看到B站上有人把这种技术称为“GPU并行虚拟化(GPU-PV)”,宿主机和虚拟机共享同一个GPU。具体我也不太清楚,但是能成功就是了。

这次就讲讲今天应该怎么搞,一共分两步,输代码移驱动

代码

全部代码

这次的全部代码都是在有管理员权限的Windows PowerShell下进行的。

$vm = "虚拟机的名字"
Add-VMGpuPartitionAdapter -VMName $vm
Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000
Set-VM -GuestControlledCacheTypes $true -VMName $vm
Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm
Set-VM -HighMemoryMappedIoSpace 32GB -VMName $vm

逐步解释

可以看到上面的代码有六行,这次步骤分五步讲,第五,六行代码合为一步。

Step.1 设置$vm的对象

$vm = "虚拟机的名字"

在后面的双引号内就是你添加显卡的虚拟机的名称了,这个在Hyper-V中可以看到,前提是你要先创建了虚拟机。在之后步骤中的所有$vm都是指的是你所设置的那台虚拟机了。

Step.2 添加 GPU 分区适配器

Add-VMGpuPartitionAdapter -VMName $vm

这条命令会为指定的虚拟机 $vm 添加一个 GPU 分区适配器。这是 GPU 虚拟化的必要步骤,以便在虚拟机中使用 GPU 功能。当然如果你的虚拟机之前直通过显卡或者是进行过类似的操作,那你就要额外运行下面的代码来移除现有的GPU分区适配器。

Remove-VMGpuPartitionAdapter -VMName $vm

这一步的作用是先移除当前为指定虚拟机 $vm 配置的所有GPU分区适配器。这样做是为了确保在应用新的设置之前,没有任何旧的配置干扰新的设置生效。

Step.3 配置新的GPU分区适配器参数

Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000

这条命令很复杂,用于为指定的虚拟机 $vm 配置新的GPU分区适配器参数。以下是对各个参数的详细解释:

- VRAM 参数

- MinPartitionVRAM 80000000:设置每个GPU分区至少分配80,000,000 KB(假设为KB,则是80 GB)的虚拟显存。

- MaxPartitionVRAM 100000000:设置每个GPU分区最多可以使用100,000,000 KB(100 GB)的虚拟显存。

- OptimalPartitionVRAM 100000000:推荐每个GPU分区使用100,000,000 KB(100 GB)的虚拟显存,以达到最佳性能。

- Encode 参数

- MinPartitionEncode 80000000:设置视频编码任务在最少情况下分配80,000,000 KB(80 GB)的GPU资源。

- MaxPartitionEncode 100000000:设置视频编码任务在最多情况下可以使用100,000,000 KB(100 GB)的GPU资源。

- OptimalPartitionEncode 100000000:推荐视频编码任务使用100,000,000 KB(100 GB)的GPU资源,以达到最佳性能。

- Decode 参数

- MinPartitionDecode 80000000:设置视频解码任务在最少情况下分配80,000,000 KB(80 GB)的GPU资源。

- MaxPartitionDecode 100000000:设置视频解码任务在最多情况下可以使用100,000,000 KB(100 GB)的GPU资源。

- OptimalPartitionDecode 100000000:推荐视频解码任务使用100,000,000 KB(100 GB)的GPU资源,以达到最佳性能。

- Compute 参数

- MinPartitionCompute 80000000:设置计算任务在最少情况下分配80,000,000 KB(80 GB)的GPU资源。

- MaxPartitionCompute 100000000:设置计算任务在最多情况下可以使用100,000,000 KB(100 GB)的GPU资源。

- OptimalPartitionCompute 100000000:推荐计算任务使用100,000,000 KB(100 GB)的GPU资源,以达到最佳性能。

注意事项

- 这些参数的单位可能不是KB。如果实际的虚拟显存需求与这些设置不符,可能会导致GPU资源分配不足或过度使用物理资源。

- 高数值如80,000,000 KB(80 GB)在大多数情况下过于庞大,可能超过了实际硬件能力,建议根据具体硬件配置和虚拟机的实际需求进行调整。

Step.4 启用来宾操作系统控制缓存类型

Set-VM -GuestControlledCacheTypes $true -VMName $vm

这条命令允许虚拟机的操作系统(来宾)控制其内存的缓存类型设置。通过启用此功能,来宾操作系统可以根据自己的需求动态调整缓存策略,从而优化性能表现。

注:“来宾”指的是受限的用户账户,而“来宾操作系统”自然是指的是受限的操作系统,没有管理员权限的。这就很好理解为什么我们要用这一行代码给他提供权限了,让他自己其分配调配资源,以获得更好的性能。

Step.5 配置内存映射I/O空间

Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm

Set-VM -HighMemoryMappedIoSpace 32GB -VMName $vm

这两条命令分别设置低内存和高内存的内存映射I/O空间:

- LowMemoryMappedIoSpace 1Gb:指定在低内存情况下,分配1 GB的空间用于内存映射I/O操作。

- HighMemoryMappedIoSpace 32GB:指定在高内存情况下,分配32 GB的空间用于内存映射I/O操作。

内存映射I/O空间用于加速虚拟机的磁盘和网络I/O操作。合理配置这一参数可以提升虚拟机的整体性能,特别是在涉及大量数据传输时。当然具体情况你还是要根据你自己电脑实际有多少内存来决定了,并不一定要是32G。如果我电脑才8G,你分32G,我不炸了么?所以说适当调整一下啦。

小总结

通过以上步骤,我们可以看到这些PowerShell命令主要针对虚拟机的GPU资源分配、内存管理和I/O性能优化进行了详细配置。移除旧的GPU适配器是为了确保新配置的有效性;新的GPU分区适配器参数设置了VRAM和不同任务(编码、解码、计算)的最小、最大和推荐资源分配,以优化GPU性能;启用来宾操作系统控制缓存类型允许虚拟机根据自身需求调整内存使用策略;配置内存映射I/O空间提升了数据传输效率;最后启动虚拟机使所有设置生效。

这些步骤适用于需要高性能GPU资源和优化I/O性能的场景,如图形密集型应用或虚拟桌面基础设施(VDI)环境。在实际操作中,建议根据具体的硬件配置和虚拟机工作负载需求调整参数,以达到最佳性能和资源利用率。

驱动

事前准备

Stpe.1 关闭检查点

在移驱动之前,在Hyper-V中的虚拟机设置中关闭检查点

Step.2 看看虚拟机里面显卡状态

再启动虚拟机,打开设备管理器,可以看见系统已经识别到了显卡的存在,但是还是有黄色感叹号。

造成这个的原因是因为显卡没有正常打上驱动。而一般方法在虚拟机里面下驱动软件装驱动是行不通的,所以需要我们自己亲手把驱动从宿主机里面复制过去。

移驱动

移驱动分为两步:移驱动文件夹移api文件

Step.1 移驱动文件夹

右键左下方的windows图标,找到设备管理器并打开。往下看找到显示适配器,展开就可以发现你的显卡型号了。如果有多张显卡,你要找到你要共享的GPU。

之后右键你要共享的显卡,点属性。显示出来的界面中点左上方的驱动程序,下一步点下面的驱动程序详细信息。

之后会看到显示出来很多个名字很长的驱动文件,你翻下去,等到前面文件夹名字一直不变的时候,那个文件夹就是你要找的驱动文件夹了。比如说图中我的驱动文件夹后缀就是ef9629c的,你也可以记前缀,反正每个人的都不同。

之后你要去其所在的位置,把那个文件夹复制出来,丢到一个地方。驱动位置都是大同小异的,一般都在下面的地址中:

宿主机驱动路径:C:\Windows\System32\DriverStore\FileRepository\

也可以用上面的查找功能,很快就能找到。我这里图省事,就复制粘贴到桌面上了。

复制出了宿主机的显卡驱动文件夹之后,你就要把他复制到虚拟机相同的位置中去了。虚拟机放驱动的位置在下面:

虚拟机拷贝路径:C:\Windows\System32\HostDriverStore\FileRepository\

一般来说虚拟机中是没有HostDriverStore文件夹的,你需要在System32中新建,里面的FileRepository文件夹也是同理。

Step.2 移驱动api文件

下一步就是把API文件从宿主机上复制到虚拟机的对应位置当中。位置我也会放在下面。各家显卡的API文件名字可能不一样,但是都大同小异。比如说N卡的就是nvapi64.dll,我的A卡就是intel_gfx_api-x64.dll。反正你记住两点,第一就是这个API文件在System32文件夹中,第二就是这个dll文件的名字绝对是含有api这个词语的,记住这些就行了。

宿主机文件路径:C:\Windows\System32

虚拟机拷贝路径:C:\Windows\System32

Step.3 检测成果

在完成上述两个文件(驱动文件夹和api文件)的复制之后,你就可以重启虚拟机,看看成不成功啦!看自己是否成功的方法有很多,比如说你直接跑一些游戏软件看看能不能正常运行。在这里我推荐一个很快很简单的办法:在设备管理器中查看。

在虚拟机中打开设备管理器,展开下面的显示适配器,看看刚刚显卡下面的黄色感叹号消失没有。如果问题还是存在,建议重装一次或者是问问身边懂电脑的人。

如图所见,我成功了!

当然你也可以用另一种方法:按Win+X键,点下面的运行,输入dxdiag,之后点开显示。如果你看到下面笔记中写着:没有发现问题。那也是成功了。

特别提醒

每次宿主机显卡更新驱动之后,使用了显卡的虚拟机也要重新卸载,安装一次驱动!

小结

这次搞的这个类似于显卡虚拟化的东西有什么作用呢?说白了就是可以给我们的游戏挂机啊,多开什么的起到作用。比如说你有挂机游戏的需求,但是又没有闲置的电脑,就可以把自己的电脑开启Hyper-V,显卡虚拟化之后,就可以在不影响自己电脑的情况下挂机游戏了。游戏多开也是一样的道理(这应该是Hyper-V的功能吧,算了一起说了)。自己组服务器的时候可能也会用到显卡虚拟化什么的,总之随便写写吧哈哈哈。


评论