Tentarei responder a essa e à sua pergunta anterior , pois elas estão relacionadas.
As portas para namespaces são arquivos em /proc/*/ns/*
e /proc/*/task/*/ns/*
.
Um namespace é criado por um processo unsharing no seu namespace. Um namespace pode ser tornado permanente por bind-mounting o arquivo ns
em algum outro lugar.
Isso é o que o ip netns
faz, por exemplo, para namespaces net . Desassocia seu namespace net
e bind-mounts /proc/self/ns/net
para /run/netns/netns-name
.
Em um /proc
montado no namespace pid raiz, você pode listar todos os namespaces que têm um processo neles:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
O número entre colchetes é o número do inode.
Para conseguir isso em um determinado processo:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Agora, pode haver namespaces permanentes que não tenham nenhum processo neles. Descobri-los pode ser muito complicado AFAICT.
Primeiro, você deve ter em mente que pode haver vários namespaces 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
Esses /mnt/1/a
, /run/netns/a
podem ser arquivos de namespace.
Podemos obter um número de inode:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Mas isso não nos diz muito além de não estar na lista acima.
Podemos tentar inseri-lo como qualquer um dos 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, esse era um arquivo de namespace net
.
Assim, parece que temos um método para listar os namespaces: liste os diretórios ns
de todas as tarefas, encontre todos os proc
mountpoints em todo o /proc/*/task/*/mountinfo
e descubra o tipo deles tentando entre nelas.