最近给客户调试 macvlan network时,遇到了Linux kernel 报错 SIOCSIFFKAGS: Device or resource busy. 无法创建网络device。

结果长时间的debug分析, 发现问题是高并发压测 创建和释放macvlan device的时候,设备的mac address出现了重复。

ps:这个问题只出现在 macvlannetwork 的设备中。

可以用下面的shell脚本来复现macvlan Device or resource busy的错误:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
function setup
{
    i=$1
    ip l a m$i address 00:40:2F:4D:5E:6F link eth0 type macvlan mode bridge
    ip netns add ns$i
    ip l set m$i netns ns$i
    sleep 1
    ip netns exec ns$i ifconfig m$i 10.0.0.$((i+1))/24 up
    echo $?
}

echo cleaning up
ip -all netns d

echo creating netsnses
for i in `seq $1`; do
    echo $i....
    #setup $i &
    setup $i
done

如果把 macvlan 类型改为 dummy (上面脚本第5行 type macvlan 改为 type dummy) ,即使 MAC address 重复也不会引发kernel 报错。