利用Hyper-V实现单张显卡虚拟化,自建多人云原神

Windows, 折腾 2024/11/04

之前写过一篇家用显卡虚拟化多开的

记录一下ProxmoxVE下使用Nvidia家用消费级显卡开启vGPU搭建云主机一例

目的是解决家里只有一张显卡但是又想多终端使用,用这其实还挺好的,也稳定。

但Linux下的vGPU就是一个痛点:不支持40系列N卡

刚好,最近购置了一张4070Ti(属于是49年入国军 :doge: ),以上文章的方法就无效了

于是又开始找方法,最后找到一个很方便的方法

起因

我买这张4070Ti,是为了组一台GameServer,纯串流用的游戏机

起初只是Win11+Sunshine+虚拟显示器,实现无头串流(无显示器)

这样我就在另外一台主力机、客厅\卧室的AppleTV、出门用IPv6直连(无IPv6时可N2N开虚拟网)

基本上涵盖了我对串流游戏的所有需求,对我个人是完全足够了,不需要再折腾……但是 :doge:

我老婆也是原神玩家,她也有随时随地摸鱼的习惯,但是受限于云原神需要付费,不付费就得排队、用手机肝又费电还烫手,画质又一般、笔记本带不动等各种理由

单张显卡自建多人云原神的需求,就硬被创造了出来……废话说够了,开始折腾

原理

一句话:使用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串流的效果

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

创建远程游戏虚拟机全流程方案(GPU-PV)

本文标签:


评论(本站已开启评论回复邮件通知功能,请如实填写邮箱以便及时收到回复)