Ich habe bereits eine Frage zum Auflisten aller Namensräume in Linux gestellt, aber es gab keine richtigen und genauen Antworten. Daher möchte ich eine Methode finden, die mir helfen kann, den Namensraum der PID eines Prozesses oder einer Gruppe von Prozessen herauszufinden Prozesse. Wie kann das unter Linux gemacht werden?
Akzeptierte Antwort:
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 gibt sein net
frei Namespace und bind-mounts /proc/self/ns/net
nach /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 die ns
auf Verzeichnisse aller Tasks, dann finden Sie alle proc
Einhängepunkte in allen /proc/*/task/*/mountinfo
und finden Sie ihren Typ heraus, indem Sie versuchen, sie einzugeben.