4. 设备直通与SR-IOV配置

在工业设备虚拟化场景中,把物理设备直接交给虚拟机使用,是降低I/O延迟、提升吞吐并保持设备原生驱动能力的关键手段。Intel平台提供两条主要路径:一是设备直通(PCIe Passthrough,依赖VT-d/VFIO),把整块物理设备独占分配给一台虚拟机;二是SR-IOV(Single Root I/O Virtualization),把一块物理功能(PF)切分为多个虚拟功能(VF),每个VF可独立分配给不同虚拟机。两者在隔离粒度、资源复用和配置复杂度上差异明显,需要按设备类型分别处理。

一、直通与SR-IOV的机制差异

设备直通的核心是IOMMU(Intel VT-d)。开启VT-d后,DMA重映射表把设备发起的DMA地址限制在该虚拟机被授权的物理内存区间内,从而阻止设备越权访问其他虚拟机或宿主内存。直通时,设备从宿主机驱动解绑,绑定到vfio-pci,再由QEMU通过vfio后端把设备映射进虚拟机。整块设备被独占,隔离性最强,但一台设备只能给一台虚拟机。

SR-IOV则把设备资源在硬件层切分。以Intel以太网卡为例,PF负责管理,VF是轻量PCIe功能,拥有独立的配置空间、BAR和队列资源。每个VF通过VT-d被单独隔离到目标虚拟机,因此多台虚拟机可共享同一块物理网卡,同时保持DMA隔离。代价是PF侧需要正确配置VF数量、VLAN、MAC和速率策略,且部分高级特性(如某些卸载、SR-IOV与vSwitch组合)受限于具体型号。

Intel 设备直通与 SR-IOV 隔离路径对比 路径 A:整设备直通(VFIO Passthrough) 物理设备(整块 PCIe Function) Intel X710 / Arc GPU / FPGA 整卡 VT-d DMA 重映射域 设备 DMA 仅可访问本 VM 授权内存页 vfio-pci 绑定 + QEMU vfio 后端 宿主机驱动解绑,设备独占 单台虚拟机独占使用 隔离性最强,资源不可复用 适用场景 • 工业 GPU 推理、FPGA 加速卡整卡独占 • 对延迟和确定性要求极高的实时控制 路径 B:SR-IOV 虚拟功能切分 物理功能 PF(管理面) Intel E810 / X710,配置 VF 数量与策略 硬件切分:VF0 / VF1 / VF2 / VF3 每个 VF 独立 BAR、队列、配置空间 VF0 → VM1 独立 IOMMU 域 VF1 → VM2 独立 IOMMU 域 VF2 → VM3 独立 IOMMU 域 共享同一物理端口与上行链路 带宽按队列调度,隔离依赖 VT-d + 硬件分区 适用场景 • 多台工业虚拟机共享高速网络,降低网卡数量 • 需要按 VM 划分带宽、VLAN 与安全域的场合

二、Intel 网卡 SR-IOV 配置要点

以Intel E810或X710为例,先在BIOS中开启VT-d和SR-IOV,并在内核启动参数中加入intel_iommu=on iommu=pt。随后通过sysfs设置VF数量:

# 查看网卡 PF 的 PCI 地址
lspci -nn | grep -i ethernet

# 以 0000:3b:00.0 为例,创建 4 个 VF
echo 4 > /sys/class/net/enp59s0f0/device/sriov_numvfs

# 确认 VF 已生成
lspci -nn | grep -i "virtual function"

VF生成后,需要为每个VF绑定vfio-pci,并记录其PCI地址(如0000:3b:02.0)。在libvirt的XML中,用<hostdev>把VF分配给虚拟机,同时建议设置<trustGuestRxFilters>no</trustGuestRxFilters>,避免虚拟机伪造MAC影响其他VF。若需要VLAN隔离,可在PF侧用ip link为VF设置VLAN,或在交换机端口上按VF所属虚拟机划分。

三、GPU 与 FPGA 直通实践

Intel Arc GPU或数据中心GPU直通时,除了绑定vfio-pci,还要注意显卡的音频功能(通常与GPU同一PCIe设备的不同Function)应一并直通,否则虚拟机内驱动可能异常。对于FPGA加速卡,若使用Intel FPGA PAC,需确认是否支持SR-IOV;部分型号支持将PF切分为多个VF,每个VF可独立分配给虚拟机,适合多租户工业推理场景。直通前应记录设备的vendor:device ID,并在vfio-pci的ids=参数中显式声明,避免宿主机驱动抢先绑定。

四、隔离性验证方法

配置完成后,隔离性不能只看虚拟机能否启动,而要从DMA、内存和中断三个层面验证。常用手段包括:

  • IOMMU 分组检查:执行find /sys/kernel/iommu_groups/ -type l,确认目标设备位于独立IOMMU组。若与其他设备同组,直通后可能影响宿主机或其他虚拟机。
  • DMA 越界测试:在虚拟机内用lspci -vv确认设备已启用,并尝试访问未授权物理地址(可用测试工具或驱动注入方式),观察是否触发IOMMU fault。宿主机dmesg中出现DMAR: DRHD fault即说明隔离生效。
  • 中断隔离:检查/proc/interrupts,确认VF或直通设备的中断只出现在目标虚拟机对应的vCPU线程上,未串扰到其他虚拟机。
  • 性能与功能回归:在虚拟机内运行iperf3或GPU推理基准,确认直通后吞吐、延迟与裸机接近;同时验证VF的VLAN、MAC策略是否按预期生效。

常见排障提示:若虚拟机启动时报vfio: failed to set iommu,优先检查BIOS中VT-d是否真正开启、内核是否加载vfio_iommu_type1,以及设备是否被宿主机驱动占用。若SR-IOV的VF数量设置失败,确认PF驱动版本支持SR-IOV,且sriov_numvfs写入前该接口未被其他VF占用。

整体而言,网卡优先考虑SR-IOV以获得更好的资源复用,GPU和FPGA在需要整卡确定性时选择直通。无论哪条路径,VT-d都是隔离的基石,配置后必须通过IOMMU分组、DMA fault日志和中断分布三项检查确认隔离真实生效,而不是仅凭虚拟机“能跑”就判定成功。