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?
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.
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
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
Pour l'espace de noms de réseau, ip netns identify $PID
peut être utilisé.
Fournir pidnslist
qui renvoie l'espace de noms PID d'un processus
$ pidnslist -ss 8782
pid:[4026531836]