¿Cómo enumerar espacios de nombres en Linux?

24

¿Hay algún método en Linux para enumerar todos los espacios de nombres en el host en ejecución? Necesito verificar los espacios de nombres para procesos particulares (por ejemplo, procesos que se ejecutan en el contenedor LXC y todos los demás procesos en el host) y luego encontrar grupos de ellos.

zerospiel
fuente

Respuestas:

12

Las utilidades para trabajar con espacios de nombres han mejorado desde que se hizo esta pregunta en 2013.

lsnsdel paquete util-linux puede enumerar todos los diferentes tipos de espacios de nombres, en varios formatos útiles.

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

lsnssolo enumera el PID más bajo para cada proceso, pero puede usar ese PID pgrepsi desea enumerar todos los procesos que pertenecen a un espacio de nombres.

por ejemplo, si estoy ejecutando gitlab en docker y quiero encontrar todos los procesos que se ejecutan en ese espacio de nombres, puedo:

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

y luego usa ese pid (459) con 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

También podría usar la identificación del espacio de nombres (4026532661) con ps, por ejemplo:

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

Desde la página de manual de ip para el espacio de nombre de red

ip netns: gestión de espacio de nombres de red de proceso Un espacio de nombres de red es lógicamente otra copia de la pila de red, con sus propias rutas, reglas de firewall y dispositivos de red.

   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 espacios de nombres de otros tipos, tal vez hay otras formas

c4f4t0r
fuente
1

Nsutils

Nsutils puede enumerar el espacio de nombres utilizado nslist, tampoco requiere root para ver los espacios de nombres de usuario

Espacios de nombres de red :

Para el espacio de nombres de red creado con ip netns, pueden enumerarse conip netns list

intika
fuente
1

Espacio de nombres-Lister:

Puedes usar listns.py

Uso: ./listns.pyopython2 listns.py

Explorando el sistema

En la configuración básica / predeterminada, Ubuntu 12.04 y superior proporcionan espacios de nombres para (Estos espacios de nombres se muestran para cada proceso en el sistema. Si ejecuta como root)

  • ipc para objetos IPC y colas de mensajes POSIX
  • mnt para puntos de montaje del sistema de archivos
  • red para abstracción de red (VRF)
  • pid para proporcionar un espacio de número de ID de proceso aislado y separado
  • uts para aislar dos identificadores del sistema (nombre de dominio y nombre de dominio) para ser utilizados por uname

El código de python

El siguiente código de Python enumera todos los espacios de nombres no predeterminados en un sistema. El flujo del programa es

  • Obtenga los espacios de nombres de referencia del proceso de inicio (PID = 1). Supuesto: PID = 1 se asigna a los espacios de nombres predeterminados admitidos por el sistema
  • Recorra / var / run / netns / y agregue las entradas a la lista
  • Recorra / proc / sobre todos los PID y busque entradas en / proc // ns / que no sean las mismas que para PID = 1 y agregue luego a la lista
  • Imprime el resultado

Ejemplo:

Ejemplo de python2 listns.pysalida ... puede canalizarlo con ordenar o editar el script para satisfacer sus necesidades

       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

Fuente: github-mirror y artículo ; todo crédito a Ralf Trezeciak

intika
fuente
Si este es su guión, debe indicarlo. (Y en sus otras respuestas enviando spam también a este script).
Muru
Ya vinculé la fuente, ahora agregué el nombre del desarrollador, actualicé las otras 2 respuestas también, publiqué diferentes respuestas a diferentes preguntas, incluso si está vinculando la misma herramienta, avíseme si tengo que actualizar algo o eliminar una respuesta.
intika