【Windows使用】之–Hyper-V网卡、显卡直通等PCIe硬件直通
#手册 #教程 #系统 #Windows #虚拟机 #Hyper-V
从Windows Server 2016 TP4 版本,微软为Hyper-V虚拟机加入了物理设备直通(Discrete Device Assignment, DDA)的功能,允许虚拟机完全控制宿主机上的某些硬件(包括但不限于GPU,网络适配器等)。Hyper-V硬件直通需要满足以下几个条件:
- 必须使用Windows Server Hyper-V。
- 硬件支持IOMMU (Intel VT-d / AMD-Vi / ARM SMMU)
- 设备支持硬件直通,如NVIDIA GeForce系列家用显卡就不受支持(2021年4月更新的英伟达驱动据说移除了GeForce显卡的直通限制)
下面以Windows Server 2022系统为例,使用前先检查BIOS开启IOMMU (Intel VT-d / AMD-Vi / ARM SMMU) :
1. 硬件检测
通过微软提供的powershell命令检测一下硬件支持情况:Virtualization-Documentation/SurveyDDA.ps1 · GitHub。
curl -o SurveyDDA.ps1 https://raw.githubusercontent.com/MicrosoftDocs/Virtualization-Documentation/live/hyperv-tools/DiscreteDeviceAssignment/SurveyDDA.ps1 .\SurveyDDA.ps1
运行完毕后会得到如下的一个清单:
PS C:\Users\Administrator> .\SurveyDDA.ps1
Executing SurveyDDA.ps1, revision 1
Generating a list of PCI Express endpoint devices
NVIDIA GeForce GTX 970
Legacy Express Endpoint -- graphics controller.
All of the interrupts are line-based, no assignment can work.
Intel(R) Xeon(R) processor P family/Core i7 IOAPIC - 2026
Embedded Endpoint -- less secure.
And it has no interrupts at all -- assignment can work.
And it requires at least: 1 MB of MMIO gap space
PCIROOT(0)#PCI(0504)
Intel(R) Xeon(R) processor P family/Core i7 IOxAPIC Configuration Registers - 2036
Embedded Endpoint -- less secure.
And it has no interrupts at all -- assignment can work.
And it requires at least: 1 MB of MMIO gap space
PCIROOT(16)#PCI(0504)
…………
All of the interrupts are line-based, no assignment can work.
红色代表不被支持
And it has no interrupts at all -- assignment can work.
绿色支持直通。
PCIROOT(0)#PCI(0504)
硬件的位置路径
这里看看就可以了,多数显示不支持的设备也能直通成功,比如:NVIDIA GetForce GTX970显卡,也是能直通成功的。
2. 网卡直通–使用powershell命令模式
绝大部分PCIe设备都是支持的,这里以Intel® Ethernet Connection I219-LM网卡直通为例:
- 获取直通设备的
位置路径
在设备管理器中,右键查看属性,找到详细信息,获取位置路径
- 设备管理器里禁用准备直通的设备
- 通过Hyper-V管理器,完全关闭虚拟机。
- 执行如下命令
# 变量赋值$locationpath需要直通硬件的位置路径,$VmName直通的指定虚拟机名称
$locationpath = 'PCIROOT(0)#PCI(1F06)'
$VmName = 'openwrt'
# 卸载硬件
Dismount-VMHostAssignableDevice -LocationPath $locationpath -Force
# 直通设备的虚拟机不能被暂停或热迁移,所以自动关机动作必须为 ACPI shutdown 或者硬关机
Set-VM -Name $VmName -AutomaticStopAction TurnOff
# 将设备添加给指定虚拟机
Add-VMAssignableDevice -VMName $VmName -LocationPath $locationpath
# 查看虚拟机直通设备情况
Get-VMAssignableDevice -VMName openwrt
通过上面命令可以得到如下信息,证明PCIROOT(0)#PCI(1B03)#PCI(0000)
设备直通成功。
PS C:\Users\Administrator> Get-VMAssignableDevice -VMName openwrt
InstanceID : PCIP\VEN_8086&DEV_1533&SUBSYS_103717AA&REV_03\702084FFFF0971F200
LocationPath : PCIROOT(0)#PCI(1F06)
ResourcePoolName : Primordial
VirtualFunction : 0
Name : PCI Express 端口
Id : Microsoft:A1A4F2EF-63C4-404E-B857-8C185046D91A\C161BC40-91BF-4CAD-AE5F-1F209BEFC9C7
VMId : a1a4f2ef-63c4-404e-b857-8c185046d91a
VMName : openwrt
VMSnapshotId : 00000000-0000-0000-0000-000000000000
VMSnapshotName :
CimSession : CimSession: .
ComputerName : WIN-Q285J6F0FG3
IsDeleted : False
VMCheckpointId : 00000000-0000-0000-0000-000000000000
VMCheckpointName :
3. 显卡直通–使用图形界面的直通工具
最近在GitHub上发现一个图形化界面的直通工具:GitHub - chanket/DDA: 实现Hyper-V离散设备分配功能的图形界面工具。
可以看到界面很简单,能够显示已有的虚拟机的直通情况。下面直通显卡测试一下。
添加NVIDIA GetForce GTX970显卡(在上面的检测中,是不被支持的,直通下试试)
开机后设备管理器中已经有了。
安装完驱动可以看到显卡已被正确识别,没有报错,看来英伟达驱动真的是移除了GeForce显卡的直通限制。下面我们测试一下显卡。
开启增强会话模式,测试游戏可以看到GPU的变化,证明显卡已经能正常工作了。
某些设备(尤其是 GPU)需要为 VM 分配额外的 MMIO 空间,以便访问该设备的内存。默认情况下,每个 VM 开始时分配有 128MB 的低 MMIO 空间和 512MB 的高 MMIO 空间。但是,设备可能需要更多 MMIO 空间,或者可能会通过多个设备,从而使组合要求超过这些值。具体可以参看微软给出的解释:Plan for deploying devices using Discrete Device Assignment | Microsoft Learn
在图形界面的直通工具Discrete Device Assignment(DDA)中也有相关的三个功能。
具体的设置也可以按照设备管理器-显卡属性-资源,三个内存范围。这里是十六进制,通过计算可知16M+256M+32M
4. 硬盘直通
Hyper-V虚拟机中硬盘有三种使用方式:虚拟硬盘、直接使用物理硬盘、DDA硬件直通。经过测试后面两个基本都能达到物理机下的性能,DDA模式下能更好的被系统和软件识别做更多设置和检测,如正确识别硬盘型号、温度显示等等。
4.1. 使用物理硬盘
- 在磁盘管理中右键选择脱机,让磁盘处于
脱机
状态
- 在虚拟机中添加新硬盘,选择物理硬盘。
4.2. DDA硬件直通
参看网卡、显卡直通。
评论区