KVM环境SRIOV子卡同宿主机bridge网卡无法相互通信问题的解决办法

一.SRIOV是啥。

请百度。

二.怎么配置。

建议看intel官方文档. 

https://www.intel.com/content/www/us/en/developer/articles/technical/configure-sr-iov-network-virtual-functions-in-linux-kvm.html

简单来说,大概步骤如下:

1.BIOS里开启vt-d,与sriov

2.启动项添加iommu支持

3.通过 直通、macvtap或网络池模式将sriov硬件虚拟出来的子卡添加到虚拟机。

建议使用网络池模式,方便迁移。

三、遇到的问题。

当同一台宿主机上同时存在sriov网卡,与通过bridge桥接的虚拟网卡时,它们将无法通信。

同宿主上的两块SRIOV之间,或者两块桥接bridge的网卡之间,均可以正常通信。

经过外网查找,该原因是因为sriov会硬件虚拟出来一个网桥,与linux内核的软网桥,无法互相i学习mac地址表造成的。同一个网段的两个IP不会经过路由中转,但交换机无法通过ARP广播找到MAC地址,所以无法通信。

可能理解有误,供参考。

四、解决办法。

目前找到的一个办法是将桥接到bridge的虚拟网卡的mac地址,手动绑定到物理网卡上。

bridge fdb add 52:54:00:f9:88:bf dev em1

52:54:00:f9:88:bf为网桥上虚拟网卡的mac地址。

em1为提供sriov的物理网卡。

存在的问题:

1、宿主机重启后需要重新绑定。

2、虚拟机多的话,手动维护麻烦。

 

五、智能化点的解决办法。

思路是用脚本解决,比如/etc/rc.d/rc.local。

我是用/etc/libvirt/hooks/qemu 脚本。该脚本是libvirt对虚拟机进行启动、关机等操作时会调用的脚本。

启动虚拟机->调用脚本->获取该虚拟机上桥接网卡的mac地址->获取sriov网络池的PF网卡->绑定mac地址。

关于/etc/libvirt/hooks/qemu:

这个脚本有两个参数,$1是虚拟机名称,$2是事件操作(start,stop,prepare等)。

这个脚本不能再调用libvirt操作,如virsh命令,否则会死锁。

脚本如下,供参考。

#!/bin/bash
if [[ "${2}" = "start" ]]; then
    for brnet_mac in $(cat /etc/libvirt/qemu/${1}.xml|grep -A 1 'interface.*bridge'|awk -F'\047' '/mac address/{print $2}')
    do
        for net_pool in $(ls /etc/libvirt/qemu/networks/*.xml)
        do
            pf_dev=$(awk -F'\047' '/pf.*dev/{print $2}' ${net_pool})
            if [[ "${pf_dev}" != "" && $(bridge fdb show|grep "${brnet_mac} dev ${pf_dev}"|wc -l) = 0 ]]; then
                bridge fdb add ${brnet_mac} dev ${pf_dev} >&2
            fi
        done
    done
fi

 

posted @ 2022-11-01 20:51  wzKeno  阅读(1228)  评论(0)    收藏  举报