解决启动dpdk时,报"VFIO group is not viable! Not all device in IOMMU group bound to VFIO or unbund" 的问题
问题如下图:
这个错误信息其实是linux内核的vfio驱动报出来的,主要原因是"在iommu分组中,不是所有的设备都被绑定到vfio驱动".
所以,解决方案核心思想: 将要使用的设备独立到一个iommu分组中。
步骤1:通过以下 "list_iommu_group.sh "可以看到所有的iommu分组和其分组内的设备信息:
list_iommu_group.sh 脚本内容如下:
1 #!/bin/bash 2 for d in $(find /sys/kernel/iommu_groups/ -type l | sort -n -k5 -t/); do 3 n=${d#*/iommu_groups/*}; n=${n%%/*} 4 printf 'IOMMU Group %s ' "$n" 5 lspci -nns "${d##*/}" 6 done;
执行结果类似下图:
步骤2 : 内核启用 pcie_acs_override
以 debian-11 系统为例,
1、 编辑 grub的默认配置文件 "/etc/default/grub" , 添加"pcie_acs_override=downstream,multifunction"
2、更新系统的grub : update-grub
3、 重启后,再次执行"list_iommu_group.sh "脚本来查看iommu分组情况是否发生改变。如果发现需要使用的设备被独立为一个分组,则成功了; 如果未发生变化则说明内核不支持acs,需要给内核打入vfio的补丁才行 。
( 内核打acs补丁步骤的参考:
1. 查看当前系统的内核版本号:
cat /proc/version
2. 下载自己需要版本的内核源码;
由于Linux内核文件容量较大,所以建议使用国内的gitee仓库去下载: https://gitee.com/mirrors/linux_old1.git
3. 下载对应版本vfio补丁文件, vfio补丁的下载地址 : https://aur.archlinux.org/linux-vfio.git ;
4. 内核打入补丁后,重新编译并安装,重启。
linux内核打补丁参考: https://onestraw.github.io/linux/apply-patch-to-linux-kernel/
如何编译linux内核参考: https://www.cnblogs.com/harrypotterjackson/p/11846222.html
)