Wie liste ich Namespaces unter Linux auf?

24

Gibt es eine Methode in Linux, um alle Namespaces auf dem laufenden Host aufzulisten? Ich muss Namespaces für bestimmte Prozesse überprüfen (z. B. Prozesse, die im LXC-Container ausgeführt werden, und alle anderen Prozesse auf dem Host) und dann cgroups von ihnen herausfinden.

Nullspiel
quelle

Antworten:

12

Die Dienstprogramme für die Arbeit mit Namespaces wurden verbessert, seit diese Frage 2013 gestellt wurde.

lsnsMit dem Paket util-linux können Sie alle verschiedenen Typen von Namespaces in verschiedenen nützlichen Formaten auflisten .

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

lsnslistet nur die niedrigste PID für jeden Prozess auf - aber Sie können diese PID mit verwenden, pgrepwenn Sie alle Prozesse auflisten möchten, die zu einem Namespace gehören.

Wenn ich zB gitlab im Docker laufen lasse und alle Prozesse in diesem Namespace finden möchte, kann ich:

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

und dann benutze diese pid (459) mit 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

Ich könnte auch die Namespace-ID (4026532661) mit verwenden ps, zB:

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

Von der IP-Manpage für den Netzwerknamenraum

ip netns - Netzwerknamespace-Verwaltung verarbeiten Ein Netzwerknamespace ist logischerweise eine weitere Kopie des Netzwerkstapels mit eigenen Routen, Firewall-Regeln und Netzwerkgeräten.

   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.

Für Namensräume anderer Typen gibt es möglicherweise andere Möglichkeiten

c4f4t0r
quelle
1

Nsutils

Nsutils kann den verwendeten Namespace mit auflisten.nslist Es ist auch kein Root erforderlich, um die Namespaces der Benutzer anzuzeigen

Netzwerk Namespaces :

Für Netzwerk-Namespaces, die mit erstellt wurden ip netns, können sie mit aufgelistet werdenip netns list

intika
quelle
1

Namespace-Lister:

Sie können listns.py verwenden

Verwendung: ./listns.pyoderpython2 listns.py

Das System erkunden

In der Basis- / Standardkonfiguration stellen Ubuntu 12.04 und höher Namespaces für bereit (Diese Namespaces werden für jeden Prozess im System angezeigt. Wenn Sie als root ausgeführt werden).

  • ipc für IPC-Objekte und POSIX-Nachrichtenwarteschlangen
  • mnt für Dateisystem-Mountpunkte
  • Netz für Netzwerkabstraktion (VRF)
  • pid, um einen getrennten, isolierten Prozess-ID-Nummernraum bereitzustellen
  • uts zum Isolieren von zwei Systemkennungen - Knotenname und Domänenname -, die von uname verwendet werden sollen

Der Python-Code

Der folgende Python-Code listet alle nicht standardmäßigen Namespaces in einem System auf. Der Programmablauf ist

  • Rufen Sie die Referenznamespaces vom Init-Prozess ab (PID = 1). Annahme: PID = 1 ist den vom System unterstützten Standard-Namespaces zugeordnet
  • Durchlaufen Sie / var / run / netns / und fügen Sie die Einträge zur Liste hinzu
  • Durchlaufen Sie / proc / über alle PIDs und suchen Sie nach Einträgen in / proc // ns /, die nicht mit PID = 1 identisch sind. Fügen Sie diese dann zur Liste hinzu
  • Drucken Sie das Ergebnis

Beispiel:

Beispiel für python2 listns.pyAusgabe ... können Sie Rohr es mit Art oder bearbeiten das Skript an Ihre Bedürfnisse anzupassen

       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

Quelle: Github-Spiegel und Artikel ; Alle Verdienste um Ralf Trezeciak

intika
quelle
Wenn dies Ihr Skript ist, sollten Sie dies angeben. (Und in deinen anderen Antworten spammt dieses Skript auch).
muru
Ich habe die Quelle bereits verlinkt, jetzt habe ich den Namen des Entwicklers hinzugefügt, ich habe auch die 2 anderen Antworten aktualisiert, ich habe unterschiedliche Antworten auf unterschiedliche Fragen gepostet, auch wenn es sich um das gleiche Tool handelt. Bitte lassen Sie mich wissen, wenn ich etwas aktualisieren muss oder eine Antwort löschen.
Intika