无法在启动时将接口添加到网络命名空间

无法在启动时将接口添加到网络命名空间

我在将物理以太网接口添加到预定义命名空间时遇到问题,在启动前/启动后事件中将其添加到接口文件中不起作用。它将 eth 添加到命名空间,但 ip 地址和 LOWER_UP 状态从未出现。在关闭事件中删除命名空间也不起作用,导致重新启动网络服务不切实际:如果命名空间已经存在,它会将其标记为失败,结果接口永远不会进入“启动”状态。

auto lo
iface lo inet loopback

#description of other interfaces

auto eth2
iface eth2 inet static
    address 196.10.10.200
    network 196.10.10.0
    gateway 196.10.10.100
    netmask 255.255.255.0
    pre-up ip netns add mynetns
    pre-up ip link set eth2 netns mynetns
    down ip netns delete mynetns

这样做的目的是保持守护程序软件运行,该软件仅在一个接口上工作。主机包含多个接口。守护程序可以重新启动并在 upstart 中创建。

答案1

总体而言,OP 的尝试将失败:即使将接口放入新的网络命名空间,也会在初始命名空间中尝试分配地址并失败。只能使用手动方法,并使用 // 配置所有内容pre-upup然后down它只是在玩杂耍下拉

为了避免界面状态(包括命名空间存在)和下拉由于之前的手动尝试,我添加了一些|| :以防止失败。一旦所有设置正确,就不需要这些了。由于手动的方法仍然负责启动接口,仍然必须在适当的位置创建一个假接口(但可以稍后删除,请参见答案的末尾)。

我正在使用现代语法快捷方式在命名空间中进行配置。过去这可能不可用。如果在非常旧的系统上需要,请考虑:

ip -n FOO BAR

相当于:

ip netns exec FOO ip BAR

并进行相应替换。

auto eth2
iface eth2 inet manual
    pre-up ip netns add mynetns || :
    pre-up ip link set eth2 netns mynetns || :
    pre-up ip link add eth2 type dummy || :
    pre-up ip -n mynetns link set eth2 up
    up ip -n mynetns address add 196.10.10.200/24 brd +
    up ip -n mynetns route add default via 196.10.10.100 dev eth2
    down ip link del eth2
    down ip -n mynetns link set eth2 netns 1 # prevents a rogue process to keep the interface "lost"
    down ip netns delete mynetns

有了这个(在这个测试中,真正的eth2伪造麦克维兰因此接口@if2):

# ifup eth2
# ip -br link show dev eth2
eth2             UNKNOWN        5a:4e:5c:64:98:92 <BROADCAST,NOARP,UP,LOWER_UP> 
# ip -n mynetns -br link show dev eth2
eth2@if2         UP             12:34:56:78:9a:bc <BROADCAST,MULTICAST,UP,LOWER_UP> 
# ip -n mynetns -br route
default via 196.10.10.100 dev eth2 
196.10.10.0/24 dev eth2 proto kernel scope link src 196.10.10.200 
# ifdown eth2
# ip -br link show dev eth2
eth2@enp2s0      DOWN           12:34:56:78:9a:bc <BROADCAST,MULTICAST> 

如果保留虚假界面存在问题eth2,只需替换:

    down ip link del eth2

和:

    up ip link del eth2

这样,虚拟接口在其角色结束后就会被删除:keep下拉当它想要打开界面时会很高兴(然后就不需要稍后删除它了)。

相关内容