Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 添加新的veth接口时运行脚本_Linux_Ubuntu_Networking_Docker_Sysadmin - Fatal编程技术网

Linux 添加新的veth接口时运行脚本

Linux 添加新的veth接口时运行脚本,linux,ubuntu,networking,docker,sysadmin,Linux,Ubuntu,Networking,Docker,Sysadmin,Docker为其创建的每个容器创建一个连接到桥接器(docker0)的veth接口 我想限制这些新的veth接口的带宽。我找到了一种使用wondershaper的方法。然而,我想自动化这一点 有没有办法让钩子在每次连接新的veth接口时运行脚本 我已经研究过在/etc/network/if up.d/中添加脚本,但是只有在引导期间添加veth时,脚本才会运行 下面是一些我试图得到通知的系统日志。我知道我可以跟踪这些日志,但这种方法似乎有点黑客,必须有一种方法通过操作系统获得有关此事件的通知 M

Docker为其创建的每个容器创建一个连接到桥接器(
docker0
)的
veth
接口

我想限制这些新的
veth
接口的带宽。我找到了一种使用wondershaper的方法。然而,我想自动化这一点

有没有办法让钩子在每次连接新的
veth
接口时运行脚本

我已经研究过在
/etc/network/if up.d/
中添加脚本,但是只有在引导期间添加
veth
时,脚本才会运行

下面是一些我试图得到通知的系统日志。我知道我可以跟踪这些日志,但这种方法似乎有点黑客,必须有一种方法通过操作系统获得有关此事件的通知

May  2 23:28:41 ip-10-171-7-2 kernel: [22170163.565812] netlink: 1 bytes leftover after parsing attributes.
May  2 23:28:42 ip-10-171-7-2 kernel: [22170163.720571] IPv6: ADDRCONF(NETDEV_UP): veth5964: link is not ready
May  2 23:28:42 ip-10-171-7-2 kernel: [22170163.720587] device veth5964 entered promiscuous mode
May  2 23:28:42 ip-10-171-7-2 avahi-daemon[1006]: Withdrawing workstation service for vethdc8c.
May  2 23:28:42 ip-10-171-7-2 kernel: [22170163.743283] IPv6: ADDRCONF(NETDEV_CHANGE): veth5964: link becomes ready
May  2 23:28:42 ip-10-171-7-2 kernel: [22170163.743344] docker0: port 27(veth5964) entered forwarding state
May  2 23:28:42 ip-10-171-7-2 kernel: [22170163.743358] docker0: port 27(veth5964) entered forwarding state
May  2 23:28:48 ip-10-171-7-2 kernel: [22170170.518670] docker0: port 26(vethb06a) entered forwarding state
May  2 23:28:57 ip-10-171-7-2 kernel: [22170178.774676] docker0: port 27(veth5964) entered forwarding state

您应该编写一个自定义的
udev
规则,在每次添加新接口时运行您的脚本。这就是Debian处理接口“热插拔”的功能

/etc/udev/rules.d/90我的网络规则

SUBSYSTEM=="net",           RUN+="/usr/local/bin/my-networking-agent.sh"
/usr/local/bin/my networking agent.sh

#!/bin/sh
logger "hey I just got interface ${INTERFACE} with action ${ACTION}"
编辑

以下是如何测试它:

# modprobe dummy0
# ifconfig dummy0 up
# tail -n1 /var/log/syslog
May  3 01:48:06 ernst logger: hey I just got interface dummy0 with action add

udev
规则是执行此操作的方法之一,但是其中存在一些信息不足,即没有可靠且简单的方法来知道与
veth
相关的容器。我不确定在您的情况下,仅在主机端的
veth
对上设置带宽限制是否足够,这可能是停止,但在容器的名称空间中还有另一端,这是可以使用
ip netns
nsenter
命令查看的内容。因此,如果您确实需要在
veth
对的两端进行操作,最好使用容器ID,这样您就可以查找PID和与之关联的网络名称空间。一种方法是运行
docker事件
并解析其输出,更好的方法是使用docker的域套接字API。对于我之前的一个用例,只需向外抛出
docker events
就足够了,下面是我编写的一个脚本,它所做的是在容器中添加一个路由,并使用
ethtool
关闭校验和卸载

#!/bin/sh -x

[ ! $# = 2 ] && exit 1;

container_interface="$1"
add_route="$2"

docker events | while read event
do
    echo $event | grep -q -v '\ start$' && continue

    container_id=`echo $event | sed 's/.*Z\ \(.*\):\ .*/\1/'`

    nsenter="nsenter -n -t {{ .State.Pid }} --"
    ip_route_add="ip route add ${add_route} dev ${container_interface} proto kernel scope link src {{ .NetworkSettings.IPAddress }}"
        ethtool_tx_off="ethtool -K ${container_interface} tx off >/dev/null"

    eval `docker inspect --format="${nsenter} ${ip_route_add}; ${nsenter} ${ethtool_tx_off};" ${container_id}`
done

除了
docker事件
,还有另一种通过
ip监视器
命令捕获网络事件的方法。但是,这样您仍然没有容器ID,类似于
udev
方法。

非常感谢!我正在翻阅ubuntu网络手册,找不到任何东西。可能使用
docker事件--filter'event=start'
而不是第一个grep?