利用Hyper-V实现单张显卡虚拟化,自建多人云原神
之前写过一篇家用显卡虚拟化多开的
记录一下ProxmoxVE下使用Nvidia家用消费级显卡开启vGPU搭建云主机一例
目的是解决家里只有一张显卡但是又想多终端使用,用这其实还挺好的,也稳定。
但Linux下的vGPU就是一个痛点:不支持40系列N卡
刚好,最近购置了一张4070Ti(属于是49年入国军
),以上文章的方法就无效了
于是又开始找方法,最后找到一个很方便的方法
起因
我买这张4070Ti,是为了组一台GameServer,纯串流用的游戏机
起初只是Win11+Sunshine+虚拟显示器,实现无头串流(无显示器)
这样我就在另外一台主力机、客厅\卧室的AppleTV、出门用IPv6直连(无IPv6时可N2N开虚拟网)
基本上涵盖了我对串流游戏的所有需求,对我个人是完全足够了,不需要再折腾……但是 
我老婆也是原神玩家,她也有随时随地摸鱼的习惯,但是受限于云原神需要付费,不付费就得排队、用手机肝又费电还烫手,画质又一般、笔记本带不动等各种理由
单张显卡自建多人云原神的需求,就硬被创造了出来……废话说够了,开始折腾
原理
一句话:使用Windows自带的Hyper-V套件,创建虚拟机,将单张显卡虚拟化
准备
1.准备工作
系统:Windows10、11的非家庭版,必须是专业版、企业版等能够开启Hyper-V组件的系统
硬件:CPU支持虚拟化,并需要开启主板的BIOS虚拟化支持,开启操作自行百度
显卡:需要N\A\I任意独显(不支持N卡笔记本版本),注意GPU必须支持硬件编码(NVIDIA NVENC、Intel Quicksync、AMD AMF)
另外大佬还提到,RX 580 等 AMD Polaris GPU 不支持通过 GPU 半虚拟化进行硬件视频编码
2.软件准备
大佬做的简易脚本,Easy-GPU-PV:打包下载 项目地址
另外需要准备一个Win10\Win11系统iso镜像包,遍地都是,比如 itellyou
3.Hyper-V
启用主机系统的Hyper-V组件

折腾
1.使用Easy-GPU-PV脚本创建虚拟机
下载并解压上述脚本包到系统任意位置,然后搜索打开 Powershell ISE

打开 Powershell ISE 后,先在命令框里输入 Set-ExecutionPolicy unrestricted 以解锁脚本的执行权限
会弹出如下提示,全是 或 是 即可

然后在界面上方点击打开刚才解压好的脚本文件 PreChecks.ps1,这是一个预检查脚本
打开后直接点击工具栏的绿色运行按钮即可

可能会遇到以下情况:
无法加载文件 PreChecks.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
+ CategoryInfo : SecurityError: (:) [],ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
这个是没有执行 Set-ExecutionPolicy unrestricted 命令导致脚本没权限
Get-WmiObject : 无效命名空间 “ROOT\virtualization\v2”
所在位置 PreChecks.ps1:49 字符: 17
+ ... $Devices = (Get-WmiObject -Class "Msvm_PartitionableGpu" -ComputerNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-WmiObject],ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
这个提示是主机没有开启 Hyper-V 组件
正常情况下,提示如下:

预检查通过,打开 CopyFilesToVM.ps1 脚本,编辑自定义参数

可以看到脚本开头有很多自定义参数,根据实际情况自行在Powershell ISE编辑器里修改
机翻一下参数释义:
VMName = "GPUP" Hyper-V 中的虚拟机的名称、同时也是虚拟机计算机名/主机名
SourcePath = "C:\Users\james\Downloads\Win11_English_x64.iso" 先前准备的Windows 10/11 系统iso镜像的路径(重要)
Edition = 6 默认为 6,这意味着 Windows 10/11 Pro
VhdFormat = "VHDX" 保留此值不变
DiskLayout = "UEFI" 保留此值不变
SizeBytes = 40gb 磁盘大小,在本例中为 40GB,最小为 20GB(此项在虚拟机创建后可以更改)
MemoryAmount = 8GB 内存大小,在本例中为 8GB(此项在虚拟机创建后可以更改)
CPUCores = 4 您想要提供给 VM 的 CPU 核心数,在本例中为 4(此项在虚拟机创建后可以更改)
NetworkSwitch = "Default Switch" 除非您不使用默认的 Hyper-V 交换机,否则保留此项不变
VHDPath = "D:\Virtual Hard Disks\" 您想要存储 VM 磁盘的文件夹的路径,它必须已经存在
UnattendPath = "$PSScriptRoot"+"\autounattend.xml" 保留此值不变
GPUName = "AUTO" 自动选择第一个可用的 GPU。在 Windows 11 上,您还可以在多 GPU 情况下使用您想要与 VM 共享的 GPU 的确切名称(Windows 10 中无法选择 GPU,必须将其设置为 AUTO)
GPUResourceAllocationPercentage = 50 您想要与 VM 共享的 GPU 的百分比(重要)
Team_ID = "" 如果您是 Parsec for Teams 订阅者,则为 Parsec for Teams ID
Key = "" 如果您是 Parsec for Teams 订阅者,则为 Parsec for Teams 密钥
Username = "GPUVM" 虚拟机 Windows 的用户名,不包含特殊字符,并且必须与您设置的“VMName”值不同(重要)
Password = "CoolestPassword!" 虚拟机 Windows 密码,不能为空(重要)
Autologon = "true" 如果您希望开启虚拟机自动登录到 Windows 桌面
这个 GPUResourceAllocationPercentage 参数是动态的,比如设置为50,则虚拟机最大只能用到50%的GPU资源
如果关闭虚拟机,分配给它的50%会收回,不会影响主机性能
修改好参数后保存,然后点击 Powershell ISE 工具栏上的绿色运行按钮,正常情况下直接就开始了

