Cercherò di rispondere a questa e alla tua domanda precedente in quanto sono correlate.
Le porte agli spazi dei nomi sono file in /proc/*/ns/*
e /proc/*/task/*/ns/*
.
Uno spazio dei nomi viene creato da un processo che non condivide il suo spazio dei nomi. Uno spazio dei nomi può quindi essere reso permanente montando il ns
file in un'altra posizione.
Questo è ciò che ip netns
fa ad esempio per gli spazi dei nomi di rete . Annulla la condivisione del suo net
spazio dei nomi e si collega /proc/self/ns/net
a ./run/netns/netns-name
In uno /proc
spazio dei nomi pid montato, è possibile elencare tutti gli spazi dei nomi che hanno un processo in essi eseguendo:
# 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 dell'inode.
Per ottenerlo per un determinato processo:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Ora, potrebbe esserci un permanente spazi nomi che non hanno alcun processo in essi. Scoprirli può essere AFAICT molto più complicato.
Innanzitutto, devi tenere presente che possono esserci diversi spazi dei nomi mount .
# 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 altro che non è nell'elenco calcolato sopra.
Possiamo provare a inserirlo come uno 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: elencare le ns
directory di tutte le attività, quindi trovare tutti i proc
mountpoint in tutti /proc/*/task/*/mountinfo
e capire il loro tipo cercando di inserirli.