Comment lister les espaces de noms sous Linux?

24

Existe-t-il une méthode sous Linux pour répertorier tous les espaces de noms sur l'hôte en cours d'exécution? J'ai besoin de vérifier les espaces de noms pour des processus particuliers (par exemple, les processus s'exécutant dans le conteneur LXC et tous les autres processus sur l'hôte), puis de trouver des groupes de contrôle d'entre eux.

zerospiel
la source

Réponses:

12

Les utilitaires pour travailler avec les espaces de noms se sont améliorés depuis que cette question a été posée en 2013.

lsnsdu paquet util-linux peut lister tous les différents types d'espaces de noms, dans différents formats utiles.

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

lsnsrépertorie uniquement le PID le plus bas pour chaque processus - mais vous pouvez utiliser ce PID avec pgrepsi vous souhaitez répertorier tous les processus appartenant à un espace de noms.

Par exemple, si j'exécute gitlab dans Docker et que je veux trouver tous les processus en cours d'exécution dans cet espace de noms, je peux:

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

puis, utilisez ce pid (459) avec 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

Je pourrais également utiliser l'identifiant de l'espace de noms (4026532661) avec ps, par exemple:

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

Depuis la page de manuel ip pour l'espace de nom du réseau

ip netns - processus de gestion de l'espace de noms réseau Un espace de noms réseau est logiquement une autre copie de la pile réseau, avec ses propres routes, règles de pare-feu et périphériques réseau.

   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.

Pour les espaces de noms d'autres types, il existe peut-être d'autres façons

c4f4t0r
la source
1

Nsutils

Nsutils peut lister les espaces de noms utilisés avec nslist, il n'a pas non plus besoin de root pour voir les espaces de noms des utilisateurs

Espaces de noms réseau :

Pour les espaces de noms de réseau créés avec ip netns, ils peuvent être répertoriés avecip netns list

intika
la source
1

Espace de noms-Lister:

Vous pouvez utiliser listns.py

Utilisation: ./listns.pyoupython2 listns.py

Explorer le système

Dans la configuration de base / par défaut, Ubuntu 12.04 et versions ultérieures fournissent des espaces de noms pour (Ces espaces de noms sont affichés pour chaque processus du système. Si vous exécutez en tant que root)

  • ipc pour les objets IPC et les files d'attente de messages POSIX
  • mnt pour les points de montage du système de fichiers
  • net pour l'abstraction du réseau (VRF)
  • pid pour fournir un espace de numéro d'ID de processus séparé et isolé
  • uts pour isoler deux identifiants système - nom de nœud et nom de domaine - à utiliser par uname

Le code python

Le code python ci-dessous répertorie tous les espaces de noms non par défaut dans un système. Le déroulement du programme est

  • Obtenez les espaces de noms de référence à partir du processus init (PID = 1). Hypothèse: PID = 1 est affecté aux espaces de noms par défaut pris en charge par le système
  • Parcourez / var / run / netns / et ajoutez les entrées à la liste
  • Parcourez / proc / sur tous les PID et recherchez les entrées dans / proc // ns / qui ne sont pas les mêmes que pour PID = 1 et ajoutez-les ensuite à la liste
  • Imprimer le résultat

Exemple:

Exemple de python2 listns.pysortie ... vous pouvez le diriger avec le tri ou modifier le script pour l'adapter à vos besoins

       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

Source: github-mirror et article ; tout crédit à Ralf Trezeciak

intika
la source
S'il s'agit de votre script, vous devez l'indiquer. (Et dans vos autres réponses spammant également ce script).
muru
j'ai déjà lié la source, maintenant j'ai ajouté le nom du développeur, j'ai également mis à jour les 2 autres réponses, j'ai posté une réponse différente à différentes questions même s'il relie le même outil, s'il vous plaît faites le moi savoir si je dois mettre à jour quelque chose ou supprimez une réponse.
intika