Linux에서 네임 스페이스를 나열하는 방법은 무엇입니까?


24

Linux에서 실행중인 호스트의 모든 네임 스페이스를 나열하는 방법이 있습니까? 특정 프로세스 (예 : LXC 컨테이너에서 실행중인 프로세스 및 호스트의 다른 모든 프로세스)에 대한 네임 스페이스를 확인한 다음 cgroup을 찾아야합니다.


답변:


12

이 질문이 2013 년에 요청 된 이후로 네임 스페이스 작업을위한 유틸리티가 향상되었습니다.

lsns로부터 폴더의 유틸리티 - 리눅스 패키지 다양한 유용한 형식으로, 네임 스페이스의 다양한 유형을 모두 나열 할 수 있습니다.

# 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 만 나열하지만 pgrep네임 스페이스에 속하는 모든 프로세스를 나열하려는 경우 해당 PID를 사용할 수 있습니다 .

예를 들어 도커에서 gitlab을 실행하고 해당 네임 스페이스에서 실행중인 모든 프로세스를 찾으려면 다음을 수행 할 수 있습니다.

# 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

다음과 같이 네임 스페이스 ID (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사용자 네임 스페이스를보기 위해 루트가 필요하지 않습니다.

네트워크 네임 스페이스 :

로 작성된 네트워크 네임 스페이스의 ip netns경우 다음과 같이 나열 될 수 있습니다.ip netns list


1

네임 스페이스 리스너 :

listns.py 를 사용할 수 있습니다

사용법 : ./listns.py또는python2 listns.py

시스템 탐색

기본 / 기본 설정에서 Ubuntu 12.04 이상은 다음에 대한 네임 스페이스를 제공합니다 (이 네임 스페이스는 시스템의 모든 프로세스에 대해 표시됩니다. 루트로 실행하는 경우).

  • IPC 오브젝트 및 POSIX 메시지 큐의 ipc
  • 파일 시스템 마운트 포인트의 경우 mnt
  • 네트워크 추상화 (VRF)를위한 네트워크
  • 분리 된 분리 된 프로세스 ID 번호 공간을 제공하는 pid
  • uname에서 사용할 두 개의 시스템 식별자 (노드 이름 및 도메인 이름)를 분리합니다.

파이썬 코드

아래의 파이썬 코드는 시스템의 기본이 아닌 네임 스페이스를 모두 나열합니다. 프로그램 흐름은

  • 초기화 프로세스 (PID = 1)에서 참조 네임 스페이스를 가져옵니다. 가정 : PID = 1은 시스템에서 지원하는 기본 네임 스페이스에 할당됩니다.
  • / var / run / netns /를 반복하고 목록에 항목을 추가하십시오.
  • 모든 PID를 통해 / proc /를 반복하고 / 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-mirrorarticle ; Ralf Trezeciak의 모든 크레딧


이것이 스크립트 인 경우이를 명시해야합니다. (그리고 당신의 다른 답변 에서이 스크립트를 스팸으로 만듭니다).
muru

나는 이미 소스를 연결했고 이제는 개발자의 이름을 추가했으며 2 개의 다른 답변도 업데이트했습니다. 동일한 도구를 연결하는 경우에도 다른 질문에 다른 답변을 게시했습니다. 뭔가를 업데이트 해야하는지 알려주십시오. 또는 답변을 삭제하십시오.
intika
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.