.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2011, Eric Biederman .\" and Copyright (C) 2011, 2012, Michael Kerrisk .\" .\" %%%LICENSE_START(GPLv2_ONELINE) .\" Licensed under the GPLv2 .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SETNS 2 "13 août 2020" Linux "Manuel du programmeur Linux" .SH NOM setns \- Réassocier un thread avec un espace de noms .SH SYNOPSIS .nf \fB#define _GNU_SOURCE\fP /* Consultez feature_test_macros(7) */ \fB#include \fP .PP \fBint setns(int \fP\fIfd\fP\fB, int \fP\fInstype\fP\fB);\fP .fi .SH DESCRIPTION L'appel système \fBsetns\fP() permet au thread appelant de se déplacer dans divers espaces de noms. Le paramètre \fIfd\fP est un des suivants\ : .IP \(bu 2 un descripteur de fichier renvoyant à un des liens magiques du répertoire \fI/proc/[pid]/ns/\fP (ou un montage en boucle vers un tel lien)\ ; .IP \(bu un descripteur de fichier de PID (\fBpidfd_open\fP(2)). .PP .\" La paramètre \fInstype\fP est interprété différemment dans chaque cas. .SS "fd renvoie à un lien /proc/[pid]/ns/" Si \fIfd\fP renvoie à un \fI/proc/[pid]/ns/\fP, \fBsetns\fP() ré\-associe le thread appelant à l'espace de noms associé à ce lien, dans les contraintes posées par le paramètre \fInstype\fP. Dans cet utilisation, l'appel \fBsetns\fP() ne change qu'un des membres de l'espace de noms de l'appelant. .PP L'argument \fInstype\fP indique les types d'espaces de noms auxquels le thread appelant peut être réassocié. Cet argument peut prendre \fIune\fP des valeurs suivantes\ : .TP \fB0\fP \fIfd\fP peut faire référence à n'importe quel type d'espace de noms. .TP \fBCLONE_NEWCGROUP\fP (depuis Linux 4.6) \fIfd\fP doit faire référence à un espace de noms cgroup. .TP \fBCLONE_NEWIPC\fP (à partir de Linux 3.0) \fIfd\fP doit faire référence à un espace de noms IPC. .TP \fBCLONE_NEWNET\fP (à partir de Linux 3.0) \fIfd\fP doit faire référence à un espace de noms réseau. .TP \fBCLONE_NEWNS\fP (à partir de Linux 3.8) \fIfd\fP doit faire référence à un espace de noms de montage. .TP \fBCLONE_NEWPID\fP (depuis Linux 3.8) \fIfd\fP doit faire référence à un espace de noms de PID descendant. .TP \fBCLONE_NEWIPC\fP (depuis Linux 5.8) .\" commit 76c12881a38aaa83e1eb4ce2fada36c3a732bad4 \fIfd\fP doit faire référence à un espace de noms de temps. .TP \fBCLONE_NEWUSER\fP (depuis Linux 3.8) \fIfd\fP doit faire référence à un espace de noms utilisateur. .TP \fBCLONE_NEWUTS\fP (à partir de Linux 3.0) \fIfd\fP doit faire référence à un espace de noms UTS. .PP .\" Définir la valeur de \fInstype\fP à zéro est suffisant si le thread appelant connaît (ou n'a pas besoin de connaître) le type d'espace de noms auquel \fIfd\fP fait référence. Définir \fInstype\fP à une valeur non nulle est utile si l'appelant ne connaît pas le type de l'espace de noms référencé par \fIfd\fP et veut s'assurer que l'espace de noms est du type souhaité. L'appelant pourrait ne pas connaître le type de l'espace de noms auquel \fIfd\fP fait référence si le descripteur de fichiers a été ouvert par un autre processus et qu'il a, par exemple, été passé à l'appelant par un socket UNIX. .SS "fd est un descripteur de fichier de PID" Depuis Linux 5.8, \fIfd\fP peut renvoyer à un descripteur de fichier de PID récupéré depuis \fBpidfd_open\fP(2) ou \fBclone\fP(3). Dans cette situation, \fBsetns\fP() déplace de manière atomique le thread dans un ou plusieurs des espaces de noms du même type que celui auquel renvoie \fIfd\fP. .PP Le paramètre \fInstype\fP est un masque de bits indiqué par une liaison et \fIune ou plusieurs\fP des constantes d'espace de noms \fBCLONE_NEW*\fP listées ci\-dessus. L'appelant est déplacé dans chacun des espaces de nom du thread cible indiqué dans \fInstype\fP\ ; l'appartenance de l'appelant aux autres espaces de noms demeure inchangée. .PP Par exemple, le code suivant déplace l'appelant dans les mêmes espace de noms utilisateur, réseau et UTS sous le PID 1234, mais les autres appartenances à l'espace de noms de l'appelant ne changent pas\ : .PP .in +4n .EX int fd = pidfd_open(1234, 0); setns(fd, CLONE_NEWUSER | CLONE_NEWNET | CLONE_NEWUTS); .EE .in .\" .SS "Détails sur des types d'espace de noms spécifiques" Notez les détails et les restrictions suivantes lors de la ré\-association à certains types d'espace de noms spécifiques\ : .TP Espaces de nom utilisateur .\" See kernel/user_namespace.c:userns_install() [3.8 source] Un processus qui se ré\-associe à un espace de noms utilisateur doit disposer de la capacité \fBCAP_SYS_ADMIN\fP dans l'espace de noms utilisateur cible (donc, nécesairement, il n'est possible d'atteindre qu'un espace de noms descendant). Lorsque le déplacement réussit, un processus se voit accorder toutes les capacités de cet espace de noms, quels que soient ses IDentifiants d'utilisateur et de groupe. .IP Un processus de plusieurs threads ne peut pas changer d'espace de noms utilisateur avec \fBsetns\fP(). .IP Il n'est pas permis d'utiliser \fBsetns\fP() pour revenir dans l'espace de noms utilisateur de l'appelant. Cela empêche un appelant n'ayant plus ces capacités de les retrouver à l'aide d'un appel à \fBsetns\fP(). .IP .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71 .\" https://lwn.net/Articles/543273/ Pour des raisons de sécurité, un processus ne peut pas atteindre un nouvel espace de noms utilisateur s'il partage des attributs liés à un système de fichiers (dont le partage est contrôlé avec le drapeau \fBCLONE_FS\fP de \fBclone\fP(2)) avec un autre processus. .IP Pour obtenir plus d'informations sur les espaces de noms utilisateur, consultez \fBuser_namespaces\fP(7). .TP Espaces de noms montage Pour pouvoir changer d'espace de noms de montage, l'appelant doit disposer des capacités \fBCAP_SYS_CHROOT\fP et \fBCAP_SYS_ADMIN\fP dans son propre espace de noms utilisateur, et de la capacité \fBCAP_SYS_ADMIN\fP dans l'espace de noms de montage cible. .IP .\" Above check is in fs/namespace.c:mntns_install() [3.8 source] Un processus ne peut pas atteindre un nouvel espace de noms de montage s'il partage des attributs relatifs à un système de fichiers (dont le partage est contrôlé par le drapeau \fBCLONE_FS\fP de \fBclone\fP(2)) avec un autre processus. .IP Voir \fBuser_namespaces\fP(7) pour des détails sur l'interaction entre les espaces de noms utilisateur et de montage. .TP Espaces de noms PID Pour se ré\-associer à un nouvel espace de noms PID, l'appelant doit avoir la capacité \fBCAP_SYS_ADMIN\fP dans son espace de noms utilisateur et dans celui auquel appartient l'espace de noms PID cible. .IP Réassocier l'espace de noms d'un PID a un comportement différent des autres types d'espace de noms. La ré\-association du thread appelant avec un espace de noms de PID change seulement l'espace de noms de PID dans lequel les processus enfants de l'appelant seront créés\ ; cela ne change pas l'espace de noms PID de l'appelant. .IP La ré\-association à un espace de noms PID n'est autorisée que si l'espace de noms PID cible est un descendant (l'enfant, le petit\-enfant, etc) ou est le même que celui de l'appelant. .IP Pour plus d'informations sur les espaces de noms des PIDs, reportez vous à \fBnamespaces\fP(7). .TP Espaces de noms cgroup Pour se ré\-associer à un nouvel espace de noms cgroup, l'appelant doit avoir la capacité \fBCAP_SYS_ADMIN\fP dans son propre espace de noms utilisateur et dans celui auquel appartient l'espace de noms cgroup cible. .IP L'utilisation de \fBsetns\fP() pour changer d'espace de noms cgroup ne change pas l'appartenance cgroup de l'appelant. .TP Espaces de noms réseau, IPC, de temps et UTS Pour se ré\-associer à un nouvel espace de noms réseau, IPC, de temps ou UTS, l'appelant doit disposer des capacités \fBCAP_SYS_ADMIN\fP dans son propre espace de noms utilisateur et dans l'espace de noms utilisateur qui possède l'espace de noms cible. .SH "VALEUR RENVOYÉE" S'il réussit, \fIsetns\fP() renvoie \fB0\fP, sinon il renvoie \fB\-1\fP et \fIerrno\fP est positionné pour indiquer l'erreur. .SH ERREURS .TP \fBEBADF\fP \fIfd\fP n'est pas un descripteur de fichier valable. .TP \fBEINVAL\fP \fIfd\fP fait référence à un espace de noms dont le type ne correspond pas à celui indiqué dans \fInstype\fP. .TP \fBEINVAL\fP Il y a un problème pour ré\-associer le thread avec l'espace de noms indiqué. .TP .\" See kernel/pid_namespace.c::pidns_install() [kernel 3.18 sources] \fBEINVAL\fP L'appelant a essayé d'atteindre un espace de noms PID ancêtre (parent, grand\-parent, etc). .TP \fBEINVAL\fP L'appelant a tenté d'intégrer un espace de noms utilisateur dont il est déjà membre. .TP \fBEINVAL\fP .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71 L'appelant partage un état de système de fichiers (\fBCLONE_FS\fP), notamment le répertoire racine, avec d'autres processus et a tenté d'intégrer un nouvel espace de noms. .TP \fBEINVAL\fP .\" See kernel/user_namespace.c::userns_install() [kernel 3.15 sources] L'appelant est multi\-threadé et a tenté d'intégrer un nouvel espace de noms utilisateur. .TP \fBEINVAL\fP \fIfd\fP est un descripteur de fichier de PID et \fInstype\fP n'est pas valable (il vaut par exemple \fB0\fP). .TP \fBENOMEM\fP Impossible d'allouer suffisamment de mémoire pour changer l'espace de noms indiqué. .TP \fBEPERM\fP Le processus appelant n'avait pas la capacité appropriée pour effectuer cette opération. .TP \fBESRCH\fP \fIfd\fP est un descripteur de fichier PID mais le processus auquel il renvoie n'existe plus (c'est\-à\-dire qu'il s'est terminé et attend). .SH VERSIONS L'appel système \fBsetns\fP() est apparu dans Linux 3.0\ ; sa prise en charge a été ajoutée dans la version\ 2.14 de la glibc. .SH CONFORMITÉ L'appel système \fBsetns\fP() est spécifique à Linux. .SH NOTES Pour obtenir plus d'informations sur les liens magiques \fI/proc/[pid]/ns/\fP, consultez \fBnamespaces\fP(7). .PP Certains des attributs qui peuvent être partagés avec un nouveau thread créé avec \fBclone\fP(2) ne peuvent pas être modifiés en utilisant \fBsetns\fP(). .SH EXEMPLES Le programme ci\-dessous attend au moins deux arguments. Le premier précise le chemin d'un fichier d'espace de noms dans un répertoire \fI/proc/[pid]/ns/\fP qui doit exister préalablement. Les arguments suivants précisent une commande et ses arguments. Le programme ouvre le fichier d'espace de noms, s'associe à l'espace de noms en utilisant \fBsetns\fP(), et exécute la commande indiquée dans cet espace de noms. .PP La session d'invite de commandes suivante présente l'utilisation du programme (compilé en un binaire appelé \fIns_exec\fP) en lien avec le programme \fBCLONE_NEWUTS\fP donné en exemple dans la page de manuel \fBclone\fP(2) (compilé en un binaire appelé \fInewuts\fP). .PP Nous commençons par exécuter le programme donné à titre d'exemple dans \fBclone\fP(2) en tâche de fond. Ce programme crée un processus enfant dans un espace de noms UTS distinct. Le processus enfant change le nom d'hôte dans son espace de noms, puis les deux processus affichent leur noms d'hôte dans leurs espaces de noms UTS respectifs, de façon à bien montrer leur différence. .PP .in +4n .EX $ \fBsu\fP # Privilèges nécessaires aux opérations sur l'espace de noms Mot de passe\ : # \fB./newuts bizarro &\fP [1] 3549 clone() a renvoyé 3550 uts.nodename dans l'enfant\ : bizarro uts.nodename dans le parent\ : antero # \fBuname \-n\fP # Vérifier le nom d'hôte dans l'invite de commande antero .EE .in .PP Nous appelons alors le programme présenté ci\-dessous afin de lancer une invite de commande. Dans cette invite, on vérifie que le nom d'hôte est bien celui défini par le processus enfant créé dans le premier programme\ : .PP .in +4n .EX # \fB./ns_exec /proc/3550/ns/uts /bin/bash\fP # \fBuname \-n\fP # Exécuté dans l'invite lancée par ns_exec bizarro .EE .in .SS "Source du programme" .EX #define _GNU_SOURCE #include #include #include #include #include #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e } while (0) int main(int argc, char *argv[]) { int fd; if (argc < 3) { fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\en", argv[0]); exit(EXIT_FAILURE); } /* Récupérer le descripteur de fichier de l'espace de noms\ ; le descripteur de fichier est ouvert avec O_CLOEXEC pour garantir qu'il n'est pas récupéré par le programme exécuté en dernier. */ fd = open(argv[1], O_RDONLY | O_CLOEXEC); if (fd == \-1) errExit("open"); if (setns(fd, 0) == \-1) /* Rejoindre cet espace de noms */ errExit("setns"); execvp(argv[2], &argv[2]); /* Exécuter une commande dans l'espace de noms */ errExit("execvp"); } .EE .SH "VOIR AUSSI" \fBnsenter\fP(1), \fBclone\fP(2), \fBfork\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBnamespaces\fP(7), \fBunix\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Cédric Boutillier , Frédéric Hantrais et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .