web-dev-qa-db-fra.com

Comment trouver l'espace de noms d'un processus particulier?

J'ai déjà posé une question sur Comment répertorier tous les espaces de noms de Linux , mais il n'y avait aucune réponse correcte et exacte, alors je souhaite trouver une méthode qui peut m'aider à découvrir l'espace de nom de PID de certains processus ou groupe de processus. Comment peut-on être fait à Linux?

25
zerospiel

Je vais essayer de répondre à la fois ceci et votre question précédente car ils sont liés.

Les portes aux espaces de noms sont des fichiers de /proc/*/ns/* et /proc/*/task/*/ns/*.

Un espace de noms est créé par un processus insertion Son espace de noms. Un espace de noms peut alors être fait permanent par montage de liaison le fichier ns fichier à un autre endroit.

C'est ce que ip netns fait par exemple pour net Espaces de noms. Il désigne son net espaces de noms et des supports de liaison /proc/self/ns/net à /run/netns/netns-name.

Dans un /proc Monté dans l'espace de noms Root Pid, ​​vous pouvez répertorier tous les espaces de noms qui ont un processus en ce faisant:

# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]

Le nombre de crochets est le numéro d'inode.

Pour obtenir cela pour un processus donné:

# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid

Maintenant, il peut y avoir permanent Espaces de noms qui ne possèdent aucun processus. Les trouver peut être beaucoup plus délicieux.

Tout d'abord, vous devez garder à l'esprit qu'il peut y avoir plusieurs Montez Espaces de noms.

# 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

Celles /mnt/1/a, /run/netns/a Peut être des fichiers d'espace de noms.

Nous pouvons obtenir un numéro d'inode:

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a

Mais cela ne nous dit pas beaucoup d'autres que ce n'est pas dans la liste calculée ci-dessus.

Nous pouvons essayer de le saisir comme l'un des types différents:

# 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, c'était un fichier d'espace de noms net.

Il semblerait donc que nous ayons une méthode pour répertorier les espaces de noms: répertoriez les répertoires ns de toutes les tâches, puis trouvez tous les points de montage proc dans tous les points /proc/*/task/*/mountinfo et déterminer leur type en essayant de les entrer.

39
Stéphane Chazelas

Si vous avez Util-Linux v2.28 ou supérieur , vous pouvez utiliser 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

Correction: LSNS n'est pas disponible dans Util-Linux V2.27 comme cette réponse utilisée pour dire. Voir https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleAseNotes

19
Rfraile

NAMESPACE-LISTER :

Vous pouvez utiliser listns.py

Utilisation: ./listns.py ou python2 listns.py Pour répondre précisément de cette question, vous pouvez grep le résultat comme celui-ci python2 listns.py | grep $PID (remplacez la variable PID)

Source: github-miroir et article Tous les crédits à Ralf Trezeciak Englisons

espaces de noms de résea :

Pour l'espace de noms de réseau, ip netns identify $PID peut être utilisé.

Nsutils

Fournir pidnslist qui renvoie l'espace de noms PID d'un processus

$ pidnslist -ss 8782
pid:[4026531836] 
0
intika