Trataré de responder tanto a esta como a su pregunta anterior, ya que están relacionadas.
Las puertas a los espacios de nombres son archivos en /proc/*/ns/*
y /proc/*/task/*/ns/*
.
Un espacio de nombres es creado por un proceso que comparte su espacio de nombres. Un espacio de nombres se puede hacer permanente mediante el montaje del ns
archivo en otro lugar.
Eso es lo que ip netns
hace, por ejemplo, para los espacios de nombres netos . Se unshares su net
espacio de nombres y bind-montajes /proc/self/ns/net
a ./run/netns/netns-name
En un /proc
espacio de nombres montado pid en la raíz, puede enumerar todos los espacios de nombres que tienen un proceso en ellos haciendo:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
El número entre corchetes es el número de inodo.
Para obtener eso para un proceso dado:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Ahora, puede haber espacios de nombres permanentes que no tienen ningún proceso en ellos. Descubrirlos puede ser mucho más difícil.
Primero, debe tener en cuenta que puede haber varios espacios de nombres de montaje .
# 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
Esos /mnt/1/a
, /run/netns/a
pueden ser archivos de espacio de nombres.
Podemos obtener un número de inodo:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Pero eso no nos dice mucho más que no está en la lista calculada anteriormente.
Podemos intentar ingresarlo como cualquiera de los diferentes tipos:
# 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, ese era un net
archivo de espacio de nombres.
Por lo tanto, parece que tenemos un método para enumerar los espacios de nombres: enumere los ns
directorios de todas las tareas, luego encuentre todos los proc
puntos de montaje en todos /proc/*/task/*/mountinfo
y descubra su tipo al intentar ingresarlos.
lsns
es muy útil pero solo muestra el PID más bajo en cada espacio de nombres, es decir, no puede decirle el espacio de nombres para cualquier PID arbitrario. +1 de todos modos porque esta sigue siendo una respuesta útil, incluso si no responde directamente a la pregunta.donde
$PID
está el ID del proceso, que puede obtener de varias maneras.http://man7.org/linux/man-pages/man8/ip-netns.8.html
fuente
ip netns
(o al menos creados por algo que une y monta las puertas del espacio de nombres en / run / netns como loip netns
hace). Básicamente busca en / run / netns archivos que sean iguales a/proc/$PID/ns/net
./run/netns
Ni siquiera existe en mi computadora./run/netns
o donde sea que seip
unan los archivos especiales del espacio de nombres.findmnt -t nsfs
puede decirle dónde está en su sistema. OTOH, si lo hacesunshare -n sleep 1000 & ip netns identify "$!"
, no obtendrás nada.findmnt -t nsfs
- nada.unshare -n sleep 1000 & ip netns identify "$!"
- unshare: unshare falló: Operación no permitidafindmnt -t nsfs
no devolver nada sugiere que no tiene ninguna red en el cajero automático de su máquina.ps
ahora tiene opciones de salida para los diferentes tipos de espacios de nombres asociados a los procesos:ipcns
,mntns
,netns
,pidns
,userns
, yutsns
. Para esta pregunta, el relevante es el espacio de nombres PID, opidns
.así que si desea encontrar la identificación del espacio de nombres PID para, por ejemplo, pid 459:
y para enumerar todos los procesos en ese espacio de nombres:
o con
pgrep
, puede pasar directamente de un PID a una lista de todos los procesos que comparten el mismo espacio de nombres PID:A diferencia
ps
,pgrep
puede limitar la salida a un espacio de nombres específico (si conoce el PID de uno de los procesos en él), pero tiene capacidades de formateo de salida muy limitadas (solo PID o PID y sus líneas de comando)Sin embargo, siempre puede canalizar la salida de
pgrep --ns 459
toxargs ps -f
para recuperar la información que necesita sobre el proceso.fuente
Espacio de nombres-Lister :
Puedes usar listns.py
Uso:
./listns.py
opython2 listns.py
Para responder con precisión a esta pregunta, puede seleccionar el resultado de esta manerapython2 listns.py | grep $PID
(reemplace la variable pid)Fuente: github-mirror y artículo, todo crédito a Ralf Trezeciak
Espacios de nombres de red :
Para el espacio de nombres de red,
ip netns identify $PID
se puede utilizar.Nsutils
Proporcione
pidnslist
que devuelva el espacio de nombres pid de un procesofuente