.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2019 Michael Kerrisk .\" A very few fragments remain from an earlier page written by .\" Werner Almesberger in 2000 .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PIVOT_ROOT 2 "1 novembre 2020" Linux "Manuel du programmeur Linux" .SH NOM pivot_root \- Modifier le montage racine .SH SYNOPSIS \fBint pivot_root(const char *\fP\fInew_root\fP\fB, const char *\fP\fIput_old\fP\fB);\fP .PP \fINote\fP\ : il n'existe pas d'enveloppe pour cet appel système dans la glibc\ ; voir NOTES. .SH DESCRIPTION \fBpivot_root\fP() modifie le montage racine dans l'espace de noms de montage du processus appelant. Plus précisément, il déplace le montage racine dans le répertoire \fIput_old\fP et il fait de \fInew_root\fP le nouveau montage racine. Le processus appelant doit avoir la capacité \fBCAP_SYS_ADMIN\fP dans l'espace de noms de l'utilisateur à qui appartient l'espace de noms de montage de l'appelant. .PP \fBpivot_root\fP() change le répertoire racine et le répertoire de travail de chaque processus ou de chaque thread du même espace de noms de montage en \fInew_root\fP s'ils pointent vers l'ancien répertoire de montage (voir aussi les NOTES). D'un autre côté, \fBpivot_root\fP() ne modifie pas le répertoire de travail de l'appelant (sauf s'il est sur l'ancien répertoire racine), ainsi, il doit être suivi d'un appel \fBchdir("/")\fP. .PP Les restrictions suivantes s'appliquent\ : .IP \- 3 \fInew_root\fP et \fIput_old\fP doivent être des répertoires. .IP \- \fInew_root\fP et \fIput_old\fP ne doivent pas être sur le même montage que la racine actuelle. .IP \- \fIput_old\fP doit être sur \fInew_root\fP ou un descendant de \fInew_root\fP\ : à savoir qu'ajouter un nombre positif de préfixes «\ \fI/..\fP\ » au chemin vers lequel pointe \fIput_old\fP doit ramener au même répertoire que \fInew_root\fP. .IP \- \fInew_root\fP doit être un chemin vers un point de montage\ ; mais il ne peut pas être «\ /\ ». Un chemin qui n'est pas un point de montage peut le devenir en montant en miroir le point sur lui\-même. .IP \- Le type de propagation du montage parent de \fInew_root\fP et le montage parent du répertoire racine actuel ne doivent pas être \fBMS_SHARED\fP\ ; de même, si \fIput_old\fP est un point de montage existant, son type de propagation ne doit pas être \fBMS_SHARED\fP. Ces restrictions garantissent que \fBpivot_root\fP() ne propage jamais de changement sur un autre espace de noms de montage. .IP \- Le répertoire racine actuel doit être un point de montage. .SH "VALEUR RENVOYÉE" En cas de succès, zéro est renvoyé. En cas d'erreur, \fB\-1\fP est renvoyé et \fIerrno\fP reçoit une valeur adéquate. .SH ERREURS \fBpivot_root\fP() peut échouer avec une des erreurs de \fBstat\fP(2). Il peut aussi échouer avec les erreurs suivantes\ : .TP \fBEBUSY\fP .\" Reconfirmed that the following error occurs on Linux 5.0 by .\" specifying 'new_root' as "/rootfs" and 'put_old' as .\" "/rootfs/oldrootfs", and *not* bind mounting "/rootfs" on top of .\" itself. Of course, this is an odd situation, since a later check .\" in the kernel code will in any case yield EINVAL if 'new_root' is .\" not a mount point. However, when the system call was first added, .\" 'new_root' was not required to be a mount point. So, this .\" error is nowadays probably just the result of crufty accumulation. .\" This error can also occur if we bind mount "/" on top of itself .\" and try to specify "/" as the 'new' (again, an odd situation). So, .\" the EBUSY check in the kernel does still seem necessary to prevent .\" that case. Furthermore, the "or put_old" piece is probably .\" redundant text (although the check is in the kernel), since, .\" in another check, 'put_old' is required to be under 'new_root'. \fInew_root\fP ou \fIput_old\fP est sur le montage racine actuel (cette erreur vaut pour le cas pathologique où \fInew_root\fP est «\ /\ ». .TP \fBEINVAL\fP \fInew_root\fP n'est pas un point de montage. .TP \fBEINVAL\fP \fIput_old\fP n'est pas sur \fInew_root\fP ou un descendant. .TP \fBEINVAL\fP Le répertoire racine actuel n'est pas un point de montage (du fait d'un précédent \fBchroot\fP(2)). .TP \fBEINVAL\fP La racine actuelle est sur le montage rootfs (ramfs initial)\ ; voir les NOTES. .TP \fBEINVAL\fP Soit le point de montage sur \fInew_root\fP, soit le montage parent de ce point de montage, a un type de propagation \fBMS_SHARED\fP. .TP \fBEINVAL\fP \fIput_old\fP est un point de montage et il a le type de propagation \fBMS_SHARED\fP. .TP \fBENOTDIR\fP \fInew_root\fP ou \fIput_old\fP n'est pas un répertoire. .TP \fBEPERM\fP Le processus appelant n'a pas la capacité \fBCAP_SYS_ADMIN\fP. .SH VERSIONS \fBpivot_root\fP() a été introduit dans Linux\ 2.3.41. .SH CONFORMITÉ \fBpivot_root\fP() est spécifique à Linux et donc non portable. .SH NOTES La glibc ne fournit pas de fonction autour de cet appel système\ ; appelez\-le avec \fBsyscall\fP(2). .PP Une interface en ligne de commande pour cet appel système est fournie par \fBpivot_root\fP(8). .PP \fBpivot_root\fP() permet à un appelant de passer à un nouveau système de fichiers racine tout en mettant l'ancien montage racine dans \fInew_root\fP, d'où il peut être démonté (le fait de déplacer tous les processus ayant un répertoire racine ou actuel dans le répertoire racine vers une nouvelle racine libère l'ancienne racine des utilisateurs, permettant de démonter plus facilement l'ancien montage racine). .PP L'utilisation typique de \fBpivot_root\fP() est durant le démarrage du système, lorsque le système monte un système de fichiers temporaire (par exemple un \fBinitrd\fP(4)) puis monte le véritable système de fichiers et le transforme éventuellement en racine pour tous les processus et threads concernés. Une utilisation moderne consiste à définir un système de fichiers racine pendant la création d'un conteneur. .PP Le fait que \fBpivot_root\fP() modifie les répertoires racine et de travail du processus comme indiqué dans la DESCRIPTION est nécessaire afin d'empêcher les threads du noyau d'occuper l'ancien montage racine avec leurs répertoires racine et de travail, même s'ils n'accèdent jamais au système de fichiers en aucune manière. .PP .\" Le rootfs (initial ramfs) ne peut pas être \fBpivot_root\fP()é. La méthode recommandée pour modifier le système de fichiers racine dans ce cas consiste à tout effacer sur le rootfs, monter par\-dessus la nouvelle racine, rattacher \fIstdin\fP/\fIstdout\fP/\fIstderr\fP au nouveau \fI/dev/console\fP et exécuter le nouvel \fBinit\fP(1). Il existe des programmes d'aide pour ce processus\ ; voir \fBswitch_root\fP(8). .SS "pivot_root(\(dq.\(dq, \(dq.\(dq)" \fInew_root\fP et \fIput_old\fP peuvent être le même répertoire. En particulier, la séquence suivante permet une opération pivot\-root sans devoir créer et supprimer un répertoire temporaire\ : .PP .in +4n .EX chdir(new_root); pivot_root(".", "."); umount2(".", MNT_DETACH); .EE .in .PP .\" Cette séquence réussit parce que l'appel \fBpivot_root\fP() place le point de montage racine au sommet du nouveau point de montage racine sur \fI/\fP. Alors, le répertoire racine et celui de travail du processus appelant se rapportent au nouveau point de montage racine (\fInew_root\fP). Lors de l'appel \fBumount\fP() suivant, la résolution de \fI"."\fP commence par \fInew_root\fP puis monte la liste des points de montage empilés dans \fI/\fP, d'où il résulte que l'ancien point de montage est démonté. .SS "Remarques historiques" Pendant de nombreuses années, cette page de manuel comportait le texte suivant\ : .RS .PP \fBpivot_root\fP() peut changer ou non les répertoires racine et de travail en cours de tous les processus et threads qui utilisaient l'ancien répertoire racine. L'appelant de \fBpivot_root\fP() doit s'assurer que les processus ayant pour racine ou répertoire de travail l'ancien répertoire se comportent correctement. Le meilleur moyen est de modifier leur répertoire de travail et répertoire racine pour \fInew_root\fP avant d'invoquer \fBpivot_root\fP(). .RE .PP Ce texte, écrit avant même la finalisation de l'implémentation de l'appel système dans le noyau, visait sans doute à avertir les utilisateurs à ce moment là que l'implémentation pourrait changer avant la publication définitive. Toutefois, le comportement indiqué dans DESCRIPTION est resté valable depuis la première implémentation de cet appel système et il ne changera pas maintenant. .SH EXEMPLES .\" FIXME .\" Would it be better, because simpler, to use unshare(2) .\" rather than clone(2) in the example below? Le programme ci\-dessous montre l'utilisation de \fBpivot_root\fP() dans un espace de noms de montage créé en utilisant \fBclone\fP(2). Après avoir changé le répertoire racine appelé dans le premier paramètre de la ligne de commande du programme, l'enfant créé par \fBclone\fP(2) exécute alors le programme nommé dans les autres paramètres de la ligne de commande. .PP Nous montrons le programme en créant un répertoire qui servira de nouveau système de fichiers racine et en mettant une copie de l'exécutable \fBbusybox\fP(1) (liée statiquement) dans ce répertoire. .PP .in +4n .EX $ \fBmkdir /tmp/rootfs\fP $ \fBls \-id /tmp/rootfs\fP # Numéro d’inœud dans le nouveau répertoire racine 319459 /tmp/rootfs $ \fBcp $(which busybox) /tmp/rootfs\fP $ \fBPS1=\(aqbbsh$ \(aq sudo ./pivot_root_demo /tmp/rootfs /busybox sh\fP bbsh$ \fBPATH=/\fP bbsh$ \fBbusybox ln busybox ln\fP bbsh$ \fBln busybox echo\fP bbsh$ \fBln busybox ls\fP bbsh$ \fBls\fP busybox echo ln ls bbsh$ \fBls \-id /\fP # Comparaison avec le numéro d’inœud au\-dessus 319459 / bbsh$ \fBecho \(aqhello world\(aq\fP hello world .EE .in .SS "Source du programme" \& .PP .EX /* pivot_root_demo.c */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e } while (0) static int pivot_root(const char *new_root, const char *put_old) { return syscall(SYS_pivot_root, new_root, put_old); } #define STACK_SIZE (1024 * 1024) static int /* Fonction de démarrage pour l’enfant cloné */ child(void *arg) { char **args = arg; char *new_root = args[0]; const char *put_old = "/oldrootfs"; char path[PATH_MAX]; /* S'assurer que \(aqnew_root\(aq et son point de montage parent n’aient pas une propagation partagée (ce qui ferait renvoyer une erreur à pivot_root()) et empêcher la propagation des événements de montage dans l'espace de noms de montage initial */ if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL) == \-1) errExit("mount\-MS_PRIVATE"); /* S'assurer que \(aqnew_root\(aq soit un point de montage */ if (mount(new_root, new_root, NULL, MS_BIND, NULL) == \-1) errExit("mount\-MS_BIND"); /* Créer le répertoire où l'ancienne racine sera envoyée */ snprintf(path, sizeof(path), "%s/%s", new_root, put_old); if (mkdir(path, 0777) == \-1) errExit("mkdir"); /* Et changer de système de fichiers racine */ if (pivot_root(new_root, path) == \-1) errExit("pivot_root"); /* Déplacer le répertoire de travail dans "/" */ if (chdir("/") == \-1) errExit("chdir"); /* Démonter l'ancienne racine et supprimer le point de montage */ if (umount2(put_old, MNT_DETACH) == \-1) perror("umount2"); if (rmdir(put_old) == \-1) perror("rmdir"); /* Exécuter la commande indiquée dans argv[1]... */ execv(args[1], &args[1]); errExit("execv"); } int main(int argc, char *argv[]) { /* Créer un processus enfant dans un nouvel espace de noms de montage */ char *stack = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, \-1, 0); if (stack == MAP_FAILED) errExit("mmap"); if (clone(child, stack + STACK_SIZE, CLONE_NEWNS | SIGCHLD, &argv[1]) == \-1) errExit("clone"); /* Le parent arrive ici\ ; attendre l'enfant */ if (wait(NULL) == \-1) errExit("wait"); exit(EXIT_SUCCESS); } .EE .SH "VOIR AUSSI" \fBchdir\fP(2), \fBchroot\fP(2), \fBmount\fP(2), \fBstat\fP(2), \fBinitrd\fP(4), \fBmount_namespaces\fP(7), \fBpivot_root\fP(8), \fBswitch_root\fP(8) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP 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/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .