Intentaré 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 dejar de compartir su espacio de nombres. Luego, un espacio de nombres se puede hacer permanente mediante bind-mounting el ns
archivo a algún otro lugar.
Eso es lo que ip netns
hace por ejemplo para net espacios de nombres Deja de compartir su net
espacio de nombres y montajes de enlace /proc/self/ns/net
a /run/netns/netns-name
.
En un /proc
montado en el espacio de nombres del pid raíz, puede enumerar todos los espacios de nombres que tienen un proceso haciendo lo siguiente:
# 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 permanente espacios de nombres que no tienen ningún proceso en ellos. Descubrirlos puede ser mucho más complicado AFAICT.
En primer lugar, hay que tener en cuenta que puede haber varios montaje espacios de nombres.
# 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 arriba.
Podemos intentar introducirlo 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
#
Bien, eso fue un net
archivo de espacio de nombres.
Así que parecería que tenemos un método para listar los espacios de nombres:list the ns
directorios de todas las tareas, luego busque todos los proc
puntos de montaje en todos los /proc/*/task/*/mountinfo
y descubra su tipo tratando de ingresarlos.
Si tiene util-linux v2.28 o superior puedes usar 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
Corrección:lsns no está disponible en util-linux v2.27 como solía decir esta respuesta. Consulte https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
ps
ahora tiene opciones de salida para los diferentes tipos de espacios de nombres asociados con los procesos:ipcns
, mntns
, netns
, pidns
, userns
y utsns
. Para esta pregunta, la relevante es el espacio de nombres PID, o pidns
.
por lo tanto, si desea averiguar la identificación del espacio de nombres PID para, por ejemplo, pid 459:
# ps -h -o pidns -p 459
4026532661
y para listar todos los procesos en ese espacio de nombres:
ps -o pidns,pid,cmd | awk '$1==4026532661'
o con pgrep
, puede pasar directamente de un PID a una lista de todos los procesos que comparten el mismo espacio de nombres de PID:
pgrep -a --ns 459
A diferencia de ps
, pgrep
puede limitar la salida a un espacio de nombres específico (si conoce el PID de uno de los procesos que contiene), pero tiene capacidades de formato de salida muy limitadas (solo PID o PID y sus líneas de comando)
Siempre puede canalizar la salida de pgrep --ns 459
a xargs ps -f
aunque para recuperar la información que necesita sobre el proceso.