Ich werde versuchen, diese und Ihre frühere Frage zu beantworten, da sie zusammenhängen.
Die Türen zu Namensräumen sind Dateien in /proc/*/ns/*
und /proc/*/task/*/ns/*
.
Ein Namespace wird durch einen Prozess unsharing erstellt seinen Namensraum. Ein Namespace kann dann durch bind-mounten dauerhaft gemacht werden die ns
Datei an einen anderen Ort.
Das ist ip netns
tut zum Beispiel für net Namensräume. Es hebt die Freigabe seines net
auf Namespace und Bind-Mounts /proc/self/ns/net
bis /run/netns/netns-name
.
In einem /proc
im Root-PID-Namensraum gemountet ist, können Sie alle Namensräume auflisten, die einen Prozess enthalten, indem Sie Folgendes tun:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Die Zahl in eckigen Klammern ist die Inode-Nummer.
So erhalten Sie das für einen bestimmten Prozess:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Jetzt kann es permanent geben Namespaces, die keinen Prozess enthalten. Sie herauszufinden, kann viel schwieriger sein, AFAICT.
Zunächst muss man bedenken, dass es mehrere mount geben kann Namensräume.
# 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
Diese /mnt/1/a
, /run/netns/a
können Namespace-Dateien sein.
Wir können eine Inode-Nummer erhalten:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Aber das sagt uns nicht viel mehr, als dass es nicht in der oben berechneten Liste enthalten ist.
Wir können versuchen, es als einen der verschiedenen Typen einzugeben:
# 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, das war ein net
Namespace-Datei.
Es scheint also, als hätten wir eine Methode, um die Namensräume aufzulisten:Listen Sie den ns
auf Verzeichnisse aller Aufgaben, dann finden Sie alle proc
Einhängepunkte in allen /proc/*/task/*/mountinfo
und finden Sie ihren Typ heraus, indem Sie versuchen, sie einzugeben.
Wenn Sie util-linux v2.28 oder höher haben Sie können lsns verwenden :
# 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
Korrektur:lsns ist in util-linux v2.27 nicht verfügbar, wie diese Antwort früher sagte. Siehe https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
ps
hat jetzt Ausgabeoptionen für die verschiedenen Namensraumtypen, die mit Prozessen verbunden sind:ipcns
, mntns
, netns
, pidns
, userns
, und utsns
. Für diese Frage ist der relevante PID-Namensraum oder pidns
.
Wenn Sie also die PID-Namespace-ID für z. B. PID 459 herausfinden möchten:
# ps -h -o pidns -p 459
4026532661
und um alle Prozesse in diesem Namensraum aufzulisten:
ps -o pidns,pid,cmd | awk '$1==4026532661'
oder mit pgrep
, können Sie direkt von einer PID zu einer Liste aller Prozesse gehen, die denselben PID-Namensraum teilen:
pgrep -a --ns 459
Im Gegensatz zu ps
, pgrep
kann die Ausgabe auf einen bestimmten Namensraum beschränken (wenn Sie die PID eines der darin enthaltenen Prozesse kennen), hat aber sehr begrenzte Möglichkeiten zur Ausgabeformatierung (nur PIDs oder PIDs und ihre Befehlszeilen)
Sie können die Ausgabe von pgrep --ns 459
immer weiterleiten bis xargs ps -f
jedoch, um die Informationen abzurufen, die Sie über den Prozess benötigen.