根据主机性能,稍等一会儿就OK了,完成提示如下,虚拟机应该会自动启动

优化
初次正常启动虚拟机后,还有很多优化工作
1.调整系统语言
通过脚本创建虚拟机后默认区域为澳大利亚,需要添加中文并设置为界面显示语言,还需要修改如下几处设置


2.安装虚拟显示器
直接玩也不是不行,就是分辨率、帧率都有问题,最好搭配虚拟显示器
之前也写过,可以参考 没有HDMI欺骗器怎么办?虚拟显示器值得拥有!
2.安装虚拟声卡
默认没声音,装个虚拟声卡
https://vb-audio.com/Cable/ 解压后安装 VBCABLE_Setup_x64.exe 即可
3.调整虚拟机网卡
默认虚拟机是NAT模式,和主机的局域网不是一个网段,不方便后期串流、文件共享等功能,调整一下
新建一个网卡,名称比如 LAN ,然后把这个 LAN 分配给虚拟机


4.安装完带虚拟显示器的串流软件后(Parsec、Apollo),记得卸载掉Hyper-V的虚拟显示器

5.通过挂载SMB共享,将主机游戏盘共享给虚拟机
这里略了
补充
1.升级驱动
更新主机的显卡驱动程序后,同时也需要更新虚拟机的显卡驱动
Powershell下执行脚本包里的
#下述GPUName正常为AUTO,多显卡时需定义为设置虚拟机时的GPU名称
Update-VMGpuPartitionDriver.ps1 -VMName "虚拟机名称" -GPUName "AUTO"
2.帧率上不来
一个偏方,关掉游戏的垂直同步(不一定起作用)
效果
通过上述方法,我创建了两个虚拟机,下图是分别开启了两个Moonlight串流的效果

本文较简略,更多内容可以参考

6 条评论
你好,我安装过程都没有问题,但最后串流怎么都串不上。
主机系统:win11 LTSC2024
虚拟机系统:同主机
显卡:NVIDIA 4060TI
问题描述:根据脚本,创建虚拟机,复制驱动,这些都没有问题,虚拟机里显卡也能正常识别,Dxdiag检测3D等都已经开启,跑甜甜圈也能调用4060Ti。
但无论是sunshine还是parsec,串流时都连接不上,sunshine显示NVencoder failed,无指定输出显示器,parsec显示无法抓取屏幕内容。但我虚拟显示屏已经都安装好了。
我查了微软文档,说GPU-PV是虚拟显示设备,默认和Hyper-v 视频适配器关联,并且无视频输出内存,如下:
—————————————————————–
来宾中没有视频内存管理器 (VidMm) 或调度程序 (VidSch)。
VM 中的 Dxgkrnl 通过 VM 总线通道获取 thunk 调用并将其封送到主机分区。 来宾中的 Dxgkrnl 还在分配、进程、设备及其他资源方面创建本地对象,从而减少与主机的通信量。
虚拟渲染设备 (VRD)
VM 中不存在半虚拟化 GPU 时,VM 的设备管理器会显示“Microsoft Hyper-V 视频”适配器。 默认情况下,此显示专用适配器与 BasicRender 适配器配对,用于呈现。
将半虚拟化 GPU 添加到 VM 时,VM 的设备管理器会显示两个适配器:
Microsoft Hyper-V 视频适配器或Microsoft远程显示适配器
Microsoft虚拟呈现驱动程序(实际名称是主机上的 GPU 适配器的名称)
默认情况下,VRD 与 Hyper-V 视频适配器配对,因此所有 UI 呈现都与 VRD 适配器一起发生。
———————————————————————————————————
目前我找不到解决办法,请教一下您有没有遇到这种问题?
Hyper v反正崩坏三是完全过不了虚拟机检测网上还有你的帖子试了一下也不知道是哪里出错
所以求问是怎么过虚拟机检测的是因为挂在实体机硬盘所以才过的吗
可惜普适价值不高,大多数网游会进行虚拟化检测,而hyperv目前尚没有绕过虚拟化检测的方案。
出现没有匹配的镜像警告,但实际上路径和名字都是正确的
Windows(R) Image to Virtual Hard Disk Converter for Windows(R) 10
Copyright (C) Microsoft Corporation. All rights reserved.
Version 10.0.14278.1000.amd64fre.rs1_es_media.160201-1707
INFO : Opening ISO Win10.iso…
INFO : Looking for I:\sources\install.wim…
INFO : Looking for the requested Windows image in the WIM file
ERROR : 没有匹配的映像。
INFO : Log folder is C:\Users\go\AppData\Local\Temp\Convert-WindowsImage\578f5076-c208-4512-8781-f9e367ed6729
INFO : Done.
Failed to create VHDX, stopping script
安装iso 报错: ERROR : There is no matching image.
解决: Get-WindowsImage -ImagePath G:\sources\install.wim 获取edition 信息, 可能不存在 edition 为 6 的 version , 把 自定义参数 edition 更改为你要安装的数字 比如我的专业版为
就改为3 .
原文参照: https://github.com/jamesstringerparsec/Easy-GPU-PV/issues/187