我有这个脚本,它检查 veth 对并在其上设置一个 ifb 设备,但每次它都说找不到该特定 veth 对的免费 ifb 设备。
可能是什么问题呢?即使我尝试运行modprobe
默认创建两个的命令ifb
,它也会抛出相同的错误。
#return 0 if the ifb is free
check_ifb()
{
local installed=`nl-qdisc-list -d $1`
[ -n "$installed" ] && return 1
return 0
}
setup_ifb()
{
for ifb in `ifconfig -a -s|egrep ^ifb|cut -d ' ' -f1`
do
check_ifb "$ifb" || continue
IFB="$ifb"
break
done
if [ -z "IFB" ]
then
echo "Unable to find a free ifb device for $vifname"
exit -1
fi
ip link set dev "IFB" up
if [ $? -ne 0 ]
then
echo ip link set dev "IFB" up failed
exit -1
fi
}
答案1
默认情况下有两个IFB加载时创建接口IFB内核模块。这是出于过时的原因,同样的方式两个假的加载时创建接口假的内核模块。这些接口是在初始网络命名空间中创建的。例如,如果系统位于容器内或只是一个(非初始)网络命名空间,则没有IFB接口将存在于此处。
不加载模块,希望得到IFB接口。反过来做:创造一个IFB接口,如果需要,内核模块无论如何都会被加载。不要再依赖ifconfig
Linux 上现在已经过时的工具。
例子:
ip link add name newifbdev type ifb
ip link set dev newifbdev up
你现在有一个IFBnewifbdev
调用并可用的接口TC-镜像数据包。
这甚至可以在一个用户例如,命名空间以 开头unshare -U -r -n
,尽管无法手动加载IFB来自此类用户命名空间的内核模块。如果尚未加载,该模块仍将通过创建接口来间接加载(并且使用默认设置,两个附加的 ifb 接口也会作为副作用出现在初始命名空间中)。