一.SRIOV是啥。
请百度。
二.怎么配置。
建议看intel官方文档.
简单来说,大概步骤如下:
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 if [[ $(bridge fdb show|grep "${brnet_mac} dev ${pf_dev}"|wc -l) = 0 ]];then 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}" != "" ]]; then bridge fdb add ${brnet_mac} dev ${pf_dev} >&2 fi done fi done fi
标签:bridge,虚拟机,宿主机,dev,网卡,mac,sriov From: https://www.cnblogs.com/wzKeno/p/16849127.html