Linux 5.15.126内核下不依赖VFIO/IOMMU实现KVM GPU直通的可行性咨询
我最近在研究KVM GPU直通,发现大部分教程都是基于IOMMU+VFIO实现的,想问问有没有办法绕开IOMMU?我的内核版本是5.15.126。
更新1:尝试使用libvirt的legacy KVM直通方式
我在libvirt的文档里了解到,<forward type='hostdev'>接口可以通过添加<driver name='kvm'/>子元素,指定使用由KVM内核模块直接处理的传统设备直通方式(而非VFIO)——这个特性从libvirt 1.0.5版本开始支持,要求内核3.6及以上;1.1.3版本后,默认规则是如果系统能加载VFIO就优先用VFIO,否则回退到kvm方式。
于是我修改了虚拟机的XML配置,加入了对应的驱动指定:
<hostdev mode='subsystem' type='pci' managed='yes'> <driver name='kvm'/> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/> </hostdev>
但启动虚拟机时直接失败,报错:
error: unsupported configuration: host doesn't support legacy PCI passthrough
更新2:查看libvirt源码定位问题
我翻了libvirt 8.0.0的源码,发现问题根源:
- 在
domain_conf.c里虽然还保留了VIR_NETWORK_FORWARD_DRIVER_NAME_KVM的分支逻辑,会将后端设置为VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM; - 但到了
qemu_hostdev.c中,当检测到要使用VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM时,直接抛出错误并返回失败:
case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("host doesn't support legacy PCI passthrough")); return false;
更新3:查阅libvirt版本确认支持情况
查了libvirt的发布说明,在**v5.7.0(2019-09-03)**版本就已经彻底移除了KVM直通的支持:
The KVM style of PCI device assignment was removed from the kernel in version 4.12.0 after being deprecated since 4.2.0. Libvirt defaults to VFIO for a long time. Remove support for KVM device assignment from libvirt too.
另外看libvirt的枚举定义,目前标注的PCI直通后端有4种,但KVM方式已经被实际禁用:
/* the backend driver used for PCI hostdev devices */ typedef enum { VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT, /* detect automatically, prefer VFIO */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM, /* force legacy kvm style */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO, /* force vfio */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN, /* force legacy xen style, use pciback */ VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST } virDomainHostdevSubsysPCIBackendType;
最终结论
折腾了一下午之后,我得出的结论是:在Linux 5.15版本的内核下,不修改内核的话,想要不依赖VFIO/IOMMU实现KVM GPU直通是不可能的。
备注:内容来源于stack exchange,提问作者Jason Lee




