Man page - pid_namespaces(7)

Packages contains this manual

Available languages:

en fr sv ja ru ro de

Manual

pid_namespaces

NOM
DESCRIPTION
Le processus d’initialisation (init) de l’espace de noms
Imbrication des espaces de noms PID
Sémantiques de setns(2) et de unshare(2)
Adoption d’un enfant orphelin
Compatibilité de CLONE_NEWPID avec les autres attributs CLONE_*
/proc et espaces de noms PID
Fichiers /proc
Divers
STANDARDS
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

pid_namespaces - PrĂ©sentation des espaces de noms d’identifiants de processus (ou PID) sous Linux

DESCRIPTION

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

Les espaces de noms PID isolent les espaces de numĂ©ros d’identifiants de processus, ce qui signifie que des processus de diffĂ©rents espaces de noms PID peuvent avoir le mĂȘme PID. Les espaces de noms PID permettent aux conteneurs de fournir des possibilitĂ©s telles que la suspension et la reprise de l’ensemble des processus d’un conteneur et la migration du conteneur vers un nouvel hĂŽte tout en permettant aux processus du conteneur de conserver leurs PID.

Dans un nouvel espace de noms PID, la numĂ©rotation commence à 1 comme pour un systĂšme autonome et les appels Ă  fork (2), vfork (2) ou clone (2) gĂ©nĂšrent des identifiants de processus uniques dans l’espace de noms PID.

Le noyau doit avoir Ă©tĂ© configurĂ© avec l’option CONFIG_PID_NS pour permettre l’utilisation des espaces noms PID.

Le processus d’initialisation (init) de l’espace de noms

Le premier processus créé dans un nouvel espace de noms (c’est-Ă -dire le processus créé par clone (2) avec l’attribut CLONE_NEWPID ou le premier processus enfant créé aprĂšs un appel Ă  unshare (2) avec l’attribut CLONE_NEWPID ) a pour PID 1. Il est le processus « init » pour l’espace de noms (consultez init (1)). Ce processus devient le parent pour n’importe quel processus enfant qui devient orphelin parce qu’un processus rĂ©sidant dans cet espace de noms PID se termine (voir ci-aprĂšs pour plus de dĂ©tails).

Si le processus « init » d’un espace de noms PID se termine, le noyau tue tous les processus de cet espace de noms au moyen du signal SIGKILL . Ce comportement illustre le fait que le processus « init » est essentiel au bon fonctionnement de l’espace de noms PID. Dans ce cas, une commande fork (2) ultĂ©rieure dans cet espace de noms PID Ă©chouera en renvoyant l’erreur ENOMEM . Il n’est plus possible de crĂ©er des processus dans un espace de noms PID dont le processus « init » est terminĂ©. Cela peut, par exemple, se produire lorsqu’un processus utilise un descripteur de fichier ouvert pour un fichier /proc/ pid /ns/pid correspondant Ă  un processus d’un espace de noms pour une rĂ©association ( setns (2)) dans cet espace de noms aprĂšs que le processus « init » soit terminĂ©. Un autre scĂ©nario est possible aprĂšs un appel Ă  unshare (2) : si le premier enfant créé par un appel Ă  fork (2) se termine, alors les appels ultĂ©rieurs Ă  fork (2) Ă©choueront en renvoyant l’erreur ENOMEM .

Seuls les signaux pour lesquels le processus « init » a dĂ©fini un gestionnaire de signal peuvent ĂȘtre envoyĂ©s au processus « init » par les autres processus de l’espace de noms PID. Cette rĂšgle s’applique Ă©galement aux processus disposant de privilĂšges et permet d’éviter qu’un processus membre de l’espace de noms PID ne tue accidentellement le processus « init ».

De mĂȘme, un processus d’un espace ancĂȘtre peut — en tenant compte des vĂ©rifications de droits habituelles dĂ©crites dans kill (2) — envoyer des signaux au processus « init » d’un espace de noms enfant, Ă  la condition que le processus « init » ait Ă©tabli un gestionnaire pour ce signal. Le champ si_pid de siginfo_t dĂ©crit dans sigaction (2) pour ce gestionnaire vaudra zĂ©ro. SIGKILL et SIGSTOP font figure d’exception : ces signaux seront appliquĂ©s « de force » lorsqu’ils sont Ă©mis depuis un espace de noms PID ancĂȘtre. Ces signaux ne peuvent pas ĂȘtre interceptĂ©s par le processus « init » et les actions associĂ©es Ă  ces processus seront exĂ©cutĂ©es (respectivement, tuer ou suspendre l’exĂ©cution du processus).

Depuis Linux 3.4, l’appel systĂšme reboot (2) dĂ©clenche l’envoi d’un signal aux processus « init » des espaces de noms. Consultez reboot (2) pour obtenir plus d’informations.

Imbrication des espaces de noms PID

