Linuxで実行中のホストのすべての名前空間を一覧表示する方法はありますか?特定のプロセス(例:LXCコンテナーで実行されているプロセス、およびホスト上の他のすべてのプロセス)の名前空間を確認し、それらのcgroupを見つける必要があります。
この質問が2013年に尋ねられて以来、名前空間を操作するためのユーティリティが改善されました。
til-linux パッケージの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のみを一覧表示します。ただし、名前空間に属するすべてのプロセスを一覧表示する場合は、そのPIDをpgrep
で使用できます。
例えば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...]
ネットワーク名前空間の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.
他のタイプの名前空間については、おそらく他の方法があります
Nsutilsnslist
を使用して使用されている名前空間を一覧表示できます。また、ユーザーの名前空間を表示するためにルートを必要としません
ip netns
で作成されたネットワーク名前空間の場合、ip netns list
でリストできます。
Namespace-Lister:
listns.pyを使用できます
使用法: ./listns.py
またはpython2 listns.py
システムの探索
基本/デフォルト設定では、Ubuntu 12.04以降に名前空間が提供されます(これらの名前空間は、システムのすべてのプロセスで表示されます。ルートとして実行した場合)
python code
以下のpythonコードは、システム内のすべての非デフォルト名前空間をリストしています。プログラムフローは
例:
の例 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; Ralf Trezeciakへのすべてのクレジット