Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       ioctl_ns - opérations ioctl() pour les espaces de noms Linux

DESCRIPTION

   Recherche des relations entre les espaces de noms
       Les  opérations  ioctl(2) suivantes sont fournies pour permettre la recherche de relations
       entre espaces de noms (voir user_namespaces(7) et pid_namespaces(7)). La forme des  appels
       est :

           new_fd = ioctl(fd, request);

       Dans  tous  les cas, fd renvoie au fichier /proc/[pid]/ns/*. Les deux opérations renvoient
       un nouveau descripteur de fichier en cas de succès.

       NS_GET_USERNS (depuis Linux 4.9)
              Renvoie  un  descripteur  de  fichier  qui  se  rapporte  à  l'espace  de  noms  de
              l'utilisateur propriétaire pour l'espace de noms auquel renvoie fd.

       NS_GET_PARENT (depuis Linux 4.9)
              Renvoie  un  descripteur  de  fichier  qui se rapporte à l'espace de noms parent de
              l'espace auquel renvoie fd. Cette opération n'est valable que pour des  espaces  de
              noms hiérarchiques (à savoir les espaces de noms de PID et d'utilisateur). Pour les
              espaces de noms utilisateur, NS_GET_PARENT est synonyme de NS_GET_USERNS.

       Le nouveau descripteur de fichier renvoyé par ces opérations est ouvert avec les attributs
       O_RDONLY et O_CLOEXEC (close-on-exec ; voir fcntl(2)).

       En  appliquant fstat(2) au descripteur de fichier renvoyé, vous obtenez une structure stat
       où les champs st_dev (le périphérique résident) et st_ino (le numéro d'inœud)  identifient
       à  la  fois l'espace de noms du propriétaire et du parent. Ce numéro d'inœud peut être mis
       en correspondance avec le numéro d'inœud d'un autre fichier /proc/[pid]/ns/{pid,user} pour
       savoir s'il s'agit de l'espace de noms du propriétaire ou du parent.

       Chacune de ces opérations ioctl(2) peut échouer avec les erreurs suivantes :

       EPERM  L'espace  de noms demandé va au-delà de la cible de l'espace de noms de l'appelant.
              Cette erreur peut arriver si, par exemple, l'espace de noms du propriétaire est  un
              ancêtre  de l'espace de noms de l'utilisateur actuel de l'appelant. Elle peut aussi
              survenir  en  cas  de  tentative  d'obtenir  le  parent  de  l'espace  de  noms  de
              l'utilisateur initial ou du PID.

       ENOTTY L'opération n'est pas prise en charge par cette version du noyau.

       De plus, l'opération NS_GET_PARENT peut échouer avec l'erreur suivante :

       EINVAL fd se rapporte à un espace de noms non hiérarchique.

       Voir la section EXEMPLE pour un exemple d'utilisation de ces opérations.

   Recherche du type d'espace de noms
       L'opération   NS_GET_NSTYPE   (disponible  depuis  Linux 4.11)  peut  être  utilisée  pour
       rechercher le type d'espace de noms auquel se rapporte le descripteur de fichier fd :

           nstype = ioctl(fd, NS_GET_NSTYPE);

       fd renvoie à un fichier /proc/[pid]/ns/*.

       La valeur de renvoi est une des valeurs de CLONE_NEW*, qui peut être indiquée  à  clone(2)
       ou à unshare(2) afin de créer un espace de noms.

   Rechercher le propriétaire d'un espace de noms utilisateur
       L'opération  NS_GET_OWNER_UID  (disponible  depuis  Linux 4.11)  peut  être  utilisée pour
       rechercher l'identifiant de l'utilisateur propriétaire d'un  espace  de  noms  utilisateur
       (c'est-à-dire l'identifiant de l'utilisateur réel du processus qui a créé l'espace de noms
       utilisateur). La forme de l'appel est :

           uid_t uid;
           ioctl(fd, NS_GET_OWNER_UID, &uid);

       fd renvoie à un fichier /proc/[pid]/ns/user.

       L'identifiant de l'utilisateur propriétaire est renvoyé dans l'uid_t vers lequel pointe le
       troisième paramètre.

       Cette opération peut échouer avec l'erreur suivante :

       EINVAL fd ne se rapporte pas à un espace de noms utilisateur.

ERREURS

       Chacune des opérations ioctl() ci-dessus peut renvoyer les erreurs suivantes :

       ENOTTY fd ne renvoie pas à un fichier /proc/[pid]/ns/*.

CONFORMITÉ

       Les espaces de noms et les opérations décrits sur cette page sont spécifiques à Linux.

EXEMPLES

       L'exemple  présenté  ci-dessous  utilise  les  opérations ioctl(2) décrites ci-dessus pour
       effectuer  une  simple  recherche  de  relations  entre  espaces  de  noms.  Les  sessions
       d'interpréteur  de  commandes  suivantes  montrent  divers exemples de l'utilisation de ce
       programme.

       L'essai pour obtenir le parent de l'espace de noms utilisateur initial échoue, car il  n'a
       pas de parent :

           $ ./ns_show /proc/self/ns/user p
           L'espace de noms du parent dépasse la cible de votre espace utilisateur

       Créer un processus qui exécute sleep(1) dans les nouveaux espaces de noms de l'utilisateur
       et UTS, et indiquer que le nouvel espace de noms UTS est associé au nouvel espace de  noms
       de l'utilisateur :

           $ unshare -Uu sleep 1000 &
           [1] 23235
           $ ./ns_show /proc/23235/ns/uts u
           Le périphérique/inœud de l'espace de noms de l'utilisateur propriétaire
           est : [0,3] / 4026532448
           $ readlink /proc/23235/ns/user
           utilisateur :[4026532448]

       Puis  indiquer  que  le parent du nouvel espace de noms utilisateur de l'exemple précédent
       est dans l'espace de noms de l'utilisateur initial :

           $ readlink /proc/self/ns/user
           utilisateur:[4026531837]
           $ ./ns_show /proc/23235/ns/user p
           Le périphérique/inœud de l'espace de noms parent est : [0,3] / 4026531837

       Démarrer un interpréteur de commandes  dans  un  nouvel  espace  de  noms  utilisateur  et
       indiquer  que depuis cet interpréteur, l'espace de noms parent de l'utilisateur n'a pas pu
       être trouvé. De même, l'espace de nom UTS (qui est associé à l'espace de noms  utilisateur
       initial) n'a pas pu être trouvé.

           $ PS1="sh2$ " unshare -U bash
           sh2$ ./ns_show /proc/self/ns/user p
           L'espace de noms parent dépasse la cible de votre espace de noms
           sh2$ ./ns_show /proc/self/ns/uts u
           L'espace de noms de l'utilisateur propriétaire dépasse la cible de votre espace de noms

   Source du programme

       /* ns_show.c

          Sous licence GNU General Public v2 ou supérieure.
       */
       #include <stdint.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <stdio.h>
       #include <fcntl.h>
       #include <string.h>
       #include <sys/stat.h>
       #include <sys/ioctl.h>
       #include <errno.h>
       #include <sys/sysmacros.h>

       #ifndef NS_GET_USERNS
       #define NSIO    0xb7
       #define NS_GET_USERNS   _IO(NSIO, 0x1)
       #define NS_GET_PARENT   _IO(NSIO, 0x2)
       #endif

       int
       main(int argc, char *argv[])
       {
           int fd, userns_fd, parent_fd;
           struct stat sb;

           if (argc < 2) {
               fprintf(stderr, "Utilisation : %s /proc/[pid]/ns/[file] [p|u]\n",
                       argv[0]);
               fprintf(stderr, "\nAfficher le résultat d'un ou plusieurs des "
                       "NS_GET_USERNS (u) ou NS_GET_PARENT (p)\n"
                       "pour le /proc/[pid]/ns/[file] indiqué. Si ni "
                       "'p' ni 'u' ne sont indiqués,\n"
                       "NS_GET_USERNS l'est par défaut.\n");
               exit(EXIT_FAILURE);
           }

           /* Obtain a file descriptor for the 'ns' file specified
              in argv[1]. */

           fd = open(argv[1], O_RDONLY);
           if (fd == -1) {
               perror("open");
               exit(EXIT_FAILURE);
           }

           /* Obtain a file descriptor for the owning user namespace and
              then obtain and display the inode number of that namespace. */

           if (argc < 3 || strchr(argv[2], 'u')) {
               userns_fd = ioctl(fd, NS_GET_USERNS);

               if (userns_fd == -1) {
                   if (errno == EPERM)
                       printf("L'espace de noms de l'utilisateur propriétaire dépasse "
                               "la cible de votre espace de noms\n");
                   else
                      perror("ioctl-NS_GET_USERNS");
                   exit(EXIT_FAILURE);
                }

               if (fstat(userns_fd, &sb) == -1) {
                   perror("fstat-userns");
                   exit(EXIT_FAILURE);
               }
               printf("Le périphérique/inœud de l'espace de noms de l'utilisateur propriétaire est : "
                       "[%jx,%jx] / %ju\n",
                       (uintmax_t) major(sb.st_dev),
                       (uintmax_t) minor(sb.st_dev),
                       (uintmax_t) sb.st_ino);

               close(userns_fd);
            }

           /* Obtain a file descriptor for the parent namespace and
              then obtain and display the inode number of that namespace. */

           if (argc > 2 && strchr(argv[2], 'p')) {
               parent_fd = ioctl(fd, NS_GET_PARENT);

               if (parent_fd == -1) {
                   if (errno == EINVAL)
                       printf("Ne peut pas obtenir l'espace de noms utilisateur d'un "
                               "espace de noms non hiérarchique\n");
                   else if (errno == EPERM)
                       printf("L'espace de noms parent dépasse "
                               "la cible de votre espace utilisateur\n");
                   else
                       perror("ioctl-NS_GET_PARENT");
                   exit(EXIT_FAILURE);
               }

               if (fstat(parent_fd, &sb) == -1) {
                   perror("fstat-parentns");
                   exit(EXIT_FAILURE);
               }
               printf("Le périphérique/inœud de l'espace de noms utilisateur parent est : [%jx,%jx] / %ju\n",
                       (uintmax_t) major(sb.st_dev),
                       (uintmax_t) minor(sb.st_dev),
                       (uintmax_t) sb.st_ino);

               close(parent_fd);
           }

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       fstat(2), ioctl(2), proc(5), namespaces(7)

COLOPHON

       Cette  page  fait partie de la publication 5.13 du projet man-pages Linux. Une description
       du projet et des instructions pour signaler des anomalies et la dernière version de  cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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>  et  Jean-Philippe  MENGUAL
       <jpmengual@debian.org>

       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⟩.