私はすでに Linuxですべての名前空間をリストする方法 について質問しましたが、正確で正確な答えがなかったので、名前空間を見つけるのに役立つ方法を見つけたいと思います一部のプロセスまたはプロセスのグループのPID。 Linuxではどのように実行できますか?
これと 前の質問 の両方が関連しているので、両方に答えてみます。
名前空間への扉は/proc/*/ns/*
と/proc/*/task/*/ns/*
のファイルです。
名前空間は、その名前空間のプロセスunsharingによって作成されます。ネームスペースは、ns
ファイルを他の場所にbind-mountingすることで永続的にすることができます。
これが、たとえばnet名前空間に対してip netns
が行うことです。 net
名前空間の共有を解除し、/proc/self/ns/net
を/run/netns/netns-name
にバインドマウントします。
ルートpid名前空間にマウントされた/proc
では、次のようにして、プロセスが含まれているすべての名前空間を一覧表示できます。
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
大括弧内の数字はiノード番号です。
特定のプロセスでそれを取得するには:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
現在、永続的な名前空間があり、その中にプロセスはありません。それらを見つけることは非常にトリッキーなAFAICTになる可能性があります。
まず、複数のmount名前空間が存在する可能性があることを覚えておく必要があります。
# awk '$9 == "proc" {print FILENAME,$0}' /proc/*/task/*/mountinfo | sort -k2 -u
/proc/1070/task/1070/mountinfo 15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/19877/task/19877/mountinfo 50 49 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 57 40 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/1070/task/1070/mountinfo 66 39 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 68 67 0:3 / /mnt/1/a rw,nosuid,nodev,noexec,relatime unbindable - proc proc rw
これらの/mnt/1/a
、/run/netns/a
は名前空間ファイルである可能性があります。
Iノード番号を取得できます。
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
しかし、それは、上記で計算されたリストにないこと以外は、私たちに多くを伝えません。
さまざまなタイプとして入力してみることができます。
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --pid=/mnt/1/a true
nsenter: reassociate to namespace 'ns/pid' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --mount=/mnt/1/a true
nsenter: reassociate to namespace 'ns/mnt' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --net=/mnt/1/a true
#
OK、それはnet
名前空間ファイルでした。
したがって、名前空間を一覧表示する方法があるように思われます。すべてのタスクのns
ディレクトリを一覧表示し、すべての/proc/*/task/*/mountinfo
ですべてのproc
マウントポイントを見つけて、把握します。それらを入力しようとすることによってそれらのタイプ。
util-linux v2.28以降を使用している場合は、lsns:
# lsns
NS TYPE NPROCS PID USER COMMAND
4026531836 pid 78 1 root /sbin/init
4026531837 user 79 1 root /sbin/init
4026531838 uts 78 1 root /sbin/init
4026531839 ipc 78 1 root /sbin/init
4026531840 mnt 75 1 root /sbin/init
4026531857 mnt 1 12 root kdevtmpfs
4026531957 net 79 1 root /sbin/init
4026532393 mnt 1 1214 root /lib/systemd/systemd-udevd
4026532415 mnt 1 2930 systemd-timesync /lib/systemd/systemd-timesyncd
4026532477 mnt 1 32596 root -bash
4026532478 uts 1 32596 root -bash
4026532479 ipc 1 32596 root -bash
4026532480 pid 1 32596 root -bash
訂正:lsnsはutil-linux v2.27では使用できませんでした。 https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes を参照してください
$ ip netns identify $PID
どこ $PID
はプロセスIDです。プロセスのさまざまな方法で取得できます。
ps
に、プロセスに関連付けられたさまざまなタイプの名前空間の出力オプションが追加されました:ipcns
、mntns
、netns
、pidns
、userns
、およびutsns
。この質問の場合、関連するのはPID名前空間、またはpidns
です。
たとえば、pid 459などのPID名前空間IDを確認したい場合は、次のようにします。
# ps -h -o pidns -p 459
4026532661
そして、その名前空間のすべてのプロセスを一覧表示します。
ps -o pidns,pid,cmd | awk '$1==4026532661'
またはpgrep
を使用すると、PIDから同じPID名前空間を共有するすべてのプロセスのリストに直接移動できます。
pgrep -a --ns 459
ps
とは異なり、pgrep
は出力を特定の名前空間に制限できます(その中の1つのプロセスのPIDがわかっている場合)。ただし、出力フォーマット機能は非常に制限されています(PIDのみ、またはPIDとそのコマンドライン)
pgrep --ns 459
の出力をいつでもxargs ps -f
にパイプして、プロセスについて必要な情報を取得できます。
listns.pyを使用できます
使用法: ./listns.py
またはpython2 listns.py
この質問に正確に答えるには、次のように結果をgrepしますpython2 listns.py | grep $PID
(pid変数を置き換えます)
出典: github-mirror および articleすべてのクレジット Ralf Trezeciak
ネットワーク名前空間の場合、ip netns identify $PID
に使える。
プロセスのpid名前空間を返すpidnslist
を提供します
$ pidnslist -ss 8782
pid:[4026531836]