ip netns与unshare持久化网络命名空间存储及互用性相关问题
解决方案
1. 直接用unshare引用ip创建的网络命名空间
ip netns创建的所有网络命名空间默认都绑定挂载在/var/run/netns/目录下,命名空间名就是文件名,你直接把这个路径传给unshare的--net参数即可,不需要嵌套ip netns exec。
示例:
先创建ip管理的网络命名空间:
ip netns add mynetns2
直接用unshare启动程序,复用该网络命名空间,同时配置其他命名空间:
# 示例:使用mynetns2的网络命名空间,同时新建pid、mount命名空间,启动bash unshare --net=/var/run/netns/mynetns2 --pid --fork --mount-proc /bin/bash
注意:你之前示例中
--net==的双等号是语法错误,正确参数为单等号--net=<路径>。
2. 让ip命令识别unshare创建的网络命名空间
ip命令只会扫描/var/run/netns/目录下的绑定挂载文件,你只要把unshare创建的命名空间绑定挂载到该目录下即可互通:
# 假设你之前用unshare创建的命名空间绑定路径为/root/mynetns1 mkdir -p /var/run/netns mount --bind /root/mynetns1 /var/run/netns/mynetns1
执行后ip netns list就可以列出mynetns1,也可以正常用ip netns exec操作该命名空间。
3. 网络命名空间的列举与访问方法
列举网络命名空间
- 仅列举ip命令管理的命名空间:
ip netns list
- 列举系统中所有存在的网络命名空间(包含未被ip管理的):
# lsns为util-linux包自带工具,绝大多数发行版默认预装 lsns -t net
访问任意网络命名空间
- 已知命名空间绑定挂载路径:使用nsenter直接进入
nsenter --net=<命名空间绑定路径> <要执行的命令> # 示例:进入/root/mynetns1命名空间查看网卡信息 nsenter --net=/root/mynetns1 ip a
- 已知该命名空间下任意进程的PID:通过proc文件系统进入
nsenter --net=/proc/<目标PID>/ns/net <要执行的命令>
4. 程序与网络命名空间交互方法
程序侧可以通过Linux系统调用setns()实现命名空间切换:
- 以只读模式打开目标网络命名空间的绑定文件(或
/proc/<PID>/ns/net文件),获取文件描述符 - 调用
setns(文件描述符, CLONE_NEWNET),即可将当前进程切换到目标网络命名空间 - 后续所有网络相关的系统调用都会在该命名空间下执行
内容的提问来源于stack exchange,提问作者Liam Kelly
相关产品推荐
相关产品推荐

