如何将接口移出网络命名空间?

dei*_*tch 11 namespaces iproute2 network-namespace

如果我将一个接口临时移动到一个 netns 中

ip link set eth10 netns myns
Run Code Online (Sandbox Code Playgroud)

然后它不再在根目录中可见,仅在名称空间 myns 中可见。

我如何将其移回,例如(这些显然不存在):

ip link unset eth10
Run Code Online (Sandbox Code Playgroud)

也许

ip link set eth10 netns root
Run Code Online (Sandbox Code Playgroud)

或类似?

dei*_*tch 14

我找到了答案。当然,你不能从 netns 内部做到这一点。但是,如果您ip netns exec ....从根网络命名空间内执行,则一切正常。

ip netns exec <PID> ip link set eth10 netns 1
Run Code Online (Sandbox Code Playgroud)

然后它起作用了!在我们输入 netns 之前,它需要将我们分配给它的 PID(在本例中为 1)置于执行命令(包装器)的上下文中。完毕!

  • 可以使用 `ip -n NS link set netns 1 dev DEV` 代替 exec (2认同)

小智 6

您可以使用该ip netns delete功能。从手册页:

ip [-all] netns delete [ NAME ] - 删除网络命名空间的名称

如果 NAME 出现在 /var/run/netns 中,它会被卸载并移除挂载点。如果这是网络命名空间的最后一个用户,则网络命名空间将被释放,所有物理设备都将移动到默认设备,否则网络命名空间将一直存在,直到没有更多用户为止。如果挂载点正在另一个挂载命名空间中使用,ip netns delete 可能会失败。

它不能用于所有目的,但它绝对是最简单的途径。

  • 只是一个额外的警告,因为我第一次读到这个答案时并没有想到这一点:这只适用于**物理**设备。`ip netns delete` 将删除已删除命名空间中的虚拟设备。 (4认同)

小智 5

根据 deitch 的回答,对我有用的是从自定义 netns 执行命令:

ip netns exec myns ip link set eth10 netns 1