| unshare(2) | System Calls Manual | unshare(2) |
unshare - Désassocier certaines parties du contexte d'exécution
Bibliothèque C standard (libc, -lc)
#define _GNU_SOURCE #include <sched.h>
int unshare(int flags);
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 :
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é.
S'il réussit l'appel renvoie zéro, sinon il renvoie -1 et errno est défini pour indiquer l'erreur.
L'appel système unshare() est apparu dans Linux 2.6.16.
L'appel système unshare() est spécifique à Linux.
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.
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.
/* 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");
}
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).
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.
| 5 février 2023 | Pages du manuel de Linux 6.03 |