显卡直通后虚拟机无法启动,多数情况是IOMMU分组未将GPU隔离为独立设备组,导致vfio-pci拒绝绑定或ESXi禁止分配——此时设备仍被宿主机驱动占用,或与USB/SATA/网卡等捆绑在同一group中,根本无法完成安全直通。

确认IOMMU是否已启用并生成分组
SSH登录宿主机(Linux/KVM或Proxmox),执行:dmesg | grep -i "iommu\|dmar\|amd_iommu"。若输出中无IOMMU enabled或AMD-Vi: IOMMU enabled字样,说明硬件固件层或内核参数未生效。
检查内核启动参数:cat /proc/cmdline。Intel平台必须含intel_iommu=on iommu=pt,AMD平台必须含amd_iommu=on iommu=pt。缺少iommu=pt会导致仅启用IOMMU但不启用直通模式,GPU仍无法脱离host控制。
运行find /sys/kernel/iommu_groups/ -type l | wc -l。结果为0表示IOMMU未激活;结果为1(仅group 0)说明ACS未启用或BIOS未正确配置,所有设备被压进默认组——这是HD630、B550主板常见现象。
定位GPU所在IOMMU分组及组内成员
先查GPU PCI地址:lspci -nn | grep -i "vga\|3d\|display",记下类似0a:00.0 [10de:2206]的ID。
执行readlink /sys/bus/pci/devices/0000:0a:00.0/iommu_group,返回如../../iommu_groups/7即为所属分组编号。
进入该分组目录:ls -l /sys/kernel/iommu_groups/7/devices/。若列出多个设备(如0000:00:02.0核显、0000:00:14.0USB控制器、0000:00:1f.2SATA),说明GPU未孤立——【这是直通失败的直接原因】。消费级主板(如ASUS B550-F、MSI B450M)因芯片组限制,常无法满足ACS能力,必须接受该物理事实。
验证ACS能力是否存在
方法一:检查Root Port ACS支持
执行lspci -vv -s $(lspci | grep "PCI bridge" | head -1 | awk '{print $1}') | grep -A10 "Access Control"。若输出中ACS: 后为Unsupported或空白,说明上游PCIe桥未启用ACS,分组无法拆分。
方法二:查看拓扑结构
运行lspci -tv。正常应显示层级分支,如-[0000:00]-+-01.0-[01]----00.0 GPU和+-14.0-[02]----00.0 USB;若全为-[0000:00]-+-02.0 HD630、+-14.0 xHCI、+-1f.2 SATA扁平挂载,则证实无ACS,所有设备共享Root Complex,无法单独直通GPU。
注意:部分主板(如Supermicro X12SCD)需在BIOS中手动开启ACS Override或升级UEFI至v3.0a以上版本才可能解锁ACS位,旧版微码不可绕过。
强制绑定vfio-pci前的设备状态清理
第一步:确认GPU当前驱动
执行lspci -k -s 0000:0a:00.0,观察Kernel driver in use:字段。若为nvidia、amdgpu或i915,说明仍被宿主机占用,必须先卸载。
第二步:卸载宿主机驱动
对NVIDIA卡,运行echo "0000:0a:00.0" > /sys/bus/pci/devices/0000:0a:00.0/driver/unbind;若报错Device is busy,大概率因GPU是当前显示输出设备(尤其HD630),需改用headless模式或先切换到tty终端再操作。
第三步:绑定vfio-pci
执行echo "10de 2206" > /sys/bus/pci/drivers/vfio-pci/new_id(厂商ID:设备ID来自lspci -nn输出)。成功后lspci -k -s 0000:0a:00.0中Kernel driver in use:应变为vfio-pci。若仍显示原驱动或报No such device,说明IOMMU group未隔离,vfio拒绝接管——此时必须回到前两步排查分组。

















