J'ai déjà posé une question sur la façon de lister tous les espaces de noms sous Linux, mais il n'y avait pas de réponses correctes et exactes, donc je veux trouver une méthode qui peut m'aider à trouver l'espace de noms de PID d'un processus ou d'un groupe de processus. Comment cela peut-il être fait sous Linux ?
Réponse acceptée :
Je vais essayer de répondre à cette question et à votre question précédente, car elles sont liées.
Les portes des espaces de noms sont des fichiers dans /proc/*/ns/*
et /proc/*/task/*/ns/*
.
Un espace de noms est créé par un processus unsharing son espace de noms. Un espace de noms peut ensuite être rendu permanent par bind-mounting le ns
fichier à un autre endroit.
C'est ce que ip netns
fait par exemple pour net espaces de noms. Il annule le partage de son net
espace de noms et montages liés /proc/self/ns/net
vers /run/netns/netns-name
.
Dans un /proc
monté dans l'espace de noms root pid, vous pouvez lister tous les espaces de noms contenant un processus en 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 entre 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 contiennent aucun processus. Les découvrir peut être beaucoup plus délicat AFAICT.
Tout d'abord, vous devez garder à l'esprit qu'il peut y avoir plusieurs montages 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
Ces /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 grand-chose d'autre que ce n'est pas dans la liste calculée ci-dessus.
Nous pouvons essayer de le saisir sous l'un des différents types :
# 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 net
fichier d'espace de noms.
Il semblerait donc que nous ayons une méthode pour lister les espaces de noms :lister les ns
répertoires de toutes les tâches, puis trouver tous les proc
points de montage dans tous les /proc/*/task/*/mountinfo
et déterminez leur type en essayant de les saisir.