Man page - unshare(2)

Packages contains this manual

Available languages:

en fr ja ru

Manual

unshare

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

unshare - DĂ©sassocier certaines parties du contexte d’exĂ©cution

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#define _GNU_SOURCE
#include <sched.h>

int unshare(int flags );

DESCRIPTION

unshare () permet Ă  un processus (ou Ă  un thread) de dĂ©sassocier certaines parties de son contexte d’exĂ©cution qui sont actuellement partagĂ©es avec d’autres processus (ou d’autres threads). Une partie du contexte d’exĂ©cution, comme l’espace de noms de montage, est implicitement partagĂ©e quand un processus est créé avec fork (2) ou vfork (2), alors que d’autres parties, comme la mĂ©moire virtuelle, peuvent ĂȘtre partagĂ©es en faisant explicitement la demande lors de la crĂ©ation d’un processus ou d’un thread avec clone (2).

L’intĂ©rĂȘt principal de unshare () est de permettre Ă  un processus de contrĂŽler son contexte d’exĂ©cution partagĂ© sans avoir Ă  crĂ©er un nouveau processus.

L’argument flags est un masque de bits qui indique quelles parties du contexte d’exĂ©cution doivent ĂȘtre dĂ©sassociĂ©es. Cet argument est construit comme un OU binaire entre les constantes suivantes :
CLONE_FILES

A l’effet inverse de l’attribut CLONE_FILES de clone (2). Supprimer le partage de la table des descripteurs de fichier, afin que le processus appelant ne partage plus ses descripteurs de fichier avec d’autres processus.

CLONE_FS

Annuler l’effet de l’attribut CLONE_FS de clone (2). Supprimer le partage des attributs de systĂšme de fichiers, afin que le processus appelant ne partage plus son rĂ©pertoire racine ( chroot (2)), son rĂ©pertoire courant ( chdir (2)) et sa valeur d’umask ( umask (2)) avec d’autres processus.

CLONE_NEWCGROUP (depuis Linux 4.6)

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWCGROUP de clone (2). DĂ©partager l’espace de noms cgroup. L’utilisation de CLONE_NEWCGROUP nĂ©cessite la capacitĂ© CAP_SYS_ADMIN .

CLONE_NEWIPC (depuis Linux 2.6.19)

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWIPC de clone (2). Supprimer le partage de l’espace de noms IPC, afin que le processus appelant ait une copie privĂ©e de l’espace de noms IPC qui ne soit pas partagĂ©e avec d’autres processus. L’utilisation de cet attribut implique automatiquement aussi CLONE_SYSVSEM . L’utilisation de CLONE_NEWIPC nĂ©cessite la capacitĂ© CAP_SYS_ADMIN .

CLONE_NEWNET (depuis Linux 2.6.24)

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWNET de clone (2). Supprimer le partage de l’espace de noms de rĂ©seau, afin que le processus appelant soit dĂ©placĂ© dans un nouvel espace de noms de rĂ©seau qui n’est pas partagĂ© avec d’autres processus. CLONE_NEWNET nĂ©cessite la capacitĂ© CAP_SYS_ADMIN .

CLONE_NEWNS

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWNS de clone (2). Supprimer le partage de l’espace de noms de montage, afin que le processus appelant ait une copie privĂ©e de son espace de noms qui ne soit pas partagĂ©e avec d’autres processus. L’utilisation de cet attribut implique automatiquement aussi CLONE_FS . L’utilisation de CLONE_NEWNS nĂ©cessite la capacitĂ© CAP_SYS_ADMIN . Pour plus d’informations, consultez mount_namespaces (7).

CLONE_NEWPID (depuis Linux 3.8)

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWNS de clone (2). Supprimr le partage l’espace de noms PID, afin que le processus gĂ©nĂšre un nouvel espace de noms PID qui ne soit pas partagĂ© avec d’autres processus antĂ©rieurs et qui sera celui de ses enfants. Le processus appelant ne change pas d’espace de noms. Le premier enfant créé par le processus appelant aura l’identifiant 1 et sera init (1) dans le nouvel espace de noms. CLONE_NEWPID implique automatiquement CLONE_THREAD . L’utilisation de CLONE_NEWPID nĂ©cessite de disposer de la capacitĂ© CAP_SYS_ADMIN . Pour plus d’informations, consultez pid_namespaces (7).

