Ich werde versuchen, sowohl diese als auch Ihre frühere Frage zu beantworten, da sie miteinander zusammenhängen.
Die Türen zu Namespaces sind Dateien in /proc/*/ns/*
und /proc/*/task/*/ns/*
.
Ein Namespace wird von einem Prozess erstellt, der seinen Namespace freigibt . Ein Namensraum kann dann permanent gemacht werden , indem bind-Montag die ns
Datei an einem anderen Ort.
Das ip netns
gilt zum Beispiel für Net Namespaces. Es gibt seinen net
Namespace frei und bindet Mounts /proc/self/ns/net
an ./run/netns/netns-name
In einem /proc
im Root-PID bereitgestellten Namespace können Sie alle Namespaces auflisten, in denen sich ein Prozess befindet.
# 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
Möglicherweise gibt es permanente Namespaces, in denen sich kein Prozess befindet. Das herauszufinden, kann viel schwieriger sein.
Zunächst muss beachtet werden, dass es mehrere Mount- Namespaces geben kann.
# 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
Diejenigen /mnt/1/a
, /run/netns/a
können Namespace - Dateien sein.
Wir können eine Inode-Nummer bekommen:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Aber das sagt uns nicht viel anderes als es ist nicht in der oben berechneten Liste.
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 eine net
Namespace-Datei.
Es scheint also, als hätten wir eine Methode ns
, um die proc
Namensräume aufzulisten : Listen Sie die Verzeichnisse aller Tasks auf, suchen Sie dann alle Mountpunkte in allen /proc/*/task/*/mountinfo
und ermitteln Sie ihren Typ, indem Sie versuchen, sie einzugeben.