cgroup_namespaces(7) Miscellaneous Information Manual cgroup_namespaces(7)

cgroup_namespaces – Aperçu des espaces de noms cgroup de Linux

Pour une présentation générale des espaces de noms, consultez namespaces(7).

Les espaces de noms cgroup virtualisent la vue des cgroups de processus (consulter cgroups(7)) telle qu’aperçue à l’aide de /proc/pid/cgroup et /proc/pid/mountinfo.

Chaque espace de noms cgroup a son propre ensemble de répertoires racines de cgroup. Ces répertoires racines sont les points de base pour les emplacements relatifs affichés dans les enregistrements correspondants dans le fichier /proc/pid/cgroup. Quand un processus crée un nouvel espace de noms cgroup en utilisant clone(2) ou unshare(2) avec le drapeau CLONE_NEWCGROUP, ses répertoires de cgroups actuels deviennent les répertoires racines de cgroup dans le nouvel espace de noms (cela s’applique pour les hiérarchies cgroups version 1 et la hiérarchie unifiée cgroups version 2).

Lors de la lecture des appartenances à un cgroup d’un processus « cible » à partir de /proc/pid/cgroup, le chemin affiché dans le troisième champ de chaque enregistrement sera relatif au répertoire racine du processus lisant pour la hiérarchie correspondante de cgroup. Si le répertoire de cgroup du processus cible réside en dehors du répertoire racine de l’espace de noms cgroup du processus lisant, alors le chemin affiche les entrées ../ pour chaque niveau ancêtre dans la hiérarchie de cgroup.

La session d’interpréteur suivante montre les effets de la création d’un nouvel espace de noms cgroup.

D’abord, (en tant que superutilisateur) dans un interpréteur dans l’espace de noms cgroup initial, nous créons un cgroup enfant dans la hiérarchie freezer et plaçons un processus dans ce cgroup que nous utiliserons comme partie de la démonstration suivante :


# mkdir -p /sys/fs/cgroup/freezer/sub2
# sleep 10000 &     # Création d’un processus qui vit pendant un certain temps
[1] 20124
# echo 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs

Puis créons un nouveau cgroup enfant dans la hiérarchie freezer et intégrons l’interpréteur dans ce cgroup :


# mkdir -p /sys/fs/cgroup/freezer/sub
# echo $$                      # Affichage du PID de l’interpréteur
30655
# echo 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs
# cat /proc/self/cgroup | grep freezer
7:freezer:/sub

Ensuite, nous utilisons unshare(1) pour créer un processus exécutant un nouvel interpréteur dans les nouveaux espaces de noms cgroup et montage :


# PS1="sh2# " unshare -Cm bash

À partir du nouvel interpréteur démarré par unshare(1), nous inspectons alors les fichiers /proc/pid/cgroup de, respectivement, le nouvel interpréteur, un processus qui est dans l’espace de noms cgroup initial (init, avec PID 1) et le processus dans le cgroup frère (sub2) :


sh2# cat /proc/self/cgroup | grep freezer
7:freezer:/
sh2# cat /proc/1/cgroup | grep freezer
7:freezer:/..
sh2# cat /proc/20124/cgroup | grep freezer
7:freezer:/../sub2

Dans la sortie de la première commande, nous voyons que l’appartenance au cgroup freezer du nouvel interpréteur (qui est dans le même cgroup que l’interpréteur initial) est affichée comme définie relativement au répertoire racine du cgroup freezer qui a été établi quand le nouvel espace de noms cgroup a été créé (en absolu, le nouvel interpréteur est dans la hiérarchie du cgroup freezer /sub, et le répertoire racine de la hiérarchie du cgroup freezer dans le nouvel espace de noms cgroup est aussi /sub. Par conséquent, l’appartenance à un cgroup du nouvel interpréteur est affichée sous forme « / »).

Cependant, quand nous regardons dans /proc/self/mountinfo, nous constatons l’anomalie suivante :


sh2# cat /proc/self/mountinfo | grep freezer
155 145 0:32 /.. /sys/fs/cgroup/freezer ...