CLONE_NEWTIME (depuis Linux 5.6)

Supprimer le partage de l’espace de noms temps, afin que le processus appelant ait une copie privĂ©e de son espace de noms qui ne soit pas partagĂ©e avec d’autres processus. Le processus appelant n’est pas dĂ©placĂ© dans le nouvel espace de noms. L’utilisation de CLONE_NEWTIME nĂ©cessite la capacitĂ© CAP_SYS_ADMIN . Pour plus d’informations, consultez time_namespaces (7).

CLONE_NEWUSER (depuis Linux 3.8)

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWUSER de clone (2). Supprimer le partage de l’espace de noms utilisateur, afin que le processus appelant soit dĂ©placĂ© dans un nouvel espace de noms utilisateur qui n’est pas partagĂ© avec d’autres processus. Comme pour les enfants créés par clone (2) avec l’attribut CLONE_NEWUSER , l’appelant obtient un ensemble complet de capacitĂ©s dans le nouvel espace de noms.

CLONE_NEWUSER nĂ©cessite que le processus appelant ne soit pas multi-threadé ; si CLONE_NEWUSER est spĂ©cifiĂ©, CLONE_THREAD l’est automatiquement. À partir de Linux 3.9, CLONE_NEWUSER implique Ă©galement automatiquement CLONE_FS . CLONE_NEWUSER nĂ©cessite que les identifiants utilisateur et groupe du processus appelant correspondent aux identifiants utilisateur et groupe dans l’espace de noms utilisateur du processus appelant au moment de l’appel.

Pour obtenir plus d’informations sur les espaces de noms utilisateur, consultez user_namespaces (7).

CLONE_NEWUTS (depuis Linux 2.6.19)

Cet attribut a le mĂȘme effet que l’attribut CLONE_NEWUTS de clone (2). DĂ©partager l’espace de noms IPC UTS, afin que le processus appelant ait une copie privĂ©e de l’espace de noms UTS qui ne soit pas partagĂ©e avec d’autres processus. L’utilisation de CLONE_NEWUTS nĂ©cessite la capacitĂ© CAP_SYS_ADMIN .

CLONE_SYSVSEM (depuis Linux 2.6.26)

Cet attribut inverse l’effet de l’attribut CLONE_SYSVSEM de clone (2). Supprimer le partage des valeurs d’ajustement des sĂ©maphores System V ( semadj ), afin que le processus appelant ait une nouvelle liste semadj vide qui ne soit partagĂ©e avec aucun autre processus. S’il s’agit du dernier processus ayant une rĂ©fĂ©rence Ă  la liste ( semadj ) du processus courant, alors les ajustements de cette liste sont appliquĂ©s aux sĂ©maphores correspondants, tels que dĂ©crit dans semop (2).

De plus, CLONE_THREAD , CLONE_SIGHAND et CLONE_VM peuvent ĂȘtre invoquĂ©s dans flags si l’appelant est mono-threadĂ© (c’est-Ă -dire s’il ne partage pas son espace d’adressage avec un autre processus ou un autre thread). Dans ce cas, ces attributs sont sans effet. Notez Ă©galement que spĂ©cifier CLONE_THREAD implique automatiquement CLONE_VM , et que spĂ©cifier CLONE_VM implique automatiquement CLONE_SIGHAND . Si le processus est multi-threadĂ©, al’utilisation de ces attributs mĂšne Ă  une erreur.

Si flags vaut zĂ©ro, unshare () n’a aucun effet : le contexte d’exĂ©cution du processus appelant n’est pas modifiĂ©.

VALEUR RENVOYÉE

