尝试配置 Hyper-v 虚拟机打游戏.
资料来源:
https://zhuanlan.zhihu.com/p/335338558
https://forum.cfx.re/t/running-fivem-in-a-hyper-v-vm-with-full-gpu-performance-for-testing-gpu-partitioning/1281205
https://www.chiphell.com/thread-2246161-1-1.html更新
1
2021.01.27 初始
导语
因为 wsl2,hyper-v 是必须开了,在 win 下的虚拟化只能以 hyper-v 为主了.
最近的尝试是配置一个能打游戏的 win10 虚拟机.哪里知道,此乃又一大坑.
先说结果吧
- 借助 gpu 虚拟化,可能非常好的调用 GPU.
- fps 类,能正常运行,但是因为鼠标问题不能玩,有解决方案,但是尝试失败.
- 其他类型正常.
方案
hyper-v 虚拟机运行大型游戏,问题如下:
- GPU 性能.首要的瓶颈,gpu 虚拟化可比 cpu 成熟度差太多了.
- 远程桌面非游戏优化.win10 的 rdp 是针对文字等优化,并非游戏.
解决:
- win10 的 GPU Paravirtualization(半虚拟化) 可解 gpu 性能问题.
- rdp 如果是非极致体验,也坏不到哪里去.如果要求很高,可以换用其它专用串流软件.
GPU 半虚拟化
搜索 wsl2 gpu 支持进度时,翻到了 DirectX is coming to the Windows Subsystem for Linux,提到的 GPU Paravirtualization ,wsl2 的 gpu 支持,就是让 GPU Paravirtualization 支持 wsl2.
按照 微软黑科技-hyper-v虚拟机gpu虚拟化 的描述,GPU Paravirtualization 已经部署了很久了..孤陋寡闻了..
配置成功后,vm 的 gpu 性能应该非常接近 host.
参考上面的几篇文献,重新总结了配置 gpu 半虚拟化的过程.有一点要说明的是 Running FiveM in a Hyper-V VM with full GPU performance for testing (“GPU Partitioning”) 原帖中的最后一行命令的 -
打错了.
配置
要求:
- 理论上,win10 1809 以上都支持这个功能,但是最新的系统有最好的兼容性.
- host 和 vm 可以是不同的系统,但是可能有兼容性问题.
- 因此这里 host 是 20h2,vm 也选择 20h2,保证兼容性.
- 比较谜的一点是,成功配置的虚拟机必须要用
Jan 2021
的 20h2 镜像…
配置:
管理员权限运行
powershell
依次运行下面的命令
1
2
3
4
5
6$vm = "vm_name"
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 1G -VMName $vm
Set-VM -HighMemoryMappedIoSpace 8GB -VMName $vm上面的 LowMemoryMappedIoSpace 和 HighMemoryMappedIoSpace,原帖中是 1G 和 32G,这里测试 2060 配置 8G 也能正常跑起来.
如果配置的内存不足可能在设备管理器出现
代码 43
错误,此时需要重新运行以上的命令.但是也可能是镜像本身问题.我这里是 ltsc 2019 和 20年的 20h2 镜像都出现了代码 43
错误,即使增大到 32G 也是代码 43
.但是 21年的 20h2 镜像就完全没问题.
拷贝驱动到 vm
- 找到 host 的驱动文件夹,拷贝到 vm.
- 原帖中的是在
C:\Windows\System32\DriverStore\FileRepository\
路径下的nv_dispi.inf_amd64_<UNIQUEID>
文件夹,但是在 win10 更新后文件夹名有了变化. - win + r 运行
dxdiag
导出所有信息到文件,搜索显卡的型号,再下边一点就是驱动文件夹的路径. - 之后将驱动文件夹拷贝到
C:\Windows\System\HostDriverStore\FileRepository
下,注意 host 和 vm 的路径不一致!!,文件夹不存在则创建.
最后重启 vm.查看设备管理器和 dxdiag ,gpu 是不是已经正常识别了.
坑
- 配置 gpu 半虚拟化后,不能再使用检查点.
- hyper-v 的增强会话有谜之兼容性问题,有时完全正常,有时会卡死.
fps 鼠标问题
配置完 gpu 后,基本游戏就能正常运行了,除了 fps 游戏,一动鼠标立刻天旋地转..
参考Erratic mouse movement in 3D games over RDP with RemoteFX
这个锅应该是 rdp 的,rdp 处理鼠标移动又经过压缩传递到虚拟机,这中间出了问题.
有两种解决方式(我这里都失败了)
- USB RemoteFX Passthrough,将鼠标直通给虚拟机.
- 使用其他串流软件,从虚拟机串流到 host.
- usb over ip/network.
USB RemoteFX Passthrough
hyper-v 对 鼠标 的支持太烂了.
- 需要先开启 RemoteFX 的 USB 重定向.
- RemoteFX 又明确说了不支持鼠标,还需要配置注册表曲线救国.
开启RemoteFX 的 USB 重定向主要,参考下面 3 篇文献
- RemoteFX usb设备重定向-USB虚拟机重映射.
- 在Windows RDP客户端如何开启RemoteFX USB设备重定向支持
- 使用 RemoteFX 安装和配置 USB 重定向
我这里一直没有成功,有文献说 Intel(R) USB 3.0 eXtensible Host Controller Driver
与 USB RemoteFX Passthrough 有冲突需要卸载,但是我的 host 是 amd 平台,无解了.
之后配置注册表,开启鼠标支持参考下面两篇
- Erratic mouse movement in 3D games over RDP with RemoteFX
- 某些 USB 设备无法通过 RemoteFX USB 重定向使用
至此告一段落..
虚拟机串流
Steam Link: 第一个想到,最常用,但是..安装后,虚拟机闪退…
Moonlight: 需要安装 GameStream,但是半虚拟化后的 gpu 并不支持..
Parsec: 注册安装登录倒是非常顺利,就是连接出现 -15000 错误..
至此告一段落..
usb over ip/network
将鼠标 over ip/netwrok 连接到虚拟机,不再受到 hyper-v 的限制..
查阅了几个商业软件授权价格..告辞…
usbip 是开源的且很久没有更新了,尝试成本比较高.
可用的基本是 usbip-win 这款了,但还处于开发早期,需要安装非签名驱动,还有不少 bug.
至此告一段落..
结语
没想到解决 gpu 后,鼠标能这么折腾..最后也没能有个完整的方案..