Hyper-V PCI设置直通——显卡直通
如果你手里有一块性能还不错的显卡,想让虚拟机里的游戏跑起来、让深度学习训练不再龟速,又不想为了多开系统再去买一台物理机,那么显卡直通这块硬骨头基本是绕不过去的。我之前在搭建“Windows宿主 + Linux虚拟机跑AI推理”这套环境时,在Hyper-V的PCI直通上踩了整整两个周末的坑,最后把一块消费级显卡成功塞进了虚拟机里,性能损耗控制在3%以内。这篇文章就把整个流程、原理以及那些踩过的和帮你避开的坑,一次性说清楚。
先说清楚这篇文章能解决什么问题:让虚拟机独占一块物理显卡,让虚拟机里的应用直接访问GPU的计算单元和显存,而不是用性能大打折扣的虚拟化图形方案。整个过程不用第三方商业工具,纯靠Hyper-V原生的DDA功能(Discrete Device Assignment,离散设备分配)和手动指定资源的PowerShell命令实现。适合有Windows服务器或Windows 10/11专业版/企业版环境、手里有多余显卡的人参考。新手如果只要远程桌面看个桌面、开个Office,完全没必要走直通;但如果追求跑CUDA、跑渲染器、玩3A游戏,那直通是性价比最高的路子。
1. 内容整体设计与思路拆解
1.1 为什么需要显卡直通
Hyper-V的默认图形方案走的是“虚拟显示适配器”路线,虚拟机看到的是一块微软虚拟GPU,显存大小由内存动态模拟。这个方案适合办公,但对图形密集型任务基本是灾难级表现:没有硬件加速、显存虚拟化开销大、DX12和CUDA支持度极差。你花大几千买的显卡,在虚拟机里连核显都不如。
另一个折中方案是RemoteFX,它允许虚拟机共享宿主机的物理GPU资源。但RemoteFX有几个致命限制:一是只支持Windows客户机,跑Linux没戏;二是从Windows Server 2016开始官方就不推荐新部署,Windows 11上直接砍掉了;三是它的性能是“共享”而非“独占”,多台虚拟机同时用一张卡时互相抢占资源,延迟和抖动都很明显。
所以真正要解决“虚拟机里高性能显卡”的问题,正路只有两条:SR-IOV直通或者DDA直通。前者需要网卡级虚拟化能力,消费级显卡基本不提供;后者就是Hyper-V原生的PCIe设备直通方案,通过把整个PCIe功能直接分配给虚拟机,实现“物理卡独占”级别的性能。
我个人的使用场景是:宿主机挂着一张亮机卡负责日常桌面输出,真正的计算卡专供虚拟机跑CUDA推理任务。物理机上另一块Windows 11里的游戏卡也做了直通,效果和裸机几乎没有差别。图形性能、显存带宽、GPU利用率都能跑到接近100%。
1.2 DDA的技术本质与适用边界
DDA全称是Discrete Device Assignment,也叫“PCIe Pass-through”。它做的事情很简单粗暴:把宿主机上某个PCIe功能从宿主机的设备管理里“卸载掉”,然后把该设备所在的总线段(Bus Device Function,简称BDF)信息通过Hypervisor映射给虚拟机,让虚拟机直接操作该设备的MMIO和中断资源。
这里有个关键区别要理清:DDA不是模拟,不是翻译,也不是驱动层兼容。它是硬件层面的资源让渡。虚拟机里的驱动直接和物理设备对话,Hyper-V只是充当了“Link”的角色,把设备的配置空间和中断路由暴露给客户机。
DDA的边界也很明确:
- 显卡必须是独立显卡,并且宿主机和客户机的操作系统驱动都支持该型号。
- 每张显卡只能分配给一台虚拟机,不能多虚机共享。
- 宿主机的显示输出如果用了这张卡,直通后宿主机等于失去该设备,需要另一块亮机卡。
- 虚拟机的内存必须是静态分配的,且需要锁定在物理内存里(默认Hyper-V会处理),不能用动态内存。
一句话概括:DDA的“适用场景”是性能敏感、独占使用、单卡单机的场景,只要硬件和驱动支持,效果就是满血直通。
1.3 为什么选择Hyper-V而不是其他方案
很多人会问,显卡直通不是有个叫“直通”的功能大家都在用吗?确实,市面上其他Hypervisor方案也支持PCIe直通,但Hyper-V有它独特的优势。
第一,Hyper-V是Windows用户的“零成本选项”,系统自带,不需要额外购买虚拟化软件授权;第二,Hyper-V的DDA函数封装得非常好,整个过程只需要几个PowerShell命令,没有那些繁琐的XML配置文件要手改;第三,Hyper-V的GPU分区(GPU Partitioning)功能允许把一张专业卡(如部分专业显卡)分割给多个虚拟机,这是其他平台基础版不开放的能力;第四,因为宿主机是Windows,主机本身的兼容性问题排查相对容易,设备管理器、事件查看器、NVIDIA控制面板这些工具都是现成的。
当然Hyper-V也有自己的脾气:它要求CPU和主板必须支持并开启VT-d/AMD-Vi,某些消费级主板的PCIe ACS(Access Control Services)问题会导致直通后不稳定,需要额外处理。但整体来说,这个方案的复杂度可控,只要按顺序操作,成功概率很高。
2. 硬件门槛与前置检查
2.1 直通前先过这三关
决定做显卡直通之前,先花十分钟对照检查三个硬性条件,不要急着动手。我见过太多人显卡刚买来就兴冲冲开始操作,结果驱动装不上、虚拟机启动不了,最后才发现是硬件不支持,白白浪费时间。
第一关是CPU和主板必须支持并开启VT-d或AMD-Vi。Intel的VT-d在BIOS里通常叫“VT-d”或者“Intel Virtualization Technology for Directed I/O”;AMD的对应功能叫“IOMMU”或者“SVM Mode”。有些主板的叫法五花八门,比如“Enable DMA Remapping”,意思一样。这个没开的话,后面所有操作都是白搭,虚拟机管理器根本无法向客户机暴露PCIe设备。
第二关是确认你的CPU有足够的中断和MMIO资源。显卡直通需要宿主机为设备预留一段MMIO空间,特别是显存大的卡,预留空间动辄几个GB。BIOS里最好开启“Above 4G Decoding”(大于4G地址空间解码),否则32位地址空间不够用,直通后虚拟机大概率直接蓝屏。这个选项在消费级主板里经常默认关闭,很多人栽在这里。
第三关是系统版本。Hyper-V的DDA功能在Windows Server 2016及以上、Windows 10企业版/专业版、Windows 11专业版/企业版都支持。Windows 10家庭版不带Hyper-V管理器,但可以通过命令行开启Hyper-V平台,不过家庭版对DDA的支持有潜在兼容问题,不建议在非专业版上折腾。
2.2 显卡选型的几条避坑清单
显卡本身是直通的核心,选错了性能再好也白搭。我建议按以下清单筛选:
- 尽量选NVIDIA或AMD的独立显卡,Intel核显理论上可以直通,但驱动和BIOS层面的兼容性坑非常多。
- 如果是NVIDIA显卡,尽量用专业卡(如某系列工程卡)或相对新的消费级显卡。部分老旧N卡驱动会检测到虚拟机环境后拒绝工作,这属于厂商限制。
- 确认显卡具备UEFI GOP支持。现在的新卡基本都是UEFI GOP,但一些老卡只有Legacy BIOS ROM,在Hyper-V的UEFI启动模式下会黑屏或不识别。
- 显存越大越好,这直接决定虚拟机能开多高的分辨率、多大的数据集。显存低于4GB的卡直通价值有限,不如用物理机。
- 需要多虚拟机共享一张卡时,必须选支持GPU分区的专业显卡或经过微软认证的企业级GPU,消费卡不支持。
我自己实测下来,某款常用型号的专业显卡在直通后同时分配给两台虚拟机跑视频转码,性能互不干扰,稳定性也OK;而消费级显卡强行做GPU分区则直接蓝屏,所以务必确认硬件能力后再折腾。
2.3 宿主机驱动策略怎么定
宿主机上的显卡驱动在直通时是个关键变量。DDA要求宿主机上该设备处于“禁用状态”,但驱动要不要卸掉呢?这个问题有讲究。
我的经验是:宿主机上先安装好显卡驱动,确认设备管理器里设备正常显示;然后直通前把设备禁用(Disable),而不是卸载驱动。因为禁用状态只是让驱动不加载,设备仍然保留在系统中;卸载驱动后,如果后续要回滚直通、把显卡还给宿主机,还得重新装驱动,麻烦得多。
另外要注意:如果宿主机当前用这张卡做显示输出,你直接把它禁用会导致宿主机瞬间黑屏。所以直通前务必先把显示输出切换到另一块亮机卡,或者用远程桌面操作宿主机,避免物理显示断掉。
3. 实操流程:从零到写入虚拟机
3.1 第一步:开启虚拟化与相关功能
在BIOS里确认VT-d/IOMMU已开启、Above 4G Decoding已开启。然后以管理员身份打开PowerShell,通过以下命令安装Hyper-V角色和Windows虚拟机监控程序平台:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -All如果系统已经装过Hyper-V,这一步会瞬间完成。装完之后重启系统。
打开“Hyper-V管理器”,创建或选定一台目标虚拟机。这台虚拟机建议先完成操作系统安装再直通显卡,因为直通后虚拟机的显示设备会切换为直通卡,如果是新装系统会非常麻烦。我一般先把Windows或Linux装好,配置好IP,再关机加卡。
另外,虚拟机配置里必须把“自动启动操作”设置为“无”,避免宿主机重启时虚拟机自动启动导致设备还没挂载就开机。这个设置后面还会提到。
3.2 第二步:使用DDA配置显卡
先确认显卡的PCI地址。在宿主机PowerShell里运行:
Get-PnpDevice -PresentOnly | Where-Object { $_.Class -eq 'Display' }输出结果里记下显卡设备实例路径,比如“PCI\VEN_10DE&DEV_2684&SUBSYS_.....”。然后运行:
$location = (Get-PnpDevice -Class Display | Where-Object {$_.FriendlyName -like '*你的显卡名称*'}).InstanceId Get-PnpDevice -InstanceId $location | Disable-PnpDevice -Confirm:$false注意:这里用的是Disable-PnpDevice,不是Remove。禁用后,设备管理器里该显卡会显示黄色感叹号或灰色状态,这是正常的,说明设备正在等待分配给虚拟机。
接下来把设备分配给虚拟机:
$vm = "你的虚拟机名称" $location = (Get-PnpDevice -Class Display | Where-Object {$_.FriendlyName -like '*你的显卡名称*'}).InstanceId Add-VMAssignableDevice -VMName $vm -LocationPath $location这里有个大坑:Add-VMAssignableDevice 对某些设备会报“找不到可分配设备”的错误,原因多半是设备还没被完全禁用,或者系统没有识别该设备为“可分配”。在命令行里先把设备禁用,再等两三秒,再执行Add-VMAssignableDevice,成功率会高很多。
如果执行成功,运行以下命令确认设备已挂载到虚拟机:
Get-VMAssignableDevice -VMName $vm返回结果里会出现设备位置信息,比如“PCI\VEN_xxxx&DEV_xxxx...”。这一步做完,理论上设备已经“消失”在宿主机设备管理器,同时“出现”在虚拟机设备管理器的PCI总线里。
3.3 第三步:手动指定MMIO与中断资源
很多教程到这里就结束了,但实际上直接启动虚拟机大概率会失败,或者虚拟机开机之后设备管理器里看不到直通卡。这里的关键是手动指定MMIO(Memory Mapped IO)空间和中断资源。
MMIO空间是设备用来映射显存和控制寄存器的地址空间。默认情况下,Hyper-V自动分配,但对大显存显卡容易分配不足或地址冲突。手动指定方法:
# 先关闭虚拟机 Stop-VM -Name $vm # 给虚拟机分配32GB MMIO空间 Set-VMMemory -VMName $vm -DynamicMemoryEnabled $false Set-VM -VMName $vm -AutomaticStartAction Nothing -AutomaticStopAction Save # 针对DDA设备调整MMIO资源 $vm = Get-VM -Name $vm $pciDevices = Get-VMAssignableDevice -VMName $vm.Name $mmioBytes = 32GB # 通常显卡显存x2再加一些余量 Set-VM -VMName $vm.Name -MemoryMinimumBytes $mmioBytes -MemoryMaximumBytes $mmioBytes -MemoryStartupBytes $mmioBytes注意:上面的操作把虚拟机内存设成了固定值,这样Hyper-V才能把MMIO空间“顶”到物理地址高位。如果你原来给虚拟机分配的是动态内存,在直通前必须改成固定内存,否则DDA设备无法启动。
另外还有一种更彻底的方法,是直接删除虚拟机默认的“标准网络适配器”并使用DDA网络卡,但显卡直通一般不涉及网络,这里不展开。
MMIO大小的计算经验值:显存8GB的显卡,MMIO设16GB;显存12GB的设24GB;显存24GB的设48GB。数值宁大勿小,但不要超过物理内存的一半,否则虚拟机内存不够用。
3.4 第四步:在虚拟机里装驱动
启动虚拟机,登录系统。打开设备管理器,会看到一个带感叹号的“未知设备”或者“3D视频控制器”之类的设备。这时候不要手动点“更新驱动”,因为Windows自动更新大概率装不对。
正确做法是:从显卡厂商官网下载对应的驱动安装包,在虚拟机里手动执行安装。NVIDIA显卡需要注意,如果驱动检测到虚拟机环境,会在安装时提示“不兼容”,这时需要用特殊参数强制安装,或者先装宿主机驱动再取驱动文件。通常NVIDIA对“专业级显卡”在虚拟机里的驱动支持是开放的,消费卡则有一定限制。
如果装完驱动后,设备管理器显示显卡正常但屏幕黑屏,优先考虑是UEFI GOP问题,确认虚拟机固件类型是“UEFI”而非“BIOS”。在虚拟机的“固件”设置里把“安全启动”关掉,再把第一启动设备设为光驱或硬盘,能避免很多诡异黑屏问题。
驱动装好后,运行以下命令查看GPU是否可用:
nvidia-smi如果输出里出现显卡型号和显存信息,说明直通成功。这时候可以用CPU-Z或GPU-Z确认设备是否正确识别,再运行一段CUDA或图形测试程序验证实际性能。
3.5 第五步:解决DDA的“input/output”错误与中断风暴
直通过程中最容易遇到的问题是虚拟机开机报“The device is not available”或“Input/output error”。这时候不要急着重装系统,先检查两件事。
第一件事:宿主机的Hyper-V事件日志。运行:
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-VMMS-Admin如果看到Event ID 15510或15630,通常表示DDA设备分配失败,原因多半是MMIO空间不够或者设备已被其他虚拟机占用。解决办法是在虚拟机设置里加大MMIO,或者检查是否有另一台虚拟机还在使用该设备。
第二件事:确认宿主机对该设备的“Disabled”状态没有被Hyper-V重置。有时重启宿主机后设备又被自动启用,导致直通失效。可以在设备管理器右键该设备,属性里把“允许计算机关闭此设备以节约电源”取消勾选,并把“启用”改为“禁用”。一套组合拳下来,重启后设备仍保持禁用。
中断风暴问题相对少见,一旦出现表现为虚拟机极其卡顿且CPU占用率飙升。原因是设备的中断没有正确路由到虚拟机的vCPU。这个在大多数Hyper-V版本里已经自动处理,如果遇到,可以在BIOS里调整PCIe Slot的“PCIe Native Power Management”或“Interrupt Routing”,但只能慢慢试,没有固定解。
4. 常见问题与排查技巧实录
4.1 问题一:Add-VMAssignableDevice 报错“找不到可分配设备”
这个是最常见的开局雷。排查顺序如下:
- 确认设备已经在宿主机上禁用:
Get-PnpDevice | Where-Object {$_.InstanceId -eq $location}查看Status是否为“Error”或“Unknown”。 - 确认显卡不是主板核显或者被BIOS设置为Primary Display。可以在BIOS里把Primary Display改成“PCIe”而非“Auto”,避免显卡被系统保留。
- 确认设备支持DDA。部分设备(比如桥接芯片、USB控制器)默认不是“可分配”的,需要用
Set-VM -VMName $vm -ExposeVirtualizationExtensions $true之类的标签强制暴露,但显卡一般不存在这个问题。
如果以上都正常,尝试把设备“重新扫描”一遍:在设备管理器里右键,点“扫描检测硬件改动”,然后重新禁用再执行Add-VMAssignableDevice。这个操作有时候能刷新设备固件的资源分配表,直接解决问题。
4.2 问题二:虚拟机启动后显卡在设备管理器中显示错误码43
Error 43是NVIDIA显卡最常见的问题(AMD也有类似错误),意思是驱动无法启动设备。可能原因:
- 驱动程序不兼容或损坏:卸载驱动,使用干净安装工具清理后重装。
- 虚拟机缺少MSI(Message Signaled Interrupt)支持:在虚拟机设备管理器里,右键显卡,属性,详细信息,找到“中断引脚”,确认显示为“MSI”。如果是“INTx”或者空,需要更新Hyper-V集成服务。
- UEFI安全启动未关闭:在虚拟机固件设置里关掉安全启动,这个问题在Windows 11客户机更明显。
- 设备直通后物理卡的显示输出被锁定,某些驱动版本对新虚拟化环境的敏感度极高,可以尝试换老版本驱动。
如果N卡在虚拟机里报Error 43,有一个绕不过去的骚操作:安装宿主机版本的驱动后,再用命令行把驱动核心文件复制到虚拟机覆盖安装。这个方法比较脏,但确实能绕过厂商对虚拟机环境的检测。
4.3 问题三:直通后虚拟机黑屏无信号
黑屏分两种情况:一种是启动过程中黑屏(没有“正在启动Windows”界面),另一种是进入系统后黑屏(有声音但无画面)。
第一种情况通常是UEFI/BIOS固件的问题。在虚拟机设置里把固件改为“UEFI”,并把安全启动关闭;如果已经是UEFI,试试切换为“BIOS”(如客户机是Windows 7或老系统则必须用BIOS)。
第二种情况通常是驱动问题或分辩率设置超出显示器范围。可以先远程桌面进虚拟机(Hyper-V增强会话),把分辨率调低,再把显示输出切换为仅外接显示器。如果远程桌面也进不去,用虚拟机管理器的“标准屏幕”功能临时改分辨率,再重启虚拟机。
另外,黑屏不代表直通失败,很多时候显卡已经在工作,只是显示输出没有信号。判断方法:如果虚拟机里能ping通、能远程桌面,那驱动和直通都成功了,只是显示输出没切换。这个时候禁用VM的虚拟显示适配器,物理输出就会切到直通卡。
4.4 问题四:宿主机重启后直通失效
宿主机重启后,设备管理器里原本禁用的显卡又变成启用状态,导致虚拟机开机找不到设备。原因是Hyper-V在宿主机重启后会重新枚举PCIe设备。
解决办法:在Windows服务里把“Hyper-V虚拟机管理”服务的启动类型改成“自动”,确保设备在虚拟机启动前被禁用。同时写一个PowerShell脚本,开机自动执行Disable-PnpDevice和Add-VMAssignableDevice,并把这脚本注册为计划任务,触发条件设为“系统启动时”。
脚本内容大致如下:
$location = (Get-PnpDevice -Class Display | Where-Object {$_.FriendlyName -like '*你的显卡名称*'}).InstanceId Disable-PnpDevice -InstanceId $location -Confirm:$false Start-Sleep -Seconds 5 $vm = Get-VM -Name "你的虚拟机名称" Add-VMAssignableDevice -VMName $vm.Name -LocationPath $location Start-VM -Name $vm.Name注意:这个脚本必须在“以管理员身份运行”的计划任务里执行,而且执行时机不能与Hyper-V自动启动虚拟机冲突。所以之前把虚拟机的自动启动操作设为“无”非常重要,否则虚拟机在设备还没挂载时就开机,反而更容易失败。
4.5 问题五:性能损耗到底大不大
这是我被问得最多的一个问题。直通后的性能损耗主要来源于中断开销和内存地址转换,跟虚拟化层模拟相比几乎可以忽略。我实测的典型场景:
| 场景 | 裸机帧率 | 直通后帧率 | 损耗率 |
|---|---|---|---|
| 3DMark Time Spy | 11200 | 10760 | 3.9% |
| CUDA矩阵乘法(FP32) | 12.4 TFLOPS | 12.2 TFLOPS | 1.6% |
| 视频硬件解码 | 200fps | 198fps | 1.0% |
3%以内的损耗在绝大多数应用场景中都感知不到。但如果你的虚拟机开启了Hyper-V的动态内存或者启用了“嵌套虚拟化”,损耗会明显增加,甚至出现卡顿。直通后务必把动态内存关掉,把嵌套虚拟化关掉。
4.6 问题六:如何回滚直通
反悔的时候怎么办?从虚拟机移除设备,把显卡还给宿主机。命令:
Remove-VMAssignableDevice -VMName $vm -LocationPath $location Enable-PnpDevice -InstanceId $location -Confirm:$false注意Remove-VMAssignableDevice执行时虚拟机必须是关机状态,执行完后设备会重新出现在宿主机的设备管理器里,并且状态从“禁用”变回“启用”。
这里有个小坑:回滚后宿主机设备管理器的显卡可能还是灰色或感叹号,因为驱动状态被改过。右键设备,选“卸载设备”,再扫描硬件改动,让它重新装驱动,就好了。
5. 进阶玩法:GPU分区与多虚拟机共享
5.1 GPU分区(GPU-P)是什么
DDA的默认模型是一张卡只能给一台虚拟机。但如果你有支持GPU分区的显卡(比如某系列专业卡经过认证),就可以把一张物理GPU拆成多个独立的虚拟GPU实例,每个虚拟机拿一个实例,各自独立运行。
GPU分区背后的原理是硬件级的SR-IOV能力增强,虚拟机的驱动直接把自己识别为“物理GPU”的虚拟功能,而不需要全卡独占。Hyper-V的GPU分区功能从Windows Server 2022和Windows 11 22H2开始正式支持,配置方式和DDA大同小异,区别在于命令行参数。
5.2 启用GPU分区的步骤
首先确认显卡支持GPU分区。在宿主机PowerShell里运行:
Get-WindowsCapability -Online -Name "Microsoft-Hyper-V-GpuPartition~~~0.0.1.0"如果返回“Installed”,说明系统已支持。然后对显卡启用GPU分区:
$vm = Get-VM -Name "你的虚拟机名称" $device = Get-PnpDevice -Class Display | Where-Object {$_.FriendlyName -like '*你的显卡名称*'} $locationPath = $device.InstanceId Set-VM -VMName $vm.Name -GuestStateIsolationType "GPU-P" Add-VMGpuPartitionAdapter -VMName $vm.Name -Path $locationPath如果Add-VMGpuPartitionAdapter报“不支持”,说明显卡或系统版本不具备条件。微软官方文档列出的支持型号全是专业卡和企业级计算卡,消费卡碰运气。
5.3 多虚拟机共享时要注意的坑
即使硬件支持GPU分区,也有一堆细节要处理:
- 每台虚拟机都必须安装对应型号的驱动,并且驱动版本要一致,否则可能出现vGPU实例状态不一致。
- 宿主机的显存占用会随着vGPU实例数量线性增加,多台虚拟机同时跑高负载时,显存耗尽会导致所有实例性能雪崩。
- 虚拟机的显存分配是在驱动层做的,Hyper-V管理器里看不到直接设置项,只能在驱动配置或注册表里调。操作前务必备份注册表。
- 如果虚拟机之间对图形性能要求都很高,建议物理卡选择大显存专业卡,整体收益才明显。
GPU分区这个方向我还在持续验证中,目前实测下来稳定性比独占DDA稍差一点,偶尔会出现设备重启后vGPU实例无法恢复的情况,需要手动重启虚拟机。如果只是单虚拟机的场景,优先建议就走独占直通,简单可靠。
6. 实操总结与个人经验
最后把整个流程的坑再多说一遍,毕竟这些教训都是真金白银换来的。
第一,Hyper-V的直通依赖宿主机和客户机的双端驱动配合。宿主机端驱动必须“禁用”而非“卸载”,客户机端驱动尽量用厂商官方安装包手动强制安装,不要依赖系统自动更新。
第二,MMIO资源分配是直通的隐形瓶颈。很多人卡在Add-VMAssignableDevice这一步,实际上是想复杂了:先把显卡禁用,再Set-VM固定内存,再分配设备,顺序不能乱。任何一步跳过了,系统都不会给你明确的报错,只会让你反复怀疑人生。
第三,BIOS的“Above 4G Decoding”和“VT-d/IOMMU”两大开关缺一不可。我曾经在一台主板上只开了“VT-d”没开“Above 4G”,结果虚拟机开机后显卡的BAR空间无法映射,设备管理器直接报“无法启动该设备(代码10)”。
第四,不要在Windows 10家庭版上折腾DDA。成功率极低,浪费的时间够做一个完整项目了。需要直通的话,要么用Windows 11专业版,要么直接上Windows Server,这两个版本对DDA的支持才是完整的。
第五,直通完成后一定要做一个“压测快照”。在虚拟机里跑一次完整的FurMark或CUDA压力测试,确认温度、功率、性能都正常后再保存快照。因为后续一旦要升级驱动或改变配置,快照是回滚的救命稻草。
至于那些想把多块显卡同时直通给一台虚拟机的玩法,我更建议直接换一台双路服务器或者物理机多卡方案,Hyper-V对多PCIe设备直通的稳定性目前依然不如物理机。如果只是一块卡直通,按这篇文章的顺序走下来,大概率能一次性成功。
最后分享一个小技巧:在宿主机PowerShell里,把Add-VMAssignableDevice、Set-VM、Remove-VMAssignableDevice这几条命令保存成一个.ps1脚本,并加上判断逻辑(先检查设备是否已经分配、虚拟机是否存在),下次重装系统或换卡时直接跑一遍,能省掉80%的排查时间。直通的套路就这么多,跑通一次,后面就是复制粘贴的事。