如何在Linux中列出名称空间?


24

Linux中是否有任何方法可以列出正在运行的主机上的所有名称空间?我需要检查特定进程的名称空间(例如,在LXC容器中运行的进程以及主机上的所有其他进程),然后找出它们的cgroup。


Answers:


12

自2013年提出此问题以来,使用名称空间的实用程序已得到改进。

lsnsutil-linux包中可以使用各种有用的格式列出所有不同类型的名称空间。

# lsns --help

Usage:
 lsns [options] [<namespace>]

List system namespaces.

Options:
 -J, --json             use JSON output format
 -l, --list             use list format output
 -n, --noheadings       don't print headings
 -o, --output <list>    define which output columns to use
 -p, --task <pid>       print process namespaces
 -r, --raw              use the raw output format
 -u, --notruncate       don't truncate text in columns
 -t, --type <name>      namespace type (mnt, net, ipc, user, pid, uts, cgroup)

 -h, --help     display this help and exit
 -V, --version  output version information and exit

Available columns (for --output):
          NS  namespace identifier (inode number)
        TYPE  kind of namespace
        PATH  path to the namespace
      NPROCS  number of processes in the namespace
         PID  lowest PID in the namespace
        PPID  PPID of the PID
     COMMAND  command line of the PID
         UID  UID of the PID
        USER  username of the PID

For more details see lsns(8).

lsns仅列出每个进程的最低PID-但是,pgrep如果要列出属于名称空间的所有进程,则可以使用该PID 。

例如,如果我在docker中运行gitlab并想查找在该命名空间中运行的所有进程,我可以:

# lsns  -t pid -o ns,pid,command  | grep gitlab
  4026532661   459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

然后将该pid(459)与pgrep

# pgrep --ns 459 -a
459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
623 postgres: gitlab gitlabhq_production [local] idle
[...around 50 lines deleted...]
30172 nginx: worker process

我还可以将名称空间ID(4026532661)与一起使用ps,例如:

ps -o pidns,pid,cmd | awk '$1==4026532661'
[...output deleted...]

3

从ip手册页获取网络名称空间

ip netns-处理网络名称空间管理从逻辑上讲,网络名称空间是网络堆栈的另一个副本,具有自己的路由,防火墙规则和网络设备。

   By  convention  a   named   network   namespace   is   an   object   at
   /var/run/netns/NAME  that can be opened.  The file descriptor resulting
   from opening /var/run/netns/NAME refers to the specified network names-
   pace.   Holding  that  file descriptor open keeps the network namespace
   alive.  The file descriptor can be used with the setns(2)  system  call
   to change the network namespace associated with a task.

   The  convention for network namespace aware applications is to look for
   global network configuration files first in  /etc/netns/NAME/  then  in
   /etc/.    For   example,   if   you   want   a   different  version  of
   /etc/resolv.conf for a network namespace used to isolate your  vpn  you
   would name it /etc/netns/myvpn/resolv.conf.

对于其他类型的名称空间,也许还有其他方法


1

Nsutils

Nsutils可以通过列出使用的名称空间nslist,也不需要root即可查看用户名称空间

网络名称空间

对于使用创建的网络名称空间ip netns,可以使用列出它们ip netns list


1

命名空间列表:

您可以使用listns.py

用法:./listns.pypython2 listns.py

探索系统

在基本/默认设置中,Ubuntu 12.04及更高版本提供以下名称空间(如果您以root用户身份执行,则会为系统中的每个进程显示这些名称空间)

  • ipc用于IPC对象和POSIX消息队列
  • mnt用于文件系统挂载点
  • 用于网络抽象(VRF)的网络
  • pid提供单独的,隔离的进程ID号空间
  • uts隔离两个系统标识符(节点名和域名),供uname使用

python代码

以下python代码列出了系统中所有非默认名称空间。程序流程是

  • 从初始化进程获取参考名称空间(PID = 1)。假设:PID = 1分配给系统支持的默认名称空间
  • 遍历/ var / run / netns /并将条目添加到列表中
  • 遍历所有PID的/ proc /并在/ proc // ns /中查找与PID = 1不相同的条目,然后将其添加到列表中
  • 打印结果

例:

python2 listns.py输出示例...您可以通过排序对其进行管道处理,也可以编辑脚本以符合您的需求

       PID  Namespace             Thread/Command
        --  net:[4026533172]      created by ip netns add qrouter-c33ffc14-dbc2-4730-b787-4747
        --  net:[4026533112]      created by ip netns add qrouter-5a691ed3-f6d3-4346-891a-3b59
       297  mnt:[4026531856]      kdevtmpfs 
      3429  net:[4026533050]**    dnsmasq --no-hosts --no-resolv --strict-order --bind-interfa
      3429  mnt:[4026533108]      dnsmasq --no-hosts --no-resolv --strict-order --bind-interfa
      3486  net:[4026533050]**    /usr/bin/python /usr/bin/neutron-ns-metadata-proxy --pid_fil
      3486  mnt:[4026533107]      /usr/bin/python /usr/bin/neutron-ns-metadata-proxy --pid_fil

资料来源:github-mirrorarticle全部归功于Ralf Trezeciak


如果这是您的脚本,则应说明。(并且在您的其他答案中也向该脚本发送垃圾邮件)。
老师

我已经链接了源代码,现在我添加了开发人员的名字,我也更新了其他两个答案,即使它链接了相同的工具,我对不同的问题也发布了不同的答案,请让我知道是否需要更新某些内容或删除答案。
intika
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.