# Hyper-V使用主机GPU与串流 **Repository Path**: esd819/GPU-PV ## Basic Information - **Project Name**: Hyper-V使用主机GPU与串流 - **Description**: 在Hyper-V虚拟机中使用主机GPU并串流到主机或者其他终端上 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-02-23 - **Last Updated**: 2026-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 有没有遇到过这种场景:你有一台很厉害的电脑(i9-13900ks+128G内存+RTX4090),但是有两个人,你们想面对面一起玩某款游戏,他的电脑又带不动? 这里介绍一种把一台电脑分成两个玩家使用的方法。既可以一台主机配两套键鼠+显示器给两个人用,也可以让朋友用他那不太好的电脑直接享受到高配电脑的画面。 大体思路是使用Win10某个版本中加入的GPU-PV功能,就是把显卡分割成若干单元分配给主机和Hyper-V虚拟机使用。 当然,能否使用这一功能取决于显卡具体型号以及驱动程序的版本。 在Hyper-V虚拟机得以使用GPU加速之后,我们还需要想办法把画面传出来。 很可惜GPU-PV不能直接把虚拟机画面从显卡的输出插座上输出,因此我们需要使用串流方案,这里介绍的是开源免费的Sunshine+Moonlight方案。 如果是一机多套键鼠+耳机,还需要把键鼠还有一个USB声卡透传给虚拟机。这里介绍的是usbipd+usbip方案,理论上有兼容linux的可能。 __声明:本文中描述的方法可能存在不稳定现象,作者对一切造成的损失不负责!__ 本文描述的方法在以下环境中测试成功: 1. 主机安装Windows 11 23H2 Pro 2. 主机安装Nvidia驱动560.94 3. 主机安装Moonlight 5.0.1 4. 虚拟机安装Windows 11 22H2 Home 5. 虚拟机安装Sunshine 2025.118.151840 6. 主机安装WSL USB与usbipd 3.2.0 7. 虚拟机安装usbip 0.9.6.9 下面开始描述配置方法。 ## 1. 初次使用时的主机配置 1. 首先需要确保主机安装了Hyper-V 2. 新建一个虚拟机(__一定要选第二代__)并安装系统。内存和CPU按需分配,一般推荐8G+4C以上。后面假设虚拟机的名字为`gpu-vm`。 3. 在Hyper-V `gpu-vm`虚拟机设置中禁用动态内存和检查点。 ![禁用动态内存和检查点](remote_desktop.png "禁用动态内存和检查点") 4. 开启虚拟机并正常安装Win11操作系统。 5. 为了方便后面的操作以及可能的无显示情况,一定要把虚拟机的远程桌面给打开: ![远程桌面](vm_no_dyn_men_no_checkpoints.png "开启远程桌面") 6. 打开一个带管理员权限的PowerShell,执行`Get-VMHostPartitionableGpu`查看可用的GPU ```ps PS C:\> Get-VMHostPartitionableGpu Name : \\?\PCI#VEN_10DE&DEV_2684&SUBSYS_889C1043&REV_A1#4&256a0aa8&0&0008#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV ValidPartitionCounts : {32} PartitionCount : 32 TotalVRAM : 1000000000 AvailableVRAM : 1000000000 MinPartitionVRAM : 0 MaxPartitionVRAM : 1000000000 OptimalPartitionVRAM : 1000000000 TotalEncode : 18446744073709551615 AvailableEncode : 18446744073709551615 MinPartitionEncode : 0 MaxPartitionEncode : 18446744073709551615 OptimalPartitionEncode : 18446744073709551615 TotalDecode : 1000000000 AvailableDecode : 1000000000 MinPartitionDecode : 0 MaxPartitionDecode : 1000000000 OptimalPartitionDecode : 1000000000 TotalCompute : 1000000000 AvailableCompute : 1000000000 MinPartitionCompute : 0 MaxPartitionCompute : 1000000000 OptimalPartitionCompute : 1000000000 CimSession : CimSession: . ComputerName : I9-13900KS IsDeleted : False ``` 其中`ValidPartitionCounts : {32}`表示这块GPU可以被分割成32份。 7. 为Hyper-V虚拟机分配GPU: ```ps Get-VMGpuPartitionAdapter -VMName gpu-vm Remove-VMGpuPartitionAdapter -VMName gpu-vm Add-VMGpuPartitionAdapter -VMName gpu-vm Set-VMGpuPartitionAdapter -VMName gpu-vm -MinPartitionVRAM 1 Set-VMGpuPartitionAdapter -VMName gpu-vm -MaxPartitionVRAM 11 Set-VMGpuPartitionAdapter -VMName gpu-vm -OptimalPartitionVRAM 10 Set-VMGpuPartitionAdapter -VMName gpu-vm -MinPartitionEncode 1 Set-VMGpuPartitionAdapter -VMName gpu-vm -MaxPartitionEncode 11 Set-VMGpuPartitionAdapter -VMName gpu-vm -OptimalPartitionEncode 10 Set-VMGpuPartitionAdapter -VMName gpu-vm -MinPartitionDecode 1 Set-VMGpuPartitionAdapter -VMName gpu-vm -MaxPartitionDecode 11 Set-VMGpuPartitionAdapter -VMName gpu-vm -OptimalPartitionDecode 10 Set-VMGpuPartitionAdapter -VMName gpu-vm -MinPartitionCompute 1 Set-VMGpuPartitionAdapter -VMName gpu-vm -MaxPartitionCompute 11 Set-VMGpuPartitionAdapter -VMName gpu-vm -OptimalPartitionCompute 10 Set-VM -GuestControlledCacheTypes $true -VMName gpu-vm Set-VM -LowMemoryMappedIoSpace 1Gb -VMName gpu-vm Set-VM -HighMemoryMappedIoSpace 32GB -VMName gpu-vm ``` 注意,需要把`gpu-vm`替换成你实际的虚拟机名字!上面这些数值表示虚拟机可以分走每种资源的数量范围。 比如显存设置(PartitionVRAM)这里指定的是,最少1/32,最多11/32,默认10/32,剩下的全部交由主机和其他虚拟机使用(如果有的话)。 ## 2. 为虚拟机安装驱动 1. 启动虚拟机,此时可使用Hyper-V自带的方式操作虚拟机,可也使用远程桌面 1. 虚拟机需要的驱动得从主机中提供(假设主机已经正确安装显卡驱动)。在主机中的`C:\Windows\System32\DriverStore\FileRepository\`文件夹中找到以`nv_dispi.inf_amd64`开头的一个文件夹,然后将其复制到虚拟机中的`C:\Windows\System32\HostDriverStore\FileRepository\`文件夹中。如果虚拟机里找不到对应的文件夹则需要自己创建。 2. 在主机的`C:\Windows\System32`中找所有以nv开头的文件(可搜索`NV*.*`)并复制到虚拟机系统中同样的位置。 3. __如果以后主机显卡驱动更新,需要删除虚拟机中之前放的文件,并重新进行上面两步,否则虚拟机显卡会报错43。__ 4. 重启虚拟机之后,在其设备管理器中应该能看到没有报错的显卡(与主机显卡同名)。 ## 3. 为虚拟机安装虚拟显示器驱动 __为了方便操作,这里建议使用远程桌面连接并控制虚拟机!__ 1. 下载[虚拟显示器驱动](IddSampleDriver.zip)并解压到C盘根目录。 2. 确认所有文件(txt、inf、cat、dll等)都在`C:\IddSampleDriver`目录中并且有`option.txt`(__非常重要__) 3. 右键`installCert.bat`选择“以管理员权限运行” 4. __不要右键安装inf文件!__ 打开设备管理器,选择你电脑名称的根节点,在“操作”菜单中选择“添加过时硬件”。 ![添加过时硬件](add_legacy_hw.png "添加过时硬件") 5. 选择第二项(高级)并下一步。 6. 驱动类型选择“显示适配器”并下一步。 7. 点击“从磁盘安装”并选择`C:\IddSampleDriver\IddSampleDriver.inf`并完成安装。 8. 打开显示设置,此时就可以看到另一个屏幕。在这里选择扩展显示器,并把2号屏幕(刚安装的虚拟显示器)做为主屏幕。 __当把虚拟显示器显示器作为主屏幕之后,Hyper-V自带的虚拟机显示控制窗口会失效,那里会显示一个空白桌面并且不接受键盘鼠标控制,因此需要提前配置远程桌面。__ [显示设置](display_setup.png "显示设置") 这样做的好处是,之后如果关闭了Hyper-V自带的虚拟机显示窗口,串流依然可用。 与此同时设备管理器中也可以看到: [设备管理器](device_manager.png "设备管理器中透传成功的显卡与虚拟屏幕") 其中带`IDD HDR`的为虚拟显示器,`HyperVMonitor`为Hyper-V自带的显示器 ## 4. 配置串流 这一步相对简单,首先在虚拟机中[下载Sunshine](sunshine-windows-installer.exe)并按照默认设置安装。 其次,在要作为显示的机器中[下载安装Moonlight](MoonlightPortable-x64-5.0.1.zip)。 如果是一机多套显示和键盘鼠标,则在主机安装。否则,在每个人的电脑上安装。 我这里放的是绿色版的,可以直接解压用,无需安装。 为了固定串流虚拟屏幕(因为只有它上面的程序能被GPU加速),需要在虚拟机里配置下Sunshine。 在虚拟机的开始菜单中找到Sunshine并打开,此时它会打开浏览器。 登录之后,在最上面找`Configuration`,之后选择`Audio/Video`, 把下面的`Display Device Id`改成`\\.\DISPLAY2`。 之后把去`Advanced`里设置`Force a Specific Encoder`,如果是N卡就选`NVIDIA NVENC`。 现在在Moonlight中就可以看到虚拟机的名字了,点击即可连接。 这里说一下Moonlight中常用的快捷键,都是CTRL+ALT+SHIFT+一个字母: 1. Z: 取消捕获鼠标,这样能返回主机操作系统 2. Q: 关闭Moonlight客户端窗口 3. X: 切换全屏 4. S:显示调试信息,比如帧率和编码器啥的 ## 5. 透传USB设备 在一机多套显示和键盘鼠标的情景中,需要把键鼠(可能也包括USB声卡)透传给虚拟机以正常操作。 这时,需要在主机上安装[WSL USB](WSL-USB-5.5.0.msi)和[usbipd](usbipd-win_3.2.0.msi)。 在主机上打开WSL USB,在其中找到你要透传的键鼠之类的设备,勾选其`bound`那一栏的对勾,这样这个USB设备就是可以被其他人远程使用了。 其他人想使用这些USB设备需要两个信息,一个是主机的IP地址(可以v4可以v6,只要能互相连通就行),一个是bus_id(我这里举例是`12-3`)。 现在需要在虚拟机里安装[usbip](u)。首先关闭虚拟机,在其设置中关闭Secure Boot: ![关闭Secure Boot](vm_disable_secure_boot.png "关闭Secure Boot") 随后开启虚拟机,打开有管理员权限的PowerShell,输入`bcdedit.exe /set testsigning on`来允许测试版的驱动签名,否则usbip的驱动无法加载。 重启然后安装usbip,之后打开设备管理器,可以看到多了个USB控制器(USBip 3.X Emulated Host Controller),我们从主机透传过来的USB设备会出现在这下面。 现在在Powershell中(可以无管理员权限)输入命令`usbip attach -r 192.168.1.6 -b 12-3`,如果得到`succesfully attached to port 1`之类的则表示成功。 这个命令里`192.168.1.6`是主机的IP地址,如果虚拟机网络是桥接的那虚拟机和主机的IP就是同一网段,一般是192开头。如果虚拟机是NAT的网络,主机地址应该用172开头的,在主机的`ipconfig`中可以找到。`12-3`是之前在WSL USB中找到的bus_id。 ![usbip](usbip.png "usbip") 用同样的方法可以把鼠标、键盘、声卡都传进来,是足够玩游戏了。 可以把这些usbip命令写成bat,在计划任务中设置成联网之后自动执行。 ## 6. 声音 如果是一机多套显示和键盘鼠标的情况下,声音可以参考上面来透传USB声卡解决。 如果显示画面的机器非主机,则可以安装[VB Audio](https://vb-audio.com/Cable/)这个虚拟声卡,之后通过Moonlight串流声音。 ## 7. 其他 1. 有些需要OpenGL的游戏比如我的世界会无法运行。解决方法是在打开我的世界的时候确保Hyper-V的虚拟机显示窗口是开着的,随后再关闭... 2. Windows登录界面输入密码确认后Moonlight会闪退一次,这是正常的,之后可以重连。如果想避免这种,可以在虚拟机中用`netplwiz`配置自动登录。 3. 有些游戏特别卡顿的话,可以关闭yper-V的虚拟机显示窗口并在虚拟机的设备管理器中禁用`Microsoft Hyper-V Video`。我发现这种卡顿出现是跟这Hyper-V自带的虚拟显示器一起出现的,如果设备管理器里有它一起禁用就好。