Linux 列出所有网络命名空间

Linux 列出所有网络命名空间

我想列出我的 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/netnshttps://github.com/Intika-Linux-Namespace/Namespace-Lister

对于使用其他路径的应用程序,您必须修改此脚本。

相关内容