Proverò a rispondere sia a questa che alla tua precedente domanda poiché sono correlate.
Le porte ai namespace sono file in /proc/*/ns/*
e /proc/*/task/*/ns/*
.
Uno spazio dei nomi viene creato da un processo unsharing il suo spazio dei nomi. Uno spazio dei nomi può quindi essere reso permanente mediante il montaggio del collegamento il ns
file in un altro posto.
Questo è ciò che ip netns
fa ad esempio per net spazi dei nomi. Annulla la condivisione del suo net
namespace e bind-mount /proc/self/ns/net
a /run/netns/netns-name
.
In un /proc
montato nello spazio dei nomi root pid, puoi elencare tutti gli spazi dei nomi che contengono un processo facendo:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Il numero tra parentesi quadre è il numero di inode.
Per ottenerlo per un dato processo:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Ora, potrebbero esserci permanenti spazi dei nomi che non contengono alcun processo. Trovarli può essere molto più complicato AFAICT.
Innanzitutto, devi tenere presente che possono esserci diversi mount spazi dei nomi.
# 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
Quelli /mnt/1/a
, /run/netns/a
possono essere file dello spazio dei nomi.
Possiamo ottenere un numero di inode:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Ma questo non ci dice molto, a parte il fatto che non è nell'elenco calcolato sopra.
Possiamo provare a inserirlo come uno qualsiasi dei diversi tipi:
# 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, quello era un net
file dello spazio dei nomi.
Quindi sembrerebbe che abbiamo un metodo per elencare gli spazi dei nomi:elenca il ns
directory di tutte le attività, quindi trova tutte le proc
punti di montaggio in tutti i /proc/*/task/*/mountinfo
e scopri il loro tipo provando a inserirli.
Se hai util-linux v2.28 o superiore puoi usare 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
Correzione:lsns non è disponibile in util-linux v2.27 come diceva questa risposta. Vedere https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
ps
ora ha opzioni di output per i diversi tipi di namespace associati ai processi:ipcns
, mntns
, netns
, pidns
, userns
e utsns
. Per questa domanda, quello rilevante è lo spazio dei nomi PID, o pidns
.
quindi se vuoi scoprire l'ID dello spazio dei nomi PID per, ad esempio, pid 459:
# ps -h -o pidns -p 459
4026532661
e per elencare tutti i processi in quello spazio dei nomi:
ps -o pidns,pid,cmd | awk '$1==4026532661'
o con pgrep
, puoi passare direttamente da un PID a un elenco di tutti i processi che condividono lo stesso spazio dei nomi PID:
pgrep -a --ns 459
A differenza di ps
, pgrep
può limitare l'output a uno spazio dei nomi specifico (se conosci il PID di uno dei processi in esso contenuti), ma ha capacità di formattazione dell'output molto limitate (solo PID o PID e relative righe di comando)
Puoi sempre reindirizzare l'output di pgrep --ns 459
a xargs ps -f
tuttavia per recuperare le informazioni necessarie sul processo.