dwww Home | Manual pages | Find package

unshare(2)                    System Calls Manual                   unshare(2)

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 cer-
       taines parties de son contexte d'exécution qui sont actuellement parta-
       gées  avec  d'autres  processus  (ou  d'autres  threads). Une partie du
       contexte d'exécution, comme l'espace de noms de montage, est implicite-
       ment  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 nou-
       veau 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). Suppri-
              mer le partage de la table des descripteurs de fichier, afin que
              le processus appelant ne partage plus ses  descripteurs  de  fi-
              chier 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  pro-
              cessus   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'utilisa-
              tion  de cet attribut implique automatiquement aussi CLONE_SYSV-
              SEM.  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 es-
              pace de noms de réseau qui n'est pas partagé avec d'autres  pro-
              cessus. 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 es-
              pace 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_names-
              paces(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'utilisa-
              tion de  CLONE_NEWPID  nécessite  de  disposer  de  la  capacité
              CAP_SYS_ADMIN.  Pour  plus  d'informations, consultez pid_names-
              paces(7).

       CLONE_NEWTIME (depuis Linux 5.6)
              Supprimer le partage de l'espace de noms temps, afin que le pro-
              cessus  appelant  ait une copie privée de son espace de noms qui
              ne soit pas partagée avec d'autres processus. Le processus appe-
              lant n'est pas déplacé dans le nouvel espace de noms. L'utilisa-
              tion 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 es-
              pace de noms utilisateur qui n'est  pas  partagé  avec  d'autres
              processus.  Comme pour les enfants créés par clone(2) avec l'at-
              tribut 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 im-
              plique également automatiquement CLONE_FS. CLONE_NEWUSER  néces-
              site que les identifiants utilisateur et groupe du processus ap-
              pelant 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  utili-
              sateur, 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  pro-
              cessus 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 corres-
              pondants, 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éci-
       fier 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  ap-
              pelé 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  pri-
              vées.

       ENOSPC (depuis Linux 3.7)
              CLONE_NEWPID a été spécifié dans les attributs et l'appel provo-
              querait 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 uti-
              lisateur effectif ou l'identifiant de groupe effectif de l'appe-
              lant 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 ra-
              cine  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-des-
              sus.

VERSIONS
       L'appel système unshare() est apparu dans Linux 2.6.16.

STANDARDS
       L'appel système unshare() est spécifique à Linux.

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éces-
       saire.

       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. Cepen-
       dant, 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 mon-
       tage, 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 mon-
       tage 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), names-
       paces(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 Chris-
       tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <ste-
       phan.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.cou-
       lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>,  Thomas  Huriaux
       <thomas.huriaux@gmail.com>,  Nicolas François <nicolas.francois@centra-
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon  Paillard  <si-
       mon.paillard@resel.enst-bretagne.fr>,    Denis   Barbier   <barbier@de-
       bian.org>, David Prévot  <david@tilapin.org>,  Cédric  Boutillier  <ce-
       dric.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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.

Pages du manuel de Linux 6.03   5 février 2023                      unshare(2)

Generated by dwww version 1.15 on Sat Jun 29 01:42:05 CEST 2024.