S’il rĂ©ussit l’appel renvoie zĂ©ro, sinon il renvoie -1 et errno est dĂ©fini pour indiquer l’erreur.

ERREURS

EINVAL

Un attribut non autorisé est indiqué dans flags .

EINVAL

CLONE_THREAD , CLONE_SIGHAND ou CLONE_VM figurait dans flags , et l’appelant Ă©tait multi-threadĂ©.

EINVAL

CLONE_NEWIPC a Ă©tĂ© spĂ©cifiĂ© dans flags , mais le noyau n’a pas Ă©tĂ© configurĂ© avec les options CONFIG_SYSVIPC et CONFIG_IPC_NS .

EINVAL

CLONE_NEWNET a Ă©tĂ© spĂ©cifiĂ© dans flags , mais le noyau n’a pas Ă©tĂ© configurĂ© avec l’option CONFIG_NET_NS .

EINVAL

CLONE_NEWPID a Ă©tĂ© spĂ©cifiĂ© dans le flags , mais le noyau n’a pas Ă©tĂ© configurĂ© avec l’option CONFIG_PID_NS .

EINVAL

CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans flags , mais le noyau n’a pas Ă©tĂ© configurĂ© avec l’option CONFIG_USER_NS .

EINVAL

CLONE_NEWUTS a Ă©tĂ© spĂ©cifiĂ© dans flags , mais le noyau n’a pas Ă©tĂ© configurĂ© avec l’option CONFIG_UTS_NS .

EINVAL

CLONE_NEWPID a Ă©tĂ© spĂ©cifiĂ© dans flags , mais le processus a appelĂ© auparavant unshare () avec l’attribut CLONE_NEWPID .

ENOMEM

Impossible d’allouer suffisamment de mĂ©moire pour copier les parties du contexte de l’appelant qui doivent ĂȘtre rendues privĂ©es.

ENOSPC (depuis Linux 3.7)

CLONE_NEWPID a Ă©tĂ© spĂ©cifiĂ© dans les attributs et l’appel provoquerait un dĂ©passement de la limite du nombre maximal d’espaces de noms utilisateur imbriquĂ©s. Consultez pid_namespaces (7).

ENOSPC (depuis Linux 4.9 ; auparavant EUSERS )

CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans flags et l’appel provoquerait un dĂ©passement de la limite du nombre maximal d’espaces de noms utilisateur imbriquĂ©s. Consultez user_namespaces (7).

De Linux 3.11 Ă  Linux 4.8, l’erreur indiquĂ©e dans ce cas Ă©tait EUSERS .

ENOSPC (depuis Linux 4.9)

Une des valeurs dans flags indiquait de créer un nouvel espace de noms utilisateur, mais cela aurait provoqué un dépassement de la limite définie par le fichier correspondant dans /proc/sys/user . Pour plus de détails, voir namespaces (7).

EPERM

Le processus appelant n’avait pas les privilĂšges appropriĂ©s pour effectuer cette opĂ©ration.

EPERM

CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans flags , mais l’identifiant utilisateur effectif ou l’identifiant de groupe effectif de l’appelant n’a pas de correspondance dans l’espace de noms parent (consultez user_namespaces (7)).

EPERM (depuis Linux 3.9)

CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans flags et l’appelant se trouve dans un environnement chroot (c’est-Ă -dire que le rĂ©pertoire racine de l’appelant ne correspond pas au rĂ©pertoire racine de l’espace de noms de montage dans lequel il se trouve).

EUSERS (de Linux 3.11 Ă  Linux 4.8)

CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans flags , et l’appel provoquerait un dĂ©passement de la limite du nombre maximal d’espaces de noms utilisateur imbriquĂ©s. Voir le point sur l’erreur ENOSPC ci-dessus.

STANDARDS

Linux.

HISTORIQUE

Linux 2.6.16.

NOTES

