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.
lsns
Dies ist sehr nützlich, zeigt jedoch nur die niedrigste PID in jedem Namespace an, dh, es kann nicht der Namespace für eine beliebige PID angegeben werden. +1 auf jeden Fall, weil dies immer noch eine nützliche Antwort ist, auch wenn es die Frage nicht direkt beantwortet.wo
$PID
ist die Prozess-ID des Prozesses, die Sie auf verschiedene Arten erhalten können.http://man7.org/linux/man-pages/man8/ip-netns.8.html
quelle
ip netns
(oder zumindest mit etwas erstellt wurden, das die Namespace-Türen in / run / netns bindmountetip netns
). Grundsätzlich wird in / run / netns nach Dateien gesucht, die mit identisch sind/proc/$PID/ns/net
./run/netns
existiert nicht einmal auf meinem Computer./run/netns
oder wo immerip
die Namespace-Sonderdateien gebunden werden.findmnt -t nsfs
kann Ihnen sagen, wo es auf Ihrem System ist. OTOH, wenn du das tustunshare -n sleep 1000 & ip netns identify "$!"
, bekommst du nichts.findmnt -t nsfs
- nichts.unshare -n sleep 1000 & ip netns identify "$!"
- Freigabe aufheben: Freigabe fehlgeschlagen: Operation nicht zulässigfindmnt -t nsfs
Wenn Sie nichts zurückgeben, bedeutet dies, dass Sie keine Netze auf Ihrem Geldautomaten haben.ps
Jetzt hat Ausgabeoptionen für die verschiedenen Arten von Namensräumen mit Prozessen verbunden:ipcns
,mntns
,netns
,pidns
,userns
, undutsns
. Bei dieser Frage handelt es sich um den PID-Namespace oderpidns
.Wenn Sie also die PID-Namespace-ID für z. B. pid 459 herausfinden möchten, gehen Sie wie folgt vor:
und um alle Prozesse in diesem Namespace aufzulisten:
oder mit
pgrep
können Sie direkt von einer PID zu einer Liste aller Prozesse wechseln, die denselben PID-Namespace verwenden:Im Gegensatz zu
ps
,pgrep
kann die Ausgabe auf einen bestimmten Namensraum begrenzen (wenn Sie die PID eines der Prozesse in sie kennen), sondern hat nur sehr begrenzte Ausgabeformatierungsfunktionen (PIDs nur oder PIDs und ihre Befehlszeilen)Sie können die Ausgabe immer
pgrep --ns 459
anxargs ps -f
weiterleiten, um die Informationen abzurufen, die Sie über den Prozess benötigen.quelle
Namespace-Lister :
Sie können listns.py verwenden
Verwendung:
./listns.py
oderpython2 listns.py
Um genau diese Frage zu beantworten, können Sie das Ergebnis wiepython2 listns.py | grep $PID
folgt anzeigen (ersetzen Sie die pid-Variable)Quelle: Github-Spiegel und Artikel alle Dank an Ralf Trezeciak
Netzwerk Namespaces :
ip netns identify $PID
Kann als Netzwerk-Namespace verwendet werden.Nsutils
Stellen Sie sicher,
pidnslist
dass der pid-Namespace eines Prozesses zurückgegeben wirdquelle