come scoprire lo spazio dei nomi di un particolare processo?


Risposte:


39

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 nsfile in un'altra posizione.

Questo è ciò che ip netnsfa ad esempio per gli spazi dei nomi di rete . Annulla la condivisione del suo netspazio dei nomi e si collega /proc/self/ns/neta ./run/netns/netns-name

In uno /procspazio 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 nsdirectory di tutte le attività, quindi trovare tutti i procmountpoint in tutti /proc/*/task/*/mountinfoe capire il loro tipo cercando di inserirli.


19

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. Vedi https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


C'è anche un bel script Python che ho trovato, per quelli su Linux più vecchi. opencloudblog.com/?p=251
Neil McGill

lsnsè molto utile ma mostra solo il PID più basso in ogni spazio dei nomi, ovvero non può dirti lo spazio dei nomi per nessun PID arbitrario. +1 comunque perché questa è ancora una risposta utile anche se non risponde direttamente alla domanda.
Cas

9
$ ip netns identify $PID

dove si $PIDtrova l'ID del processo, che è possibile ottenere in vari modi.

http://man7.org/linux/man-pages/man8/ip-netns.8.html


1
Nota che è solo per gli spazi dei nomi di rete e solo quelli creati usando ip netns(o almeno creati da qualcosa che collega le porte dello spazio dei nomi in / run / netns come ip netnsfa). Praticamente cerca in / run / netns i file uguali a /proc/$PID/ns/net.
Stéphane Chazelas,

Che cosa? /run/netnsnon esiste nemmeno sul mio computer.
Ken Sharp,

/run/netnso ovunque ipbind monta i file speciali dello spazio dei nomi. findmnt -t nsfspotrebbe dirti dove si trova sul tuo sistema. OTOH, se lo fai unshare -n sleep 1000 & ip netns identify "$!", non otterrai nulla.
Stéphane Chazelas,

findmnt -t nsfs- Niente. unshare -n sleep 1000 & ip netns identify "$!"- unshare: unshare non riuscita: operazione non consentita
Ken Sharp

È necessario disporre dei privilegi di superutente (capacità CAP_SYS_ADMIN) per creare un nuovo netns. findmnt -t nsfsla restituzione di nulla suggerisce che non hai netns sul bancomat della tua macchina.
Stéphane Chazelas il

9

psora ha opzioni di output per i diversi tipi di spazi di nomi associati ai processi: ipcns, mntns, netns, pidns, userns, e utsns. Per questa domanda, quello rilevante è lo spazio dei nomi PID, opidns .

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 ps,pgrep può limitare l'output a uno spazio dei nomi specifico (se si conosce il PID di uno dei processi in esso), ma ha capacità di formattazione dell'output molto limitate (solo PID o PID e le relative righe di comando)

È sempre possibile reindirizzare l'output di pgrep --ns 459to xargs ps -fper recuperare le informazioni necessarie sul processo.


0

Namespace-Lister :

Puoi usare listns.py

Utilizzo: ./listns.pyo python2 listns.pyPer rispondere precisamente a questa domanda, è possibile visualizzare il risultato in questo modo python2 listns.py | grep $PID(sostituire la variabile pid)

Fonte: github-mirror e articolo tutto merito a Ralf Trezeciak

Spazi dei nomi di rete :

Per lo spazio dei nomi di rete, ip netns identify $PIDpuò essere utilizzato.

Nsutils

Fornire pidnslistche restituisce lo spazio dei nomi pid di un processo

$ pidnslist -ss 8782
pid:[4026531836] 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.