Les espaces de noms PID peuvent ĂȘtre imbriquĂ©s : tous les espaces de noms PID ont un parent, sauf l’espace de noms PID initial (« root »). Le parent d’un espace de noms PID est l’espace de noms PID du processus qui a créé l’espace de noms Ă  l’aide de clone (2) ou unshare (2). Les espaces de noms PID forment donc une arborescence dans laquelle chaque espace de noms peut remonter jusqu’à l’espace « root ». Depuis Linux 3.7, le noyau limite la profondeur maximale d’imbrication pour les espace de noms PID à 32.

Un processus est visible de tous les processus de son espace de noms PID, et de tous les processus des espaces de noms PID ancĂȘtres qui le sĂ©parent de l’espace PID « root ». Ici, on entend par « visible » qu’un autre processus peut ĂȘtre la cible d’opĂ©rations d’un autre processus utilisant des appels systĂšme qui prĂ©cisent l’ID du processus. Inversement, les processus d’un espace de noms PID enfant ne peuvent pas voir les processus de l’espace parent et des espaces de noms ancĂȘtre Ă©loignĂ©s. En rĂ©sumĂ©, un processus peut seulement voir (c’est-Ă -dire envoyer des signaux avec kill (2), dĂ©finir des valeurs de courtoisie avec setpriority (2), etc.) les processus de son propre espace de noms PID et des espaces de noms de sa descendance.

Un processus a un identifiant dans chaque niveau de la hiĂ©rarchie des espaces de noms PID dans lequel il est visible, et ce en remontant chaque espace de noms ancĂȘtre jusqu’à l’espace de noms PID « root ». Les appels systĂšme qui s’exĂ©cutent sur des identifiants de processus s’appliquent Ă  l’identifiant du processus qui est visible dans l’espace de noms PID de l’appelant. Un appel Ă  getpid (2) renvoie toujours le PID associĂ© Ă  l’espace de noms dans lequel le processus a Ă©tĂ© créé.

Certains processus d’un espace de noms PID peuvent avoir des parents en dehors de cet espace. Par exemple, le parent du processus initial de l’espace de noms ( init (1), processus dont le PID est 1) se trouve forcĂ©ment en dehors de cet espace. De mĂȘme, l’enfant direct d’un processus qui a invoquĂ© setns (2) pour que son enfant rejoigne un espace de noms PID, se trouve dans un espace de noms PID diffĂ©rent de celui de l’appelant Ă  setns (2). Les appels Ă  getppid (2) pour de tels processus renvoient 0 .

Alors que les processus peuvent descendre librement dans les espaces de noms enfant (par exemple, en utilisant setns (2) avec un descripteur de fichier d’espace de noms PID), ils ne peuvent pas se dĂ©placer dans l’autre direction. Cela veut dire que les processus ne peuvent entrer dans aucun espace de noms ancĂȘtre (parent, grand-parent, etc.). La modification d’espace de noms PID est une opĂ©ration Ă  sens unique.

L’opĂ©ration NS_GET_PARENT d’ ioctl (2) peut ĂȘtre utilisĂ©e pour dĂ©couvrir la relation parentale entre les espaces de noms PID. Consultez ioctl_nsfs (2).

Sémantiques de setns(2) et de unshare(2)

Les appels Ă  setns (2) qui indiquent un descripteur de fichier d’un espace de noms PID et les appels Ă  unshare (2) avec l’attribut CLONE_NEWPID font que les processus enfant qui seront créés par la suite seront placĂ©s dans un espace de noms PID diffĂ©rent de celui de l’appelant. Depuis Linux 4.12, cet espace de noms PID est affichĂ© Ă  l’aide du fichier /proc/ pid /ns/pid_for_children , comme dĂ©crit dans namespaces (7). Cependant, ces appels ne changent pas l’espace de noms PID du processus appelant, parce que le faire modifierait la perception par l’appelant de son propre PID (comme indiquĂ© dans getpid ()), cassant de nombreuses applications et bibliothĂšques.

Pour prĂ©senter les choses diffĂ©remment, l’appartenance d’un processus Ă  un espace de noms PID est dĂ©terminĂ©e lors de la crĂ©ation du processus et ne peut plus ĂȘtre changĂ©e ensuite. Cela signifie que la relation parent-enfant entre processus reproduit la relation parentale entre des espaces de noms PID : le parent d’un processus est soit dans le mĂȘme espace de noms, soit dans l’espace de noms PID du parent immĂ©diat.

Un processus peut appeler unshare (2) avec l’indicateur CLONE_NEWPID seulement une fois. AprĂšs avoir rĂ©alisĂ© cette opĂ©ration, son lien symbolique /proc/ pid /ns/pid_for_children sera vide jusqu’à la crĂ©ation du premier enfant dans l’espace de noms.

Adoption d’un enfant orphelin

Quand un processus enfant devient orphelin, il est rĂ©apparentĂ© au processus « init » dans l’espace de noms PID de son parent (sinon un des ancĂȘtres les plus proches du parent employĂ© dans la commande PR_SET_CHILD_SUBREAPER de prctl (2) pour ĂȘtre marquĂ© comme le rĂ©cupĂ©rateur des processus de descendants orphelins). Il est Ă  noter qu’à cause des sĂ©mantiques de setns (2) et unshare (2) dĂ©crites ci-dessus, cela peut ĂȘtre le processus « init » dans l’espace de noms PID qui est le parent de l’espace de noms PID de l’enfant, plutĂŽt que le processus « init » dans le propre espace de noms PID de l’enfant.

Compatibilité de CLONE_NEWPID avec les autres attributs CLONE_*

Dans les versions actuelles de Linux, CLONE_NEWPID ne peut pas ĂȘtre combinĂ© avec CLONE_THREAD . Les threads doivent ĂȘtre dans le mĂȘme espace de noms PID de telle façon que les threads puissent s’envoyer des signaux les uns aux autres. De la mĂȘme façon, il doit ĂȘtre possible de voir tous les threads d’un processus dans le systĂšme de fichiers proc (5). De plus, si deux threads Ă©taient dans des espaces de noms PID diffĂ©rents, l’ID de processus du processus envoyant un signal ne pourrait pas ĂȘtre encodĂ© judicieusement lors de l’envoi d’un signal (consultez la description du type siginfo_t dans sigaction (2)). Puisque que cela a du sens lorsqu’un signal est mis en file d’attente, une file de signaux partagĂ©e par des processus dans plusieurs espaces de noms PID irait Ă  l’encontre de cela.

De plus dans les premiĂšres versions de Linux, CLONE_NEWPID n’était pas autorisĂ© (Ă©chouant avec l’erreur EINVAL ) en combinaison avec CLONE_SIGHAND (avant Linux 4.3) ainsi que CLONE_VM (avant Linux 3.12). Les modifications qui ont apportĂ© ces restrictions ont Ă©tĂ© aussi portĂ©es sur les prĂ©cĂ©dents noyaux stables.

/proc et espaces de noms PID

Un systĂšme de fichiers /proc ne prĂ©sente (dans les rĂ©pertoires /proc/ pid) que les processus visibles dans l’espace de noms PID du processus qui a effectuĂ© le montage, mĂȘme si le systĂšme de fichiers /proc est vu par des processus appartenant Ă  d’autres espaces de noms.

AprĂšs la crĂ©ation d’un nouvel espace de noms PID, un enfant peut avoir intĂ©rĂȘt Ă  changer son rĂ©pertoire racine et Ă  monter une nouvelle instance procfs sur /proc afin d’assurer que des commandes comme ps (1) fonctionneront correctement. Si un nouvel espace de noms montage est créé simultanĂ©ment en invoquant clone (2) ou unshare (2) avec l’argument CLONE_NEWNS , il n’est alors pas nĂ©cessaire de changer le rĂ©pertoire racine : une nouvelle instance procfs peut ĂȘtre montĂ©e directement dans /proc .

Depuis un interpréteur de commandes, la commande permettant de monter /proc est :

$ mount -t proc proc /proc

L’appel de readlink (2) appliquĂ© au chemin /proc/self affiche les identifiants des processus de l’appelant dans l’espace de noms PID du montage procfs (c’est-Ă -dire l’espace de noms PID du processus qui a montĂ© procfs). Cela peut ĂȘtre utile lorsque qu’un processus a besoin de connaĂźtre son PID dans un autre espace de noms.

Fichiers /proc

/proc/sys/kernel/ns_last_pid (depuis Linux 3.3)

Ce fichier (virtualisé par espace de noms PID) affiche le dernier PID qui a été alloué dans cet espace de noms PID. Quand le prochain PID est alloué, le noyau recherchera le plus petit PID non alloué qui est supérieur à cette valeur, et quand ce fichier est lu ultérieurement, il affiche ce PID.

Un processus peut Ă©crire sur ce fichier s’il a la capacitĂ© CAP_SYS_ADMIN ou (depuis Linux 5.9) CAP_CHECKPOINT_RESTORE Ă  l’intĂ©rieur de l’espace de noms utilisateur qui possĂšde l’espace de noms PID. Cela rend possible de dĂ©terminer le PID qui est allouĂ© au prochain processus créé dans cet espace de noms PID.

Divers

Lorsqu’un identifiant de processus est transmis Ă  l’aide d’un socket de domaine UNIX Ă  un processus d’un autre espace de noms PID (consultez SCM_CREDENTIALS dans unix (7)), il est transformĂ© pour devenir le PID correspondant dans l’espace de noms PID du processus recevant.

STANDARDS

Linux.

EXEMPLES

Consulter user_namespaces (7).

VOIR AUSSI

clone (2), reboot (2), setns (2), unshare (2), proc (5), capabilities (7), credentials (7), mount_namespaces (7), namespaces (7), user_namespaces (7), switch_root (8)

TRADUCTION

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>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> 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 .