我在将物理以太网接口添加到预定义命名空间时遇到问题,在启动前/启动后事件中将其添加到接口文件中不起作用。它将 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-up
。up
然后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下拉当它想要打开界面时会很高兴(然后就不需要稍后删除它了)。