ioctl_ns(2) System Calls Manual ioctl_ns(2) NOM ioctl_ns - operations ioctl() pour les espaces de noms Linux DESCRIPTION Recherche des relations entre les espaces de noms Les operations 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 operations renvoient un nouveau descripteur de fichier en cas de succes. NS_GET_USERNS (depuis Linux 4.9) Renvoie un descripteur de fichier qui se rapporte a l'espace de noms de l'utilisateur proprietaire pour l'espace de noms auquel renvoie fd. NS_GET_PARENT (depuis Linux 4.9) Renvoie un descripteur de fichier qui se rapporte a l'espace de noms parent de l'espace auquel renvoie fd. Cette operation n'est valable que pour des espaces de noms hierarchiques (a 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 renvoye par ces operations est ouvert avec les attributs O_RDONLY et O_CLOEXEC (close-on-exec ; voir fcntl(2)). En appliquant fstat(2) au descripteur de fichier renvoye, vous obtenez une structure stat ou les champs st_dev (le peripherique resident) et st_ino (le numero d'inoeud) identifient a la fois l'espace de noms du proprietaire et du parent. Ce numero d'inoeud peut etre mis en correspondance avec le numero d'inoeud d'un autre fichier /proc/pid/ns/{pid,user} pour savoir s'il s'agit de l'espace de noms du proprietaire ou du parent. Chacune de ces operations ioctl(2) peut echouer avec les erreurs suivantes : EPERM L'espace de noms demande va au-dela de la cible de l'espace de noms de l'appelant. Cette erreur peut arriver si, par exemple, l'espace de noms du proprietaire est un ancetre 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'operation n'est pas prise en charge par cette version du noyau. De plus, l'operation NS_GET_PARENT peut echouer avec l'erreur suivante : EINVAL fd se rapporte a un espace de noms non hierarchique. Voir la section EXEMPLE pour un exemple d'utilisation de ces operations. Recherche du type d'espace de noms L'operation NS_GET_NSTYPE (disponible depuis Linux 4.11) peut etre utilisee pour rechercher le type d'espace de noms auquel se rapporte le descripteur de fichier fd : nstype = ioctl(fd, NS_GET_NSTYPE); fd renvoie a un fichier /proc/pid/ns/*. La valeur de renvoi est une des valeurs de CLONE_NEW*, qui peut etre indiquee a clone(2) ou a unshare(2) afin de creer un espace de noms. Rechercher le proprietaire d'un espace de noms utilisateur L'operation NS_GET_OWNER_UID (disponible depuis Linux 4.11) peut etre utilisee pour rechercher l'identifiant de l'utilisateur proprietaire d'un espace de noms utilisateur (c'est-a-dire l'identifiant de l'utilisateur reel du processus qui a cree l'espace de noms utilisateur). La forme de l'appel est : uid_t uid; ioctl(fd, NS_GET_OWNER_UID, &uid); fd renvoie a un fichier /proc/pid/ns/user. L'identifiant de l'utilisateur proprietaire est renvoye dans l'uid_t vers lequel pointe le troisieme parametre. Cette operation peut echouer avec l'erreur suivante : EINVAL fd ne se rapporte pas a un espace de noms utilisateur. ERREURS Chacune des operations ioctl() ci-dessus peut renvoyer les erreurs suivantes : ENOTTY fd ne renvoie pas a un fichier /proc/pid/ns/*. STANDARDS Linux. EXEMPLES L'exemple presente ci-dessous utilise les operations ioctl(2) decrites ci-dessus pour effectuer une simple recherche de relations entre espaces de noms. Les sessions d'interpreteur 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 echoue, car il n'a pas de parent : $ ./ns_show /proc/self/ns/user p L'espace de noms du parent depasse la cible de votre espace utilisateur Creer un processus qui execute sleep(1) dans les nouveaux espaces de noms de l'utilisateur et UTS, et indiquer que le nouvel espace de noms UTS est associe au nouvel espace de noms de l'utilisateur : $ unshare -Uu sleep 1000 & [1] 23235 $ ./ns_show /proc/23235/ns/uts u Le peripherique/inoeud de l'espace de noms de l'utilisateur proprietaire 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 precedent 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 peripherique/inoeud de l'espace de noms parent est : [0,3] / 4026531837 Demarrer un interpreteur de commandes dans un nouvel espace de noms utilisateur et indiquer que depuis cet interpreteur, l'espace de noms parent de l'utilisateur n'a pas pu etre trouve. De meme, l'espace de nom UTS (qui est associe a l'espace de noms utilisateur initial) n'a pas pu etre trouve. $ PS1="sh2$ " unshare -U bash sh2$ ./ns_show /proc/self/ns/user p L'espace de noms parent depasse la cible de votre espace de noms sh2$ ./ns_show /proc/self/ns/uts u L'espace de noms de l'utilisateur proprietaire depasse la cible de votre espace de noms Source du programme /* ns_show.c Sous licence GNU General Public v2 ou superieure. */ #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd, userns_fd, parent_fd; struct stat sb; if (argc < 2) { fprintf(stderr, "Usage: %s /proc/[pid]/ns/[file] [p|u]\n", argv[0]); fprintf(stderr, "\nAfficher le resultat d'un ou plusieurs des " "NS_GET_USERNS (u) ou NS_GET_PARENT (p)\n" "pour le /proc/[pid]/ns/[file] indique. Si ni " "'p' ni 'u' ne sont indiques,\n" "NS_GET_USERNS l'est par defaut.\n"); exit(EXIT_FAILURE); } /* Obtenir un descripteur de fichier pour le fichier 'ns' indique dans argv[1]. */ in argv[1]. */ fd = open(argv[1], O_RDONLY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } /* Obtenir un descripteur de fichier pour l'espace de noms de l'utilisateur proprietaire et obtenir et afficher le numero d'inoeud de cet espace de noms. */ 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 proprietaire depasse " "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 peripherique/inoeud de l'espace de noms de l'utilisateur proprietaire est : " "[%x,%x] / %ju\n", major(sb.st_dev), minor(sb.st_dev), (uintmax_t) sb.st_ino); close(userns_fd); } /* Obtenir un descripteur de fichier pour l'espace de noms parent et obtenir et afficher le numero d'inoeud de cet espace de noms. */ 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 parent d'un " "espace de noms non hierarchique\n"); else if (errno == EPERM) printf("L'espace de noms parent depasse " "la cible de votre espace de noms\n"); else perror("ioctl-NS_GET_PARENT"); exit(EXIT_FAILURE); } if (fstat(parent_fd, &sb) == -1) { perror("fstat-parentns"); exit(EXIT_FAILURE); } printf("Le peripherique/inoeud de l'espace de noms parent est : [%x,%x] / %ju\n", major(sb.st_dev), 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) 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 et Jean-Philippe MENGUAL 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 ioctl_ns(2)