type
status
date
slug
summary
tags
category
icon
password
Property
Sep 13, 2024 03:11 PM
GPU VirtualizationAdd GPU to VMCopy GPU driver to VMStreamingMoonlightNetworkPort ForwardingEnhanced Session
GPU Virtualization
最早是在Windows Sandbox中接触到这个基于WDDM的半虚拟化方案:
如下是在Hyper-V虚拟机中启用GPU-PV的步骤:
Add GPU to VM
说明:
- 查找gpu_path:
eg:
\\?\PCI#VEN_10DE&DEV_1B81&SUBSYS_36FC1458&REV_A1#4&c55b2a1&0&0008#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV如果有多个GPU,配合设备管理器进行查找

Tips: 一般intel核显的硬件id中包含8086,可以方便排除
- vm就是虚拟机的名称
- 有关GPU的进阶参数设置
- 有关MMIO的设置:
- Some devices, especially GPUs, require additional MMIO space to be allocated to the VM for the memory of that device to be accessible.
- By default, each VM starts off with 128MB of low MMIO space and 512MB of high MMIO space allocated to it. 默认太小了所以我们需要额外设置,1-32G足够满足大部分显卡要求。
上述文档也提供了如何具体确定当前GPU所需要的MMIO大小的脚本SurveyDDA.ps1
如果不需要该GPU了,使用以下命令删除
增强脚本参考:
Copy GPU driver to VM
在添加好GPU后,默认在Windows的虚拟机中还不能驱动,需要从宿主机拷贝驱动。可以参考Easy-GPU-PV的脚本:
也可以使用如下合并后的脚本
Streaming
默认会包括以下几个虚拟显示器(Virtual Display)

- Hyper-v video: VM默认自带的VD
- Remote Display Adapter: 使用增强会话功能时创建的VD, 可以比较方便更改分辨率. 走RDP协议
- USB Mobile Monitor: 安装如下虚拟桌面后的VD
但是如果使用(第三方)串流的话, 还需要额外安装:
- 虚拟声卡: VB-Cable
- 虚拟桌面:
- 因为原始的Hyper-v video功能比较少, 分辨率固定为1024x768 (虽然可以使用第三方软件修改). 所以推荐使用第三方的虚拟桌面
- https://www.amyuni.com/downloads/usbmmidd_v2.zip
- 需要写一个脚本来开机创建一个VD
- 开机脚本可以在创建后, 使用win下的“任务计划程序”设置为开机以管理员身份运行
最终采用的方案: Sunshine (Server)+Moonlight (Client)
Moonlight
Moonlight is an unofficial third-party open-source client for the NVIDIA SHIELD streaming software that comes included with GeForce Experience.
Note: 主要moonlight只是一个客户端, 不提供串流主机的服务
但是因为Nvidia与2023/02停止支持gamestream服务,所以可以使用第三方Sunshine实现host端串流服务:
为支持手柄, 还需要在VM中安装ViGEmBus
使用教程:
windows下安装后, 会以service的形式静默运行, 不需要再额外打开sunshine程序.
此时使用web进行管理: https://localhost:47990
端口转发:
- TCP 47984, 47989, 48010
- UDP 47998, 47999, 48000, 48002, 48010

有关端口转发的具体操作见下
Network
Hyper-V的网络(虚拟交换机)分为3类
- 专用(Private): 仅允许虚拟机之间互联, 不能访问宿主机
- 内部(Internal): 允许虚拟机和宿主机互联, 使用一个独立网段
- Note: 自己创建的该类虚拟交换机默认不包含DHCP服务, 需要自己对每台虚拟机和host对应虚拟网卡设备设置ip等信息;
- 此外自己创建的该类虚拟交换机默认也不开启NAT功能, 因此虚拟机无法通过设置该网络而访问外部网络.
- 外部(External): 将虚拟机看作局域网中一个独立的设备, 由宿主机外的路由器进行管理
Hyper-V默认存在一个虚拟交换机Default Switch:
- Internal类型, 外加DHCP和NAT.
- 默认使用/20 网段, eg:

Port Forwarding
最好先创建一个单独的Internal Switch, 并添加给VM. 因为默认的Default Switch每次重启会变动ip
步骤(需要在管理员权限的shell下完成):
- Make a new Hyper-V Internal Switch(这一步也可以在Hyper-V的GUI中完成)
- Set up a new IP address/subnet(eg: 192.168.14.0/24) for the Hyper-V host on the new adapter
- Note: 这里是通过接口名称
-InterfaceAlias来确定对应adapter (对应名称为vEthernet (xxx)) - 也可以通过
-InterfaceIndex来指定. - 二者都可以通过命令
Get-NetAdapter进行查看

- Set up a NAT Network on the new subnet
- 在VM上添加该switch, 并手动设置ip (因为不包含DHCP)
- Set up a port-forward on the NAT Network to the VM (e.g. TCP 1443 -> 192.168.14.100:443)
Tips: 对同一个端口的TDP和UDP需要单独指定