Tous les attributs de processus qui peuvent ĂȘtre partagĂ©s lorsqu’un processus est créé avec clone (2) ne peuvent pas ĂȘtre rendus privĂ©s avec unshare (). En particulier, dans le noyau 3.8, unshare () n’implĂ©mente pas de drapeaux inversant les effets de CLONE_SIGHAND , CLONE_THREAD ou CLONE_VM . Cette fonctionnalitĂ© pourra ĂȘtre ajoutĂ©e plus tard si nĂ©cessaire.

La crĂ©ation de tout type d’espace de noms, Ă  l’exception des noms des espaces de noms utilisateur, requiert la capacitĂ© CAP_SYS_ADMIN . Cependant, dans la mesure oĂč la crĂ©ation d’un espace de noms utilisateur confĂšre un ensemble complet de capacitĂ©s, crĂ©er Ă  la fois un espace de noms utilisateur et un espace de noms de n’importe quel type dans le mĂȘme appel de unshare () ne nĂ©cessite pas la capacitĂ© CAP_SYS_ADMIN dans l’espace de nom d’origine.

EXEMPLES

Le programme ci-dessous est une implĂ©mentation simple de la commande unshare (1) qui supprime le partage d’un ou plusieurs espaces de noms et exĂ©cute la commande fournie en argument. Voici un exemple d’utilisation du programme qui exĂ©cute un shell dans un nouvel espace de noms de montage, puis vĂ©rifie que le shell initial et le nouveau shell sont bien dans des espaces de noms de montage sĂ©parĂ©s :

$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
$ sudo ./unshare -m /bin/bash
# readlink /proc/$$/ns/mnt
mnt:[4026532325]

Les deux chaßnes renvoyées par readlink (1) sont différentes, ce qui montre que les deux shells se trouvent dans des espaces de noms de montage différents.

Source du programme

/* unshare.c
Une implémentation simple de la commande unshare(1) : supprimer
le partage des espaces de noms et exécuter une commande.
*/
#define _GNU_SOURCE
#include <err.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
usage(char *pname)
{
fprintf(stderr, "utilisation : %s [options] program [arg...]\n",
pname);
fprintf(stderr, "Les options sont :\n");
fprintf(stderr, " -C supprime le partage de l’espace de noms
cgroup\n");
fprintf(stderr, " -i supprime le partage de l’espace de noms
IPC\n");
fprintf(stderr, " -m supprime le partage de l’espace de noms de
montage\n");
fprintf(stderr, " -n supprime le partage de l’espace de noms
réseau\n");
fprintf(stderr, " -p supprime le partage de l’espace de noms
PID\n");
fprintf(stderr, " -t supprime le partage de l’espace de noms
temps\n");
fprintf(stderr, " -u supprime le partage de l’espace de noms
UTS\n");
fprintf(stderr, " -U supprime le partage de l’espace de noms
utilisateur\n");
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
int flags, opt;
flags = 0;
while ((opt = getopt(argc, argv, "CimnptuU")) != -1) {
switch (opt) {
case 'C': flags |= CLONE_NEWCGROUP; break;
case 'i': flags |= CLONE_NEWIPC; break;
case 'm': flags |= CLONE_NEWNS; break;
case 'n': flags |= CLONE_NEWNET; break;
case 'p': flags |= CLONE_NEWPID; break;
case 't': flags |= CLONE_NEWTIME; break;
case 'u': flags |= CLONE_NEWUTS; break;
case 'U': flags |= CLONE_NEWUSER; break;
default: usage(argv[0]);
}
}
if (optind >= argc)
usage(argv[0]);
if (unshare(flags) == -1)
err(EXIT_FAILURE, "unshare");
execvp(argv[optind], &argv[optind]);
err(EXIT_FAILURE, "execvp");
}

VOIR AUSSI

unshare (1), clone (2), fork (2), kcmp (2), setns (2), vfork (2), namespaces (7)

Documentation/userspace-api/unshare.rst dans les sources du noyau Linux (ou Documentation/unshare.txt avant Linux 4.12).

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-Pierre Giraud <jean-pierregiraud@neuf.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 .