Le quatrième champ de cette ligne (/..) devrait montrer le répertoire dans le système de fichiers de cgroup qui forme la racine de ce montage. Étant donné que suivant la définition des espaces de noms cgroup, le répertoire actuel du cgroup freezer du processus devient le répertoire racine du cgroup freezer, nous devrions voir « / » dans ce champ. Le problème ici est que nous voyons une entrée de montage pour le système de fichiers cgroup, correspondant à l’espace de noms cgroup initial (dont le système de fichiers cgroup a en fait sa racine dans le répertoire parent de sub). Pour corriger ce problème, nous devons remonter le système de fichiers du cgroup freezer à partir du nouvel interpréteur (c’est-à-dire réaliser le montage à partir d’un processus qui est dans le nouvel espace de noms cgroup) ; après quoi, nous verrons les résultats attendus :


sh2# mount --make-rslave /     # Ne pas propager les évènements de
                               # montage aux autres espaces de noms
sh2# umount /sys/fs/cgroup/freezer
sh2# mount -t cgroup -o freezer freezer /sys/fs/cgroup/freezer
sh2# cat /proc/self/mountinfo | grep freezer
155 145 0:32 / /sys/fs/cgroup/freezer rw,relatime ...

Linux.

L’utilisation des espaces de noms cgroup requiert un noyau configuré avec l’option CONFIG_CGROUPS.

La virtualisation offerte par les espaces de noms cgroup poursuit plusieurs buts :

  • elle prévient une fuite d’informations par laquelle des chemins de répertoire de cgroup en dehors d’un conteneur seraient visibles par les processus dans le conteneur. De telles fuites pourraient, par exemple, révéler des informations à propos du cadriciel utilisé pour mettre en conteneur les applications ;
  • elle facilite des tâches telles que la migration de conteneur. La virtualisation offerte par les espaces de noms cgroup permet aux conteneurs d’être protégés de la connaissance des noms de chemin de cgroups ancêtres. Sans cette protection, tous les noms de chemin de cgroup (affichés dans /proc/self/cgroups) devraient être répliqués sur le système cible lors de la migration d’un conteneur. Ces noms de chemin devraient aussi être uniques, de façon à ne pas entrer en conflit avec d’autres noms de chemin dans le système cible ;
  • elle permet un meilleur confinement des processus mis en conteneur parce qu’il est possible de monter le système de fichiers de cgroup du conteneur de telle façon que les processus du conteneur puissent accéder aux répertoires du cgroup ancêtre. Considérons, par exemple, le scénario suivant :
  • nous avons un répertoire de cgroup, /cg/1 dont le propriétaire est l’utilisateur d’ID 9000,
  • nous avons un processus, X, dont le propriétaire est aussi l’utilisateur d’ID 9000, qui est mis dans l’espace de noms sous le cgroup /cg/1/2 (c’est-à-dire X a été placé dans un nouvel espace de noms cgroup à l’aide de clone(2) ou unshare(2) avec le drapeau CLONE_NEWCGROUP).
Si le cgroup n’est pas mis dans un espace de noms, comme le répertoire de cgroup /cg/1 a pour propriétaire l’UID 9000 (qui peut l'éditer) et le processus X a aussi pour propriétaire l’utilisateur d’ID 9000, le processus X pourrait modifier le contenu des fichiers de cgroup (c’est-à-dire modifier les réglages de cgroup), non seulement dans /cg/1/2, mais aussi dans le répertoire ancêtre de cgroup /cg/1. La mise en espace de noms du processus X sous le répertoire de cgroup /cg/1/2, en combinaison avec les opérations adaptées de montage pour le système de fichiers de cgroup (comme montré ci-dessus), empêche le processus de modifier les fichiers dans /cg/1, puisqu’il ne peut même pas voir le contenu de ce répertoire (ou des répertoires ancêtres de cgroup supprimés ultérieurement). Combiné avec une application correcte des limites de hiérarchie, cela empêche le processus X de sortir des limites imposées par les cgroups ancêtres.

unshare(1), clone(2), setns(2), unshare(2), proc(5), cgroups(7), credentials(7), namespaces(7), user_namespaces(7)

La traduction française de cette page de manuel a été créée par Christophe Blaess https://www.blaess.fr/christophe/, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.

31 octobre 2023 Pages du manuel de Linux 6.06