我想列出我的 Linux 机器上的所有网络命名空间。到目前为止,我发现了两种推荐的方法来做到这一点:
ip netns list
和
lsns --type=net
不幸的是,这两个命令都没有列出所有命名空间!第一个命令仅列出在 /var/run/netns 中找到的命名空间,第二个命令仅查找其中至少有一个进程正在运行的命名空间。例如,Docker 会将其命名空间保存在 /var/run/docker/netns 中(因此 ip netns 不会显示它们),并且有些命名空间没有正在运行的进程(因此 lsns 不会显示它们)。是否有任何命令可以打印主机上的所有网络命名空间?
答案1
我再次遇到了这个缺点,lsns
并打开了一个问题在存储库中。它已经修复,在lsns
它的未来版本中将显示所有命名空间,甚至是那些仅挂载而没有进程在其中运行的命名空间。与此同时,该信息实际上可以在 中找到/proc/mounts
。所有具有 类型的挂载nsfs
都应为已挂载命名空间。这不仅限于网络命名空间,还涵盖所有命名空间。
答案2
不是按名称,但你可以通过查看 /proc/{PID}/ns/net 找到所有使用的命名空间
此脚本(以 root 身份运行)显示计算机上使用的网络命名空间 ID 列表:
find /proc/ -name ns 2>/dev/null |xargs -I NS ls -la NS/net 2> /dev/null| awk -F '->' '{print $2}'|sort -u
答案3
要将正在运行的 docker 容器的网络命名空间纳入其中,ip netns list
您只需设置一个符号链接(又名软链接),如下所示:
ln -Ts /var/run/docker/netns /var/run/netns
不幸的是,Linux 中没有通用命令来列出所有网络命名空间。您可以使用以下 Python 脚本列出至少所有链接的命名空间/var/run/netns
:https://github.com/Intika-Linux-Namespace/Namespace-Lister
对于使用其他路径的应用程序,您必须修改此脚本。