0. 相关配置
首先说明一下目前设备中网卡透传大概操作流程:
- 从主机中把网卡与驱动解绑定,比如:网卡使用的是igb驱动,首先解绑定
- 网卡绑定vfio-pci虚拟化驱动,通过绑定vfio驱动后,网卡才能给虚拟机使用
如果要实现以上方式,系统需要进行如下配置:
- BIOS中开启VT-d直通模式,建议开启SRIOV模式
- 内核模块中增加vfio和IOMMU相关模块
进行了如上设置以后,在设备启动以后,可以看到加载的vfio相关模块
1. 问题现象
产品中使用vfio进行设备直通,在设备直通后,虚拟机启动时,启动报错:failed to set iommu for container,或者 Device initialization failed
2. 解决方案
造成以上问题的原因是因为设备不支持IOMMU 中断重映射,那怎么判断设备是否支持中断重映射呢,如下所示:
当 ecap (0xf020fe → …1110) 的第 3 位是 1 时,意味着 IOMMU 支持中断重映射。如上所示,应该支持中断重映射。
如果由于硬件不支持中断重新映射而导致传递失败,则可以考虑allow_unsafe_interrupts在虚拟机受信任时启用该选项。此选项默认是不启动的。
[root@localhost cloud]# cat /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts
N
[root@localhost cloud]#
具体开启方式如下:
在grub.cfg文件中增加 vfio_iommu_type1.allow_unsafe_interrupts = 1 的设置
3. vfio透传
与Legacy KVM Device Assignment(使用pci-stub driver) 相比, VFIO(Virtual Function IO[1]) 最大的改进就是隔离了设备之间的DMA和中断, 以及对IOMMU Group的支持, 从而有了更好的安全性。 IOMMU Group可以认为是对PCI设备的分组, 每个group里面的设备被视作IOMMU可以操作的最小整体; 换句话说, 同一个IOMMU Group里的设备不可以分配给不同的客户机。 在以前的Legacy KVM Device Assignment中, 并不会检查这一点, 而后面的操作却注定是失败的。 新的VFIO会检查并及时报错。
另外, 新的VFIO架构也做到了平台无关, 有更好的可移植性。
查看有哪些IOMMU Group以及所属的设备:
[root@localhost cloud]# ls /sys/kernel/iommu_groups/
0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 47 49 6 8
1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 46 48 5 7 9
[root@localhost cloud]#