Je vais essayer de répondre à la fois à 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 qui partage son espace de noms. Un espace de noms peut alors être rendu permanent en liant le ns
fichier à un autre endroit.
C'est ce que ip netns
fait par exemple pour les espaces de noms nets . Il ne partage pas son net
espace de noms et lie-monte /proc/self/ns/net
à ./run/netns/netns-name
Dans un /proc
espace de noms pid monté, vous pouvez répertorier tous les espaces de noms contenant un processus en procédant comme suit:
# 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 des espaces de noms permanents 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 espaces de noms de montage .
# 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
Ceux /mnt/1/a
-ci /run/netns/a
peuvent ê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 comme 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 répertorier les espaces de noms: répertorier 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éterminer leur type en essayant de les saisir.
lsns
est très utile mais il ne montre que le PID le plus bas dans chaque espace de noms - c'est-à-dire qu'il ne peut pas vous dire l'espace de noms pour tout PID arbitraire. +1 de toute façon, car c'est toujours une réponse utile même si elle ne répond pas directement à la question.où
$PID
est l'ID de processus du processus, que vous pouvez obtenir de différentes manières.http://man7.org/linux/man-pages/man8/ip-netns.8.html
la source
ip netns
(ou au moins créés par quelque chose qui lie les portes des espaces de noms dans / run / netns comme leip netns
fait). Il recherche essentiellement dans / run / netns des fichiers identiques à/proc/$PID/ns/net
./run/netns
n'existe même pas sur mon ordinateur./run/netns
ou partout oùip
bind-monte les fichiers spéciaux d'espace de noms.findmnt -t nsfs
peut vous dire où il se trouve sur votre système. OTOH, si vous le faitesunshare -n sleep 1000 & ip netns identify "$!"
, vous n'obtiendrez rien.findmnt -t nsfs
- rien.unshare -n sleep 1000 & ip netns identify "$!"
- unshare: unshare a échoué: opération non autoriséefindmnt -t nsfs
le fait de ne rien renvoyer suggère que vous n'avez pas de réseau sur l'ATM de votre machine.ps
a maintenant des options de sortie pour les différents types de namespaces associés aux processus:ipcns
,mntns
,netns
,pidns
,userns
etutsns
. Pour cette question, le plus pertinent est l'espace de noms PID, oupidns
.donc si vous vouliez trouver l'identifiant de l'espace de noms PID pour, par exemple, le pid 459:
et pour répertorier tous les processus dans cet espace de noms:
ou avec
pgrep
, vous pouvez passer directement d'un PID à une liste de tous les processus partageant le même espace de noms PID: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 diriger la sortie de
pgrep --ns 459
versxargs ps -f
bien pour récupérer les informations dont vous avez besoin sur le processus.la source
Espace de noms-Lister :
Vous pouvez utiliser listns.py
Utilisation:
./listns.py
oupython2 listns.py
Pour répondre précisément à cette question, vous pouvez grep le résultat comme cecipython2 listns.py | grep $PID
(remplacez la variable pid)Source: github-mirror et article tout crédit à Ralf Trezeciak
Espaces de noms réseau :
Pour l'espace de noms réseau,
ip netns identify $PID
peut être utilisé.Nsutils
Indiquez
pidnslist
que renvoyer l'espace de noms pid d'un processusla source