como descobrir o namespace de um processo específico?

20

Eu já fiz uma pergunta sobre como listar todos os namespaces no Linux , mas não havia nenhum correto e respostas exatas, então eu quero descobrir um método que possa me ajudar a descobrir o namespace do PID de algum processo ou grupo de processos. Como isso pode ser feito no Linux?

    
por zerospiel 04.02.2014 / 19:10

4 respostas

28

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.

    
por 04.02.2014 / 22:57
14

Se você tiver o util-linux v2.28 ou superior , poderá 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

Correção: lsns não está disponível no util-linux v2.27 como esta resposta costumava dizer. Consulte o link

    
por 29.08.2016 / 12:56
6
$ ip netns identify $PID

em que $PID é o processo I.D. do processo, que você pode obter de várias maneiras.

link

    
por 28.07.2015 / 20:23
4

ps agora tem opções de saída para os diferentes tipos de namespaces associados aos processos: ipcns , mntns , netns , pidns , userns e utsns . Para essa questão, o relevante é o namespace PID ou pidns .

então, se você quiser descobrir o ID do namespace do PID para, por exemplo, pid 459:

# ps -h -o pidns -p 459
4026532661

e para listar todos os processos nesse namespace:

ps -o pidns,pid,cmd | awk '$1==4026532661'

ou com pgrep , você pode ir diretamente de um PID para uma lista de todos os processos que compartilham o mesmo namespace PID:

pgrep -a --ns 459

Ao contrário de ps , pgrep pode limitar a saída a um namespace específico (se você conhece o PID de um dos processos), mas possui recursos de formatação de saída muito limitados (somente PIDs ou PIDs e seu comando linhas)

    
por 28.07.2017 / 17:38