Tentarei responder a essa e à sua pergunta anterior , pois estão relacionadas.
As portas dos namespaces são arquivos em /proc/*/ns/*
e /proc/*/task/*/ns/*
.
Um espaço para nome é criado por um processo que compartilha seu espaço para nome. Um espaço para nome pode ser tornado permanente montando o ns
arquivo em outro local.
É o que ip netns
ocorre, por exemplo, nos namespaces da rede . Ele unshares seu net
namespace e bind-montagens /proc/self/ns/net
para ./run/netns/netns-name
Em um /proc
espaço para nome montado pid raiz, você pode listar todos os espaços para nome que possuem um processo, fazendo:
# 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 obter isso para um determinado processo:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Agora, pode haver namespaces permanentes que não possuem nenhum processo. Encontrá-los pode ser um AFAICT muito mais complicado.
Primeiro, você deve ter em mente que pode haver vários namespaces de montagem .
# 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
Aqueles /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 mais do que não está na lista computada 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 net
arquivo de espaço para nome.
Portanto, parece que temos um método para listar os espaços de nomes: liste os ns
diretórios de todas as tarefas, encontre todos os proc
pontos de montagem em todos os /proc/*/task/*/mountinfo
e descubra seu tipo tentando inseri-los.
lsns
é muito útil, mas mostra apenas o PID mais baixo em cada espaço para nome - ou seja, não pode indicar o espaço para qualquer PID arbitrário. +1 de qualquer maneira, porque ainda é uma resposta útil, mesmo que não responda diretamente à pergunta.onde
$PID
está o ID do processo, que você pode obter de várias maneiras.http://man7.org/linux/man-pages/man8/ip-netns.8.html
fonte
ip netns
(ou pelo menos criados por algo que monta as portas do namespace em / run / netns, comoip netns
faz). Basicamente, procura em / run / netns arquivos que são iguais a/proc/$PID/ns/net
./run/netns
nem existe no meu computador./run/netns
ou onde quer que oip
bind-monta os arquivos especiais do espaço para nome.findmnt -t nsfs
pode dizer onde está no seu sistema. OTOH, se você fizerunshare -n sleep 1000 & ip netns identify "$!"
, você não receberá nada.findmnt -t nsfs
- nada.unshare -n sleep 1000 & ip netns identify "$!"
- unshare: unshare falhou: Operação não permitidafindmnt -t nsfs
devolver nada sugere que você não possui redes no caixa eletrônico da máquina.ps
agora tem opções de saída para os diferentes tipos de namespaces associados a processos:ipcns
,mntns
,netns
,pidns
,userns
, eutsns
. Para esta pergunta, a relevante é o espaço para nome PID, oupidns
.portanto, se você deseja descobrir o ID do namespace do PID, por exemplo, pid 459:
e para listar todos os processos nesse espaço para nome:
ou com
pgrep
, você pode ir diretamente de um PID para uma lista de todos os processos que compartilham o mesmo espaço de nome do PID:Ao contrário
ps
,pgrep
pode limitar a saída a um espaço de nome específico (se você conhece o PID de um dos processos nele), mas possui recursos de formatação de saída muito limitados (apenas PIDs ou PIDs e suas linhas de comando)Você sempre pode canalizar a saída de
pgrep --ns 459
paraxargs ps -f
para recuperar as informações necessárias sobre o processo.fonte
Namespace-Lister :
Você pode usar listns.py
Uso:
./listns.py
oupython2 listns.py
Para responder exatamente a essa pergunta, você pode receber o resultado dessa formapython2 listns.py | grep $PID
(substituir a variável pid)Fonte: github-mirror e artigo - todos os créditos a Ralf Trezeciak
Namespaces de rede :
Para o namespace da rede,
ip netns identify $PID
pode ser usado.Nsutils
Forneça
pidnslist
que retorne o namespace pid de um processofonte