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
à /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 :listez 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.
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 le disait cette réponse. Voir https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
ps
a maintenant des options de sortie pour les différents types d'espaces de noms associés aux processus :ipcns
, mntns
, netns
, pidns
, userns
, et utsns
. Pour cette question, le pertinent est l'espace de noms PID, ou pidns
.
donc si vous vouliez connaître l'identifiant de l'espace de noms PID pour, par exemple, le pid 459 :
# ps -h -o pidns -p 459
4026532661
et pour lister tous les processus dans cet espace de noms :
ps -o pidns,pid,cmd | awk '$1==4026532661'
ou avec pgrep
, vous pouvez passer directement d'un PID à une liste de tous les processus partageant le même espace de noms PID :
pgrep -a --ns 459
Contrairement à ps
, pgrep
peut limiter la sortie à un espace de noms spécifique (si vous connaissez le PID de l'un des processus qu'il contient), mais a des capacités de formatage de sortie très limitées (PID uniquement, ou PID et leurs lignes de commande)
Vous pouvez toujours rediriger la sortie de pgrep --ns 459
à xargs ps -f
cependant pour récupérer les informations dont vous avez besoin sur le processus.