🎆
netnsにインターフェイス作成する際のRTNETLINK answers: File exists
インターフェイス作成エラー
以下の記事で書いたようにnetwork namespaceが異なれば同名のインターフェイスを作成できます("host1" network namespace内の"eth0"インターフェイスと"host2" network namespace内の"eth0"インターフェイスが同時に存在できる)。
ただ、これを別環境で作成するときにエラーが出る場合があることに気づきました。
# ip link add eth0 netns host1 type veth peer name e0 netns router1
RTNETLINK answers: File exists
原因?
どうもdefault namespaceに同名のインターフェイスが存在する場合に上記エラーがでるようです。
以下がdefault namespaceのインターフェイス一覧。eth0が存在します。
# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether da:ec:b7:31:78:81 brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 8a:e1:46:34:42:0f brd ff:ff:ff:ff:ff:ff
4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
5: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:15:5d:f4:40:e2 brd ff:ff:ff:ff:ff:ff
この状態でip link add eth0 netns host1(「host1 network namespace内にeth0インターフェイスを作成する」というコマンドをdefault namespaceで実行)するとエラー。
host1 network namespaceにはeth0は作成されていません。
# ip link add eth0 netns host1 type veth peer name e0 netns router1
RTNETLINK answers: File exists
# ip netns exec host1 ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
対策
ip netns exec host1 ip link add eth0(「eth0インターフェイスを作成する」というコマンドをhost1 namespaceで実行)すると成功します。
host1 network namespaceにeth0が作成されました。
# ip netns exec host1 ip link add eth0 type veth peer name e0 netns router1
# ip netns exec host1 ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
4: eth0@if4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 66:e6:7a:95:3d:7d brd ff:ff:ff:ff:ff:ff link-netns router1
Discussion