Linuxで名前空間をリストする方法は?


24

Linuxには、実行中のホスト上のすべての名前空間をリストする方法がありますか?特定のプロセスの名前空間をチェックする必要があります(たとえば、LXCコンテナーで実行されているプロセスとホスト上の他のすべてのプロセス)。次に、それらのcgroupを見つけます。


回答:


12

この質問が2013年に尋ねられてから、名前空間を操作するためのユーティリティが改善されました。

lsnsutil-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のみをリストしますがpgrep、ネームスペースに属するすべてのプロセスをリストする場合は、そのPIDを使用できます。

たとえば、Dockerで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 manページから

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

名前空間リスター:

listns.pyを使用できます

使用法:./listns.pyまたはpython2 listns.py

システムの探索

基本/デフォルト設定では、Ubuntu 12.04以降で名前空間を提供します(これらの名前空間は、システム内のすべてのプロセスに対して表示されます。rootとして実行する場合)

  • IPCオブジェクトおよびPOSIXメッセージキューのipc
  • ファイルシステムのマウントポイントのmnt
  • ネットワーク抽象化(VRF)のネット
  • pidにより、分離され分離されたプロセスID番号スペースを提供します
  • unameが使用する2つのシステム識別子(ノード名とドメイン名)を分離するためのuts

Pythonコード

以下のPythonコードは、システム内のすべてのデフォルト以外の名前空間をリストしています。プログラムの流れは

  • initプロセスから参照名前空間を取得します(PID = 1)。仮定:PID = 1は、システムがサポートするデフォルトのネームスペースに割り当てられます
  • / var / run / netns /をループし、エントリをリストに追加します
  • すべてのPIDで/ proc /をループし、PID = 1とは異なる/ proc // ns /のエントリを探し、リストに追加します
  • 結果を印刷する

例:

python2 listns.py出力の例... sortでパイプするか、ニーズに合わせてスクリプトを編集できます

       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 and article ; すべてのクレジットラルフTrezeciak


これがスクリプトの場合は、それを明記する必要があります。(そして、このスクリプトをスパムする他の回答でも)。
ムル

私はすでにソースをリンクし、開発者の名前を追加し、他の2つの回答も更新しました。同じツールをリンクしていても、異なる質問に異なる回答を投稿しました、何かを更新する必要がある場合はお知らせくださいまたは回答を削除します。
intika
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.