在 Linux 中,设置 2 个网络命名空间,ns1
并且ns2
.ip netns list
可以查看2个网络命名空间。
如果我将一个网络设备从 Linux 根命名空间移至 ,然后ns1
从ns1
移至ns2
,然后删除ns2
,我希望该网络设备可以移回ns1
。
实际结果是eth1
回到Linux根网络命名空间。我不确定是否如预期的那样。
这是详细的测试场景:
ip netns add ns1
ip netns add ns2
ip link set eth1 netns ns1
ip netns exec ns1 ip link set eth1 netns ns2
ip netns del ns2
预期结果: eth1
将在ns1
实际结果: eth1
回到 Linux 根命名空间 1
问题:有没有什么方法可以实现这种情况,以确保设备可以返回到 ns1 而不是 Linux 根网络命名空间 1?
答案1
据我所知,没有办法强制“物理”网络接口返回到与所谓的“初始”网络命名空间不同的网络命名空间。与 Patrick 的评论相反,Linux 内核认为网络命名空间是平坦的因此没有任何层次结构(参见ioctl_ns - Linux 命名空间的 ioctl() 操作,其中明确提到仅PID和用户命名空间是分层的)。
由于没有定义网络命名空间的层次结构(这很难应用于 IP 堆栈、地址和路由表),Linux 具有返回主规则,将网络接口移回初始网络命名空间,即init(1)/PID1 所加入的网络命名空间。
所有ip netns add ...
要做的就是通过调用创建一个新的网络命名空间unshare()
,然后将其绑定安装到其中/run/netns/ns1
以保持其浮动状态。接下来ip nets add ...
重新开始,将另一个网络命名空间挂载绑定到/run/netns/ns2
.两个完全不相关的网络命名空间。