setns
Table des matières
Retour à l'index
NOM
setns - Réassocier un thread avec un espace de noms
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sched.h>
int setns(int fd, int nstype);
DESCRIPTION
L'appel système setns() permet au thread appelant de se déplacer dans
divers espaces de noms. Le paramètre fd est un des suivants :
- -
-
un descripteur de fichier renvoyant à un des liens magiques du répertoire
/proc/pid/ns/ (ou un montage en boucle vers un tel lien) ;
- -
-
un descripteur de fichier de PID (pidfd_open(2)).
La paramètre nstype est interprété différemment dans chaque cas.
fd renvoie à un lien /proc/pid/ns/
Si fd renvoie à un /proc/pid/ns/, setns() ré-associe le thread
appelant à l'espace de noms associé à ce lien, dans les contraintes posées
par le paramètre nstype. Dans cet utilisation, l'appel setns() ne
change qu'un des membres de l'espace de noms de l'appelant.
L'argument nstype indique les types d'espaces de noms auxquels le thread
appelant peut être réassocié. Cet argument peut prendre une des valeurs
suivantes :
- 0
-
fd peut faire référence à n'importe quel type d'espace de noms.
- CLONE_NEWCGROUP (depuis Linux 4.6)
-
fd doit faire référence à un espace de noms cgroup.
- CLONE_NEWIPC (à partir de Linux 3.0)
-
fd doit faire référence à un espace de noms IPC.
- CLONE_NEWNET (à partir de Linux 3.0)
-
fd doit faire référence à un espace de noms réseau.
- CLONE_NEWNS (à partir de Linux 3.8)
-
fd doit faire référence à un espace de noms de montage.
- CLONE_NEWPID (depuis Linux 3.8)
-
fd doit faire référence à un espace de noms de PID descendant.
- CLONE_NEWIPC (depuis Linux 5.8)
-
fd doit faire référence à un espace de noms de temps.
- CLONE_NEWUSER (depuis Linux 3.8)
-
fd doit faire référence à un espace de noms utilisateur.
- CLONE_NEWUTS (à partir de Linux 3.0)
-
fd doit faire référence à un espace de noms UTS.
Définir la valeur de nstype à 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
fd fait référence. Définir nstype à une valeur non nulle est utile si
l'appelant ne connaît pas le type de l'espace de noms référencé par fd 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 fd 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.
fd est un descripteur de fichier de PID
Depuis Linux 5.8, fd peut renvoyer à un descripteur de fichier de PID
qu'on récupère avec pidfd_open(2) ou clone(2). Dans cette utilisation,
setns() déplace de manière atomique le thread appelant dans un ou
plusieurs espaces de noms en tant que thread auquel fd renvoie.
Le paramètre nstype est un masque de bits indiqué par une liaison et
une ou plusieurs des constantes d'espace de noms CLONE_NEW* listées
ci-dessus. L'appelant est déplacé dans chacun des espaces de nom du thread
cible indiqué dans nstype ; l'appartenance de l'appelant aux autres
espaces de noms demeure inchangée.
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 :
int fd = pidfd_open(1234, 0);
setns(fd, CLONE_NEWUSER | CLONE_NEWNET | CLONE_NEWUTS);
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 :
- Espaces de nom utilisateur
-
Un processus qui se ré-associe à un espace de noms utilisateur doit disposer
de la capacité CAP_SYS_ADMIN 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.
-
Un processus de plusieurs threads ne peut pas changer d'espace de noms
utilisateur avec setns().
-
Il n'est pas permis d'utiliser setns() 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 à setns().
-
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 CLONE_FS de
clone(2)) avec un autre processus.
-
Pour obtenir plus d'informations sur les espaces de noms utilisateur,
consultez user_namespaces(7).
- Espaces de noms montage
-
Pour pouvoir changer d'espace de noms de montage, l'appelant doit disposer
des capacités CAP_SYS_CHROOT et CAP_SYS_ADMIN dans son propre espace
de noms utilisateur, et de la capacité CAP_SYS_ADMIN dans l'espace de
noms de montage cible.
-
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 CLONE_FS de clone(2)) avec un autre processus.
-
Voir user_namespaces(7) pour des détails sur l'interaction entre les
espaces de noms utilisateur et de montage.
- Espaces de noms PID
-
Pour se ré-associer à un nouvel espace de noms PID, l'appelant doit avoir la
capacité CAP_SYS_ADMIN dans son espace de noms utilisateur et dans celui
auquel appartient l'espace de noms PID cible.
-
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.
-
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.
-
Pour plus d'informations sur les espaces de noms des PIDs, reportez vous à
namespaces(7).
- Espaces de noms cgroup
-
Pour se ré-associer à un nouvel espace de noms cgroup, l'appelant doit avoir
la capacité CAP_SYS_ADMIN dans son propre espace de noms utilisateur et
dans celui auquel appartient l'espace de noms cgroup cible.
-
L'utilisation de setns() pour changer d'espace de noms cgroup ne change
pas l'appartenance cgroup de l'appelant.
- 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 CAP_SYS_ADMIN dans son propre
espace de noms utilisateur et dans l'espace de noms utilisateur qui possède
l'espace de noms cible.
VALEUR RENVOYÉE
S'il réussit, setns() renvoie 0, sinon il renvoie -1 et errno
est positionné pour indiquer l'erreur.
ERREURS
- EBADF
-
fd n'est pas un descripteur de fichier valable.
- EINVAL
-
fd fait référence à un espace de noms dont le type ne correspond pas à
celui indiqué dans nstype.
- EINVAL
-
Il y a un problème pour ré-associer le thread avec l'espace de noms indiqué.
-
-
EINVAL
L'appelant a essayé d'atteindre un espace de noms PID ancêtre (parent,
grand-parent, etc).
- EINVAL
-
L'appelant a tenté d'intégrer un espace de noms utilisateur dont il est déjà
membre.
- EINVAL
-
L'appelant partage un état de système de fichiers (CLONE_FS), notamment
le répertoire racine, avec d'autres processus et a tenté d'intégrer un
nouvel espace de noms.
- EINVAL
-
L'appelant est multi-threadé et a tenté d'intégrer un nouvel espace de noms
utilisateur.
- EINVAL
-
fd est un descripteur de fichier de PID et nstype n'est pas valable
(il vaut par exemple 0).
- ENOMEM
-
Impossible d'allouer suffisamment de mémoire pour changer l'espace de noms
indiqué.
- EPERM
-
Le processus appelant n'avait pas la capacité appropriée pour effectuer
cette opération.
- ESRCH
-
fd 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).
STANDARDS
Linux.
VERSIONS
Linux 3.0, glibc 2.14.
NOTES
Pour obtenir plus d'informations sur les liens magiques /proc/pid/ns/,
consultez namespaces(7).
Certains des attributs qui peuvent être partagés avec un nouveau thread créé
avec clone(2) ne peuvent pas être modifiés en utilisant setns().
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
/proc/pid/ns/ 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 setns(), et
exécute la commande indiquée dans cet espace de noms.
La session d'invite de commandes suivante présente l'utilisation du
programme (compilé en un binaire appelé ns_exec) en lien avec le
programme CLONE_NEWUTS donné en exemple dans la page de manuel
clone(2) (compilé en un binaire appelé newuts).
Nous commençons par exécuter le programme donné à titre d'exemple dans
clone(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.
$ su # Privilèges nécessaires aux opérations sur l'espace de noms
Mot de passe :
# ./newuts bizarro &
[1] 3549
clone() a renvoyé 3550
uts.nodename dans l'enfant : bizarro
uts.nodename dans le parent : antero
# uname -n # Vérifier le nom d'hôte dans l'invite de commande
antero
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 :
# ./ns_exec /proc/3550/ns/uts /bin/bash
# uname -n # Exécuté dans l'invite lancée par ns_exec
bizarro
Source du programme
#define _GNU_SOURCE
#include <err.h>
#include <fcntl.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
int fd;
if (argc < 3) {
fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\n", 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)
err(EXIT_FAILURE, "open");
if (setns(fd, 0) == -1) /* Rejoindre cet espace de noms */
err(EXIT_FAILURE, "setns");
execvp(argv[2], &argv[2]); /* Exécuter une commande dans l'espace de noms */
err(EXIT_FAILURE, "execvp");
}
VOIR AUSSI
nsenter(1), clone(2), fork(2), unshare(2), vfork(2),
namespaces(7), unix(7)
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-Philippe MENGUAL <jpmengual@debian.org>
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- fd renvoie à un lien /proc/pid/ns/
-
- fd est un descripteur de fichier de PID
-
- Détails sur des types d'espace de noms spécifiques
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- STANDARDS
-
- VERSIONS
-
- NOTES
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:05 GMT, September 19, 2025