Créer un espace de noms PID
La commande correcte à utiliser ici est unshare
. Notez que les options nécessaires pour ce faire ne sont disponibles qu'à partir de util-linux 2.23
. L'idée est de créer un nouvel espace de noms PID pour le programme que vous exécutez de telle sorte que tous ses enfants soient également créés dans cet espace de noms. Vous pouvez exécuter une commande dans un nouvel espace de noms PID simplement en faisant:
sudo unshare -fp some_command
Pour exécuter un shell, omettez simplement la commande. Cela créera un processus qui, avec n'importe lequel de ses enfants, aura un PID comme d'habitude dans l'espace de noms parent (système). Cependant, dans le nouvel espace de noms, il aura un PID 1
ainsi que certaines des caractéristiques spéciales du init
processus. La caractéristique la plus pertinente du point de vue de la surveillance est peut-être que si l'un de ses descendants est orphelin, il sera re-parenté à ce processus plutôt qu'au init
processus réel .
Faire cela peut être suffisant pour la plupart des cas de surveillance. Comme mentionné précédemment, les processus dans l'espace de noms ont tous des PID dans l'espace de noms parent, de sorte que des commandes régulières peuvent être utilisées pour surveiller leur activité. Nous sommes également assurés que si un processus de l'espace de noms devient orphelin, il ne tombera pas des branches de l'arbre de processus sous le PID du programme de niveau supérieur, ce qui signifie qu'il peut toujours être facilement suivi.
Combiner avec un espace de noms de montage
Cependant, ce que nous ne pouvons pas faire, c'est surveiller le processus en ce qui concerne le PID qu'il pense avoir. Pour ce faire, et en particulier pour pouvoir utiliser la ps
commande dans le nouvel espace de noms, vous devez monter un procfs
système de fichiers distinct pour l'espace de noms. Cela entraîne à son tour un autre problème car le seul emplacement qui ps
accepte procfs
est /proc
. Une solution serait de créer une chroot
prison et d'y monter la nouvelle procfs
. Mais c'est une approche lourde car au minimum nous aurions besoin de copier (ou du moins de lier dur) tous les binaires que nous avons l'intention d'utiliser avec toutes les bibliothèques dont ils dépendent vers la nouvelle racine.
La solution consiste à utiliser également un nouvel espace de noms de montage . Dans ce cadre, nous pouvons monter le nouveau procfs
d'une manière qui utilise le vrai /proc
répertoire racine , peut être utilisable dans l'espace de noms PID et n'interfère avec rien d'autre. Pour rendre ce processus très simple, la unshare
commande donne l' --mount-proc
option:
sudo unshare -fp --mount-proc some_command
Désormais, l'exécution ps
dans les espaces de noms combinés n'affichera que les processus avec l'espace de noms PID et le processus de niveau supérieur aura un PID de 1
.
Et alors nsenter
?
Comme son nom l'indique, nsenter
peut être utilisé pour entrer un espace de noms qui a déjà été créé avec unshare
. Ceci est utile si nous voulons obtenir des informations uniquement disponibles à l'intérieur de l'espace de noms à partir d'un script autrement indépendant. Le moyen le plus simple est d'accéder au PID de tout programme exécuté dans l'espace de noms. Pour être clair, il doit s'agir du PID du programme cible dans l'espace de noms à partir duquel il nsenter
est exécuté (étant donné que les espaces de noms peuvent être imbriqués, il est possible qu'un seul processus ait plusieurs PID). Pour exécuter un shell dans l'espace de noms PID / mount cible, faites simplement:
sudo nsenter -t $PID -m -p
Si cet espace de noms est configuré comme ci-dessus, ps
répertorie désormais uniquement les processus au sein de cet espace de noms.