Jak wyświetlić listę nazw w systemie Linux?


24

Czy jest jakaś metoda w systemie Linux, aby wyświetlić listę wszystkich przestrzeni nazw na działającym hoście? Muszę sprawdzić przestrzenie nazw dla poszczególnych procesów (np. Procesów działających w kontenerze LXC i wszystkich innych procesach na hoście), a następnie znaleźć ich grupy.


Odpowiedzi:


12

Ulepszono narzędzia do pracy z przestrzeniami nazw od czasu zadania tego pytania w 2013 r.

lsnsz pakietu util-linux może wyświetlać listę różnych typów przestrzeni nazw w różnych przydatnych formatach.

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

lsnswyświetla tylko najniższy PID dla każdego procesu - ale możesz użyć tego PID, pgrepjeśli chcesz wyświetlić listę wszystkich procesów należących do przestrzeni nazw.

np. jeśli korzystam z gitlab w oknie dokowanym i chcę znaleźć wszystkie procesy działające w tej przestrzeni nazw, mogę:

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

a następnie użyj tego pid (459) z 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

Mógłbym również użyć identyfikatora przestrzeni nazw (4026532661) z psnp .:

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

3

Ze strony podręcznika ip dla sieciowej przestrzeni nazw

ip netns - zarządzanie zarządzaniem przestrzenią nazw sieciowych Przestrzeń nazw sieciowych jest logicznie kolejną kopią stosu sieciowego, z własnymi trasami, regułami zapory i urządzeniami sieciowymi.

   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.

W przypadku przestrzeni nazw innych typów mogą istnieć inne sposoby



1

Lister przestrzeni nazw:

Możesz użyć listns.py

Zastosowanie: ./listns.pylubpython2 listns.py

Poznawanie systemu

W podstawowej / domyślnej konfiguracji Ubuntu 12.04 i wyższe zapewniają przestrzenie nazw dla (Przestrzenie nazw są pokazane dla każdego procesu w systemie. Jeśli wykonujesz jako root)

  • ipc dla obiektów IPC i kolejek komunikatów POSIX
  • mnt dla punktów montowania systemu plików
  • sieć do abstrakcji sieci (VRF)
  • pid, aby zapewnić oddzielną, izolowaną przestrzeń numeru identyfikacyjnego procesu
  • uts wyodrębnia dwa identyfikatory systemowe - nazwa węzła i nazwa domeny - do użycia przez uname

Kod python

Poniższy kod python zawiera listę wszystkich domyślnych przestrzeni nazw w systemie. Przebieg programu to

  • Uzyskaj referencyjne przestrzenie nazw z procesu init (PID = 1). Założenie: PID = 1 jest przypisany do domyślnych przestrzeni nazw obsługiwanych przez system
  • Zapętlaj przez / var / run / netns / i dodaj wpisy do listy
  • Pętlę przez / proc / przez wszystkie PID i poszukaj wpisów w / proc // ns /, które nie są takie same jak dla PID = 1, a następnie dodaj do listy
  • Wydrukuj wynik

Przykład:

Przykład python2 listns.pywyniku ... możesz potokować go sortowaniem lub edycją skryptu, aby dopasować go do swoich potrzeb

       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

Źródło: github-mirror i artykuł ; cały kredyt dla Ralfa Trezeciaka


Jeśli to jest twój skrypt, powinieneś to stwierdzić. (I w innych odpowiedziach również spamuję ten skrypt).
muru

już podłączyłem źródło, teraz dodałem nazwę programisty, zaktualizowałem również 2 inne odpowiedzi, opublikowałem inną odpowiedź na różne pytania, nawet jeśli łączy to samo narzędzie, daj mi znać, jeśli muszę coś zaktualizować lub usuń odpowiedź.
intika
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.