显卡直通失败最常因IOMMU分组不独立,即显卡与USB/SATA/网卡等设备同组,导致VFIO拒绝绑定;须用命令检查分组、ACS拆分、屏蔽原驱动、精确配置vfio-pci参数并确保其注入initramfs。

确认IOMMU分组是否允许独立直通
显卡直通失败最常卡在这一步:设备和USB控制器、SATA控制器甚至网卡被绑在同一个 IOMMU Group 里。VFIO拒绝绑定这种“混组”设备,因为无法保证内存访问隔离。执行以下命令一次性查看所有分组:
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*/}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done 2>/dev/null | sort -V
重点看你要直通的显卡(VGA compatible controller)所在组里有没有其他非附属设备。NVIDIA显卡通常带一个配套的 Audio device(同属10de:xxxx厂商ID),这算正常;但如果出现 USB controller、SATA controller 或 PCI bridge,说明分组不干净——此时不能硬上VFIO,得先处理ACS或换硬件。
用vfio-pci绑定前必须屏蔽原驱动
即使IOMMU分组干净,宿主机的 nouveau、nvidia、amdgpu 或 i915 驱动仍会抢先绑定显卡,导致 vfio-pci 加载失败。不能只靠 modprobe vfio-pci 就完事。
- 先查当前绑定状态:
lspci -k -s 01:00.0(把01:00.0换成你的真实BDF地址),确认Kernel driver in use不是vfio-pci - 黑名单原驱动:在
/etc/modprobe.d/blacklist.conf中追加blacklist nouveau或blacklist nvidia(根据实际驱动名) - 禁用内核模式设置(KMS):在GRUB参数中加
rd.driver.blacklist=nouveau modprobe.blacklist=nouveau video=vesafb:off vga=normal(仅限NVIDIA消费卡) - 更新initramfs:
sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut -f(RHEL/CentOS)
vfio-pci模块参数必须精确匹配设备ID
vfio-pci 不会自动抢设备,必须显式告诉它“要管哪些硬件”。参数写错一个字符,设备就永远留在原驱动手里。
- 从
lspci -nn输出中提取完整ID,例如:01:00.0 VGA [0300]: NVIDIA GP104 [10de:13c0]和01:00.1 Audio [0403]: NVIDIA GP104 HDMI [10de:10ef] - 写入
/etc/modprobe.d/vfio.conf:options vfio-pci ids=10de:13c0,10de:10ef disable_vga=1(disable_vga=1是防止宿主机尝试初始化VGA资源) - 注意:ID顺序无关,但逗号前后不能有空格;多个设备用英文逗号分隔;
disable_vga=1对Intel集显直通无效,但对NVIDIA/AMD独显几乎必加 - 加载模块后验证:
lsmod | grep vfio应看到vfio_pci、vfio_iommu_type1、vfio三者都存在
重启后设备没进vfio-pci?检查initramfs加载时机
很多用户卡在“配置写了,参数也加了,但重启后 lspci -k 还显示原驱动”,根本原因是 vfio-pci 模块没进initramfs,等系统起来才加载,此时显卡早被 nouveau 占了。
- 确认模块已加入initramfs:
lsinitramfs /boot/initrd.img-$(uname -r) | grep vfio(Debian/Ubuntu)或lsinitrd | grep vfio(RHEL/CentOS) - 若无输出,需手动注入:Debian系执行
echo "vfio-pci" | sudo tee -a /etc/initramfs-tools/modules,再sudo update-initramfs -u - RHEL/CentOS系:编辑
/etc/dracut.conf.d/vfio.conf,写入force_drivers+=" vfio-pci ",再sudo dracut -f - 最后验证:
sudo dmesg | grep -i "vfio.*bound"应出现类似vfio-pci 0000:01:00.0: Adding to iommu group 12的日志
分组冲突不是配置问题,而是硬件拓扑限制;VFIO绑定失败往往不是参数写错,而是initramfs没生效或原驱动没彻底卸载。这两处漏掉任何一环,虚拟机启动时都会报 Failed to assign device 或直接卡在PCI设备枚举阶段。


















