Как перечислить пространства имен в Linux?


24

Есть ли в Linux какой-либо метод для перечисления всех пространств имен на работающем хосте? Мне нужно проверить пространства имен для определенных процессов (например, процессы, запущенные в LXC-контейнере и все другие процессы на хосте), а затем выяснить их группы.


Ответы:


12

Утилиты для работы с пространствами имен улучшились с тех пор, как этот вопрос был задан в 2013 году.

lsnsиз пакета util-linux можно перечислить все различные типы пространств имен в различных полезных форматах.

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

lsnsперечисляет только самый низкий PID для каждого процесса - но вы можете использовать этот PID, pgrepесли хотите перечислить все процессы, принадлежащие пространству имен.

Например, если я запускаю gitlab в Docker и хочу найти все процессы, запущенные в этом пространстве имен, я могу:

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

и затем используйте этот pid (459) с 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

Я также мог бы использовать идентификатор пространства имен (4026532661) с ps, например:

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

3

Со страницы руководства ip для пространства имен сети

ip netns - управление сетевым пространством имен. Пространство имен сети - это логически еще одна копия сетевого стека со своими собственными маршрутами, правилами межсетевого экрана и сетевыми устройствами.

   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.

Для пространств имен других типов, возможно, есть другие способы


1

Nsutils

Nsutils может перечислять используемое пространство имен nslist, для него также не требуется root, чтобы видеть пространства имен пользователя.

Пространства имен сети :

Для сетевого пространства имен, созданного с помощью ip netns, они могут быть перечислены сip netns list


1

Пространство имен-Lister:

Вы можете использовать listns.py

Использование: ./listns.pyилиpython2 listns.py

Изучение системы

В базовой / стандартной установке Ubuntu 12.04 и выше предоставляют пространства имен для (эти пространства имен показаны для каждого процесса в системе. Если вы выполняете от имени пользователя root)

  • ipc для объектов IPC и очередей сообщений POSIX
  • mnt для точек монтирования файловой системы
  • сеть для сетевой абстракции (VRF)
  • pid для предоставления отдельного, изолированного пространства номеров идентификаторов процессов
  • позволяет изолировать два системных идентификатора - nodename и domainname - для использования uname

Код Python

Код Python ниже перечисляет все пространства имен по умолчанию в системе. Поток программы

  • Получить ссылочные пространства имен из процесса инициализации (PID = 1). Предположение: PID = 1 назначен пространствам имен по умолчанию, поддерживаемым системой
  • Прокрутите / var / run / netns / и добавьте записи в список
  • Прокрутите / proc / поверх всех PID и найдите записи в / proc // ns /, которые не совпадают с PID = 1, и добавьте их в список
  • Распечатать результат

Пример:

Пример python2 listns.pyвывода ... вы можете передать его с помощью сортировки или отредактировать скрипт в соответствии с вашими потребностями

       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

Источник: github-mirror и article ; все заслуги перед Ральфом Трежечаком


Если это ваш сценарий, вы должны заявить об этом. (И в других ваших ответах спам этот скрипт тоже).
Муру

я уже связал источник, теперь я добавил имя разработчика, я также обновил 2 других ответа, я разместил разные ответы на разные вопросы, даже если он связан с тем же инструментом, пожалуйста, дайте мне знать, если мне нужно что-то обновить или удалите ответ.
Интика
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.