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.