Ho già posto una domanda su come elencare tutti gli spazi dei nomi in Linux, ma non c'erano risposte corrette ed esatte, quindi voglio scoprire un metodo che può aiutarmi a scoprire lo spazio dei nomi del PID di alcuni processi o gruppi di processi. Come si può fare in Linux?
Risposta accettata:
Proverò a rispondere sia a questa che alla tua precedente domanda poiché sono correlate.
Le porte degli spazi dei nomi sono file in /proc/*/ns/*
e /proc/*/task/*/ns/*
.
Uno spazio dei nomi viene creato da un processo di annullamento della condivisione il suo spazio dei nomi. Uno spazio dei nomi può quindi essere reso permanente mediante montaggio vincolato il ns
file in un altro posto.
Ecco cosa ip netns
fa ad esempio per net spazi dei nomi. Annulla la condivisione della sua net
namespace e bind-mount /proc/self/ns/net
a /run/netns/netns-name
.
In un /proc
montato nello spazio dei nomi pid radice, 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 dell'inode.
Per ottenerlo per un determinato processo:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Ora, potrebbero esserci permanenti namespace che non contengono alcun processo. Scoprirli può essere molto più complicato AFAICT.
Innanzitutto, devi tenere a mente che possono esserci diversi monte 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
potrebbero 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:list the ns
directory di tutte le attività, quindi trova tutti i proc
mountpoint in tutti i /proc/*/task/*/mountinfo
e scopri il loro tipo provando a inserirli.