Man page - setns(2)

Packages contains this manual

Available languages:

en fr ja ru

Manual

setns

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

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 à debian-l10n-french@lists.debian.org .