unshare(2) System Calls Manual unshare(2) NOM unshare - Desassocier certaines parties du contexte d'execution BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #define _GNU_SOURCE #include int unshare(int flags); DESCRIPTION unshare() permet a un processus (ou a un thread) de desassocier certaines parties de son contexte d'execution qui sont actuellement partagees avec d'autres processus (ou d'autres threads). Une partie du contexte d'execution, comme l'espace de noms de montage, est implicitement partagee quand un processus est cree avec fork(2) ou vfork(2), alors que d'autres parties, comme la memoire virtuelle, peuvent etre partagees en faisant explicitement la demande lors de la creation d'un processus ou d'un thread avec clone(2). L'interet principal de unshare() est de permettre a un processus de controler son contexte d'execution partage sans avoir a creer un nouveau processus. L'argument flags est un masque de bits qui indique quelles parties du contexte d'execution doivent etre desassociees. 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 systeme de fichiers, afin que le processus appelant ne partage plus son repertoire racine (chroot(2)), son repertoire courant (chdir(2)) et sa valeur d'umask (umask(2)) avec d'autres processus. CLONE_NEWCGROUP (depuis Linux 4.6) Cet attribut a le meme effet que l'attribut CLONE_NEWCGROUP de clone(2). Departager l'espace de noms cgroup. L'utilisation de CLONE_NEWCGROUP necessite la capacite CAP_SYS_ADMIN. CLONE_NEWIPC (depuis Linux 2.6.19) Cet attribut a le meme 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 privee de l'espace de noms IPC qui ne soit pas partagee avec d'autres processus. L'utilisation de cet attribut implique automatiquement aussi CLONE_SYSVSEM. L'utilisation de CLONE_NEWIPC necessite la capacite CAP_SYS_ADMIN. CLONE_NEWNET (depuis Linux 2.6.24) Cet attribut a le meme effet que l'attribut CLONE_NEWNET de clone(2). Supprimer le partage de l'espace de noms de reseau, afin que le processus appelant soit deplace dans un nouvel espace de noms de reseau qui n'est pas partage avec d'autres processus. CLONE_NEWNET necessite la capacite CAP_SYS_ADMIN. CLONE_NEWNS Cet attribut a le meme 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 privee de son espace de noms qui ne soit pas partagee avec d'autres processus. L'utilisation de cet attribut implique automatiquement aussi CLONE_FS. L'utilisation de CLONE_NEWNS necessite la capacite CAP_SYS_ADMIN. Pour plus d'informations, consultez mount_namespaces(7). CLONE_NEWPID (depuis Linux 3.8) Cet attribut a le meme effet que l'attribut CLONE_NEWNS de clone(2). Supprimr le partage l'espace de noms PID, afin que le processus genere un nouvel espace de noms PID qui ne soit pas partage avec d'autres processus anterieurs et qui sera celui de ses enfants. Le processus appelant ne change pas d'espace de noms. Le premier enfant cree 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 necessite de disposer de la capacite 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 privee de son espace de noms qui ne soit pas partagee avec d'autres processus. Le processus appelant n'est pas deplace dans le nouvel espace de noms. L'utilisation de CLONE_NEWTIME necessite la capacite CAP_SYS_ADMIN. Pour plus d'informations, consultez time_namespaces(7). CLONE_NEWUSER (depuis Linux 3.8) Cet attribut a le meme effet que l'attribut CLONE_NEWUSER de clone(2). Supprimer le partage de l'espace de noms utilisateur, afin que le processus appelant soit deplace dans un nouvel espace de noms utilisateur qui n'est pas partage avec d'autres processus. Comme pour les enfants crees par clone(2) avec l'attribut CLONE_NEWUSER, l'appelant obtient un ensemble complet de capacites dans le nouvel espace de noms. CLONE_NEWUSER necessite que le processus appelant ne soit pas multi-threade ; si CLONE_NEWUSER est specifie, CLONE_THREAD l'est automatiquement. A partir de Linux 3.9, CLONE_NEWUSER implique egalement automatiquement CLONE_FS. CLONE_NEWUSER necessite 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 meme effet que l'attribut CLONE_NEWUTS de clone(2). Departager l'espace de noms IPC UTS, afin que le processus appelant ait une copie privee de l'espace de noms UTS qui ne soit pas partagee avec d'autres processus. L'utilisation de CLONE_NEWUTS necessite la capacite 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 semaphores System V (semadj), afin que le processus appelant ait une nouvelle liste semadj vide qui ne soit partagee avec aucun autre processus. S'il s'agit du dernier processus ayant une reference a la liste (semadj) du processus courant, alors les ajustements de cette liste sont appliques aux semaphores correspondants, tels que decrit dans semop(2). De plus, CLONE_THREAD, CLONE_SIGHAND et CLONE_VM peuvent etre invoques dans flags si l'appelant est mono-threade (c'est-a-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 egalement que specifier CLONE_THREAD implique automatiquement CLONE_VM, et que specifier CLONE_VM implique automatiquement CLONE_SIGHAND. Si le processus est multi-threade, al'utilisation de ces attributs mene a une erreur. Si flags vaut zero, unshare() n'a aucun effet : le contexte d'execution du processus appelant n'est pas modifie. VALEUR RENVOYEE S'il reussit l'appel renvoie zero, sinon il renvoie -1 et errno est defini pour indiquer l'erreur. ERREURS EINVAL Un attribut non autorise est indique dans flags. EINVAL CLONE_THREAD, CLONE_SIGHAND ou CLONE_VM figurait dans flags, et l'appelant etait multi-threade. EINVAL CLONE_NEWIPC a ete specifie dans flags, mais le noyau n'a pas ete configure avec les options CONFIG_SYSVIPC et CONFIG_IPC_NS. EINVAL CLONE_NEWNET a ete specifie dans flags, mais le noyau n'a pas ete configure avec l'option CONFIG_NET_NS. EINVAL CLONE_NEWPID a ete specifie dans le flags, mais le noyau n'a pas ete configure avec l'option CONFIG_PID_NS. EINVAL CLONE_NEWUSER a ete specifie dans flags, mais le noyau n'a pas ete configure avec l'option CONFIG_USER_NS. EINVAL CLONE_NEWUTS a ete specifie dans flags, mais le noyau n'a pas ete configure avec l'option CONFIG_UTS_NS. EINVAL CLONE_NEWPID a ete specifie dans flags, mais le processus a appele auparavant unshare() avec l'attribut CLONE_NEWPID. ENOMEM Impossible d'allouer suffisamment de memoire pour copier les parties du contexte de l'appelant qui doivent etre rendues privees. ENOSPC (depuis Linux 3.7) CLONE_NEWPID a ete specifie dans les attributs et l'appel provoquerait un depassement de la limite du nombre maximal d'espaces de noms utilisateur imbriques. Consultez pid_namespaces(7). ENOSPC (depuis Linux 4.9 ; auparavant EUSERS) CLONE_NEWUSER a ete specifie dans flags et l'appel provoquerait un depassement de la limite du nombre maximal d'espaces de noms utilisateur imbriques. Consultez user_namespaces(7). De Linux 3.11 a Linux 4.8, l'erreur indiquee dans ce cas etait EUSERS. ENOSPC (depuis Linux 4.9) Une des valeurs dans flags indiquait de creer un nouvel espace de noms utilisateur, mais cela aurait provoque un depassement de la limite definie par le fichier correspondant dans /proc/sys/user. Pour plus de details, voir namespaces(7). EPERM Le processus appelant n'avait pas les privileges appropries pour effectuer cette operation. EPERM CLONE_NEWUSER a ete specifie 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 ete specifie dans flags et l'appelant se trouve dans un environnement chroot (c'est-a-dire que le repertoire racine de l'appelant ne correspond pas au repertoire racine de l'espace de noms de montage dans lequel il se trouve). EUSERS (de Linux 3.11 a Linux 4.8) CLONE_NEWUSER a ete specifie dans flags, et l'appel provoquerait un depassement de la limite du nombre maximal d'espaces de noms utilisateur imbriques. Voir le point sur l'erreur ENOSPC ci-dessus. STANDARDS Linux. HISTORIQUE Linux 2.6.16. NOTES Tous les attributs de processus qui peuvent etre partages lorsqu'un processus est cree avec clone(2) ne peuvent pas etre rendus prives avec unshare(). En particulier, dans le noyau 3.8, unshare() n'implemente pas de drapeaux inversant les effets de CLONE_SIGHAND, CLONE_THREAD ou CLONE_VM. Cette fonctionnalite pourra etre ajoutee plus tard si necessaire. La creation de tout type d'espace de noms, a l'exception des noms des espaces de noms utilisateur, requiert la capacite CAP_SYS_ADMIN. Cependant, dans la mesure ou la creation d'un espace de noms utilisateur confere un ensemble complet de capacites, creer a la fois un espace de noms utilisateur et un espace de noms de n'importe quel type dans le meme appel de unshare() ne necessite pas la capacite CAP_SYS_ADMIN dans l'espace de nom d'origine. EXEMPLES Le programme ci-dessous est une implementation simple de la commande unshare(1) qui supprime le partage d'un ou plusieurs espaces de noms et execute la commande fournie en argument. Voici un exemple d'utilisation du programme qui execute un shell dans un nouvel espace de noms de montage, puis verifie que le shell initial et le nouveau shell sont bien dans des espaces de noms de montage separes : $ readlink /proc/$$/ns/mnt mnt:[4026531840] $ sudo ./unshare -m /bin/bash # readlink /proc/$$/ns/mnt mnt:[4026532325] Les deux chaines renvoyees par readlink(1) sont differentes, ce qui montre que les deux shells se trouvent dans des espaces de noms de montage differents. Source du programme /* unshare.c Une implementation simple de la commande unshare(1) : supprimer le partage des espaces de noms et executer une commande. */ #define _GNU_SOURCE #include #include #include #include #include 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 reseau\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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 unshare(2)