Como listar namespaces no Linux?

24

Existe algum método no Linux para listar todos os namespaces no host em execução? Preciso verificar os namespaces para processos específicos (por exemplo, processos em execução no contêiner LXC e todos os outros processos no host) e, em seguida, descobrir cgroups deles.

zerospiel
fonte

Respostas:

12

Os utilitários para trabalhar com namespaces melhoraram desde que essa pergunta foi feita em 2013.

lsnsdo pacote util-linux pode listar todos os diferentes tipos de namespaces, em vários formatos úteis.

# 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).

lsnslista apenas o PID mais baixo de cada processo - mas você pode usá- pgreplo se desejar listar todos os processos pertencentes a um espaço para nome.

por exemplo, se estou executando o gitlab na janela de encaixe e deseja encontrar todos os processos em execução nesse espaço para nome, posso:

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

e, em seguida, use esse pid (459) com 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

Eu também poderia usar o ID do espaço para nome (4026532661) com ps, por exemplo:

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

Da página de manual ip para o espaço de nome da rede

ip netns - processo de gerenciamento de namespace de rede Um namespace de rede é logicamente outra cópia da pilha de rede, com rotas próprias, regras de firewall e dispositivos de rede.

   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.

Para espaços de nomes de outros tipos, talvez haja outras maneiras

c4f4t0r
fonte
1

Nsutils

O Nsutils pode listar o espaço de nomes usado nslist, mas também não requer raiz para ver os espaços de nome do usuário

Namespaces de rede :

Para o namespace de rede criado com ip netns, eles podem ser listados comip netns list

intika
fonte
1

Namespace-Lister:

Você pode usar listns.py

Uso: ./listns.pyoupython2 listns.py

Explorando o sistema

Na configuração básica / padrão, o Ubuntu 12.04 e superior fornecem namespaces para (esses namespaces são mostrados para todos os processos no sistema. Se você executar como root)

  • ipc para objetos IPC e filas de mensagens POSIX
  • mnt para pontos de montagem do sistema de arquivos
  • rede para abstração de rede (VRF)
  • pid para fornecer um espaço de número de identificação de processo isolado e separado
  • para isolar dois identificadores de sistema - nodename e domainname - a serem usados ​​por uname

O código python

O código python abaixo está listando todos os namespaces não padrão em um sistema. O fluxo do programa é

  • Obtenha os namespaces de referência do processo init (PID = 1). Suposição: PID = 1 é atribuído aos namespaces padrão suportados pelo sistema
  • Passe por / var / run / netns / e adicione as entradas à lista
  • Passe por / proc / over todos os PIDs e procure entradas em / proc // ns / que não sejam iguais às de PID = 1 e adicione-as à lista
  • Imprimir o resultado

Exemplo:

Exemplo de python2 listns.pysaída ... você pode canalizá-lo com classificação ou edição do script para atender às suas necessidades

       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

Fonte: github-mirror e artigo ; todo o crédito a Ralf Trezeciak

intika
fonte
Se esse é o seu script, você deve declarar isso. (E nas suas outras respostas também enviamos spam para esse script).
muru
Eu já vinculei a fonte, agora adicionei o nome do desenvolvedor, atualizei as 2 outras respostas, publiquei respostas diferentes para perguntas diferentes, mesmo que vincule a mesma ferramenta, por favor, deixe-me saber se tenho que atualizar algo ou exclua uma resposta.
intika