利用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串流的效果
本文较简略,更多内容可以参考