Provided by: manpages-fr_4.26.0-1_all bug

NOM

       mount_namespaces – Aperçu des espaces de noms montage de Linux

DESCRIPTION

       Pour une présentation générale des espaces de noms, consultez namespaces(7).

       Les  espaces  de noms montage permettent d'isoler la liste des montages vus par les processus dans chaque
       instance d’espace de noms. Ainsi, les processus dans chacune  des  instances  d’espace  de  noms  montage
       verront les hiérarchies distinctes d’un répertoire unique.

       Les  vues  fournies par les fichiers /proc/pid/mounts, /proc/pid/mountinfo, et /proc/pid/mountstats (tous
       décrits dans proc(5)) correspondent à l’espace de noms montage dans lequel le processus avec le  PID  pid
       réside (tous les processus dans le même espace de noms montage voient la même chose dans ces fichiers).

       Un  nouvel  espace  de  noms  montage  est  créé en utilisant soit clone(2) ou unshare(2) avec l’attribut
       CLONE_NEWNS. Quand un nouvel espace de noms montage est créé, sa liste de montages est initialisée  comme
       suit :

       -  si  l’espace  de  noms  est  créé  en  utilisant clone(2), la liste de montages de l’espace de noms de
          l’enfant est une copie de la liste de montages dans l’espace de noms montage du processus parent ;

       -  si l’espace de noms est créé en utilisant unshare(2), la liste de montages est une copie de  la  liste
          de montages dans l’espace de noms montage précédent de l’appelant.

       Des  modifications ultérieures de la liste de montages (mount(2) et umount(2)) dans chaque espace de noms
       montage n’affecteront pas (par défaut) la liste de montages vue dans l’autre espace de  noms  (mais  voir
       les explications ci-après sur les sous-arbres partagés).

SOUS-ARBRES PARTAGÉS

       Une  fois l’implémentation des espaces de noms montage terminée, l’expérience a montré que, dans certains
       cas, l’isolation qu’ils fournissaient était trop importante. Par exemple, pour rendre un  nouveau  disque
       optique  nouvellement  chargé  disponible dans tous les espaces de noms montage, une opération de montage
       était requise pour chaque espace de  noms.  Pour  un  tel  cas  d’utilisation,  et  quelques  autres,  la
       fonctionnalité  sous-arbre  partagé  a  été introduite dans Linux 2.6.15. Cette fonctionnalité permet une
       propagation automatique et contrôlée des évènements mount(2) et umount(2) entre espaces de noms (ou, plus
       précisément, entre les montages qui sont membres d’un groupe de pairs qui propagent  les  évènements  des
       uns aux autres).

       Chaque montage est marqué (à l’aide de mount(2)) comme ayant un des types de propagation suivants :

       MS_SHARED
              Ce  montage  partage les évènements avec les membres d’un groupe de pairs. Les évènements mount(2)
              et umount(2) immédiatement sous ce montage se  propageront  vers  les  autres  montages  qui  sont
              membres du groupe de pairs. Propagation signifie ici que le même mount(2) ou umount(2) se produira
              automatiquement sous tous les autres montages dans le groupe de pairs. Inversement, les évènements
              mount(2) et umount(2) qui se produiront sous des montages de pair se propageront vers ce montage.

       MS_PRIVATE
              Ce  montage  est privé, il ne possède pas de groupe de pairs. Les évènements mount(2) et umount(2)
              ne se propageront pas vers ou hors de ce montage.

       MS_SLAVE
              Les évènements mount(2) et umount(2) se propageront dans ce montage à partir d’un groupe de  pairs
              partagé  (maître). Les évènements mount(2) et umount(2) sous ce montage ne se propagent vers aucun
              pair.

              Il est à remarquer qu’un montage peut être l’esclave d’un autre groupe de pairs tout en partageant
              en même temps des évènements mount(2) et umount(2) avec un groupe de  pairs  dont  il  est  membre
              (plus précisément, un groupe de pairs peut être l’esclave d’un autre groupe de pairs).

       MS_UNBINDABLE
              Identique  à  un  montage  privé  ; de plus, ce montage ne peut être monté lié (montage bind). Les
              essais de monter lié ce montage (mount(2) avec l’attribut MS_BIND) échoueront.

              Quand un montage bind récursif (mount(2) avec les attributs MS_BIND et MS_REC) est réalisé dans un
              sous-arbre de répertoire,  tout  montage  bind  dans  le  sous-arbre  est  automatiquement  élagué
              (c’est-à-dire,  pas  répliqué) lors de la réplication de ce sous-arbre pour produire le sous-arbre
              cible.

       Pour des explications sur le type de propagation assigné à  un  nouveau  montage,  consulter  la  section
       NOTES.

       Le  type  de  propagation  est un réglage spécifique à chaque point de montage. Certains montages peuvent
       être marqués comme partagés (chaque montage partagé étant un membre d’un groupe de pairs distinct) tandis
       que d’autres sont privés (ou esclaves ou non liables).

       Il est à noter que le type de propagation d’un montage détermine si les mount(2) et umount(2) de montages
       immédiatement sous le montage sont propagées. Par conséquent, le type de  propagation  n’affecte  pas  la
       propagation  d’évènements pour les petits-enfants et les futurs montages de descendants supprimés. Ce qui
       se passe si le montage lui-même est démonté dépend du type de propagation en vigueur pour  le  parent  du
       montage.

       Des membres sont ajoutés à un groupe de pairs quand un montage est marqué comme partagé et soit :

       (a)  le montage est répliqué pendant la création d’un nouvel espace de noms montage ;

       (b)  un nouveau montage bind est créé à partir du montage.

       Dans les deux cas, le nouveau montage rejoint le groupe de pairs dont le montage existant est membre.

       Un  nouveau  groupe  de  pairs  est  aussi créé quand un montage enfant est créé sous un montage existant
       marqué comme partagé. Dans ce cas, le nouveau montage enfant est aussi marqué comme partagé et le nouveau
       groupe de pairs résultant est constitué de tous les montages  qui  sont  répliqués  sous  les  pairs  des
       montages parents.

       Un  montage  cesse d’être membre d’un groupe de pairs quand le montage est explicitement démonté ou quand
       le montage est implicitement démonté parce qu’un espace de noms montage est  supprimé  (parce  qu’il  n’a
       plus de processus membre).

       Le  type de propagation des montages dans l’espace de noms montage peut être obtenu à l’aide des « champs
       facultatifs » exposés dans /proc/pid/mountinfo (consulter proc(5) pour plus de détails sur  ce  fichier).
       Les  étiquettes  suivantes  peuvent  apparaitre  dans ces champs facultatifs pour un enregistrement de ce
       fichier :

       shared:X
              Ce montage est partagé dans le groupe de pairs X. Chaque groupe de pairs a un ID  unique  qui  est
              automatiquement  géré  par le noyau, et tous les montages dans le même groupe de pairs afficheront
              le même ID (ces ID sont assignés en partant de la valeur 1  et  peuvent  être  recyclés  quand  un
              groupe de pairs n’a plus aucun membre).

       master:X
              Ce montage est un esclave du groupe de pairs X partagé.

       propagate_from:X (depuis Linux 2.6.26)
              Ce montage est un esclave et reçoit des propagations du groupe de pairs X partagé. Cette étiquette
              apparaitra  toujours en conjonction avec l’étiquette master:X. Ici, X est le plus proche groupe de
              pairs dominant sous le répertoire racine du processus. Si X est le maitre immédiat du  montage  ou
              s’il  n’existe  aucun  groupe  de  pairs  dominant sous la même racine, seul le champ master:X est
              présent, alors que le champ propagate_from:X est absent. Pour plus de détails, voir ci-après.

       unbindable
              Ce montage ne peut être lié (bind).

       Si aucune de ces étiquettes n’est présente, alors c’est un montage privé.

   Exemples pour MS_SHARED et MS_PRIVATE
       En supposant que dans un terminal dans l’espace de noms montage initial, un  montage  soit  marqué  comme
       partagé (mntS) et un autre privé (mntP), et en affichant les montages dans /proc/self/mountinfo :

           sh1# mount --make-shared /mntS
           sh1# mount --make-private /mntP
           sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           77 61 8:17 / /mntS rw,relatime shared:1
           83 61 8:15 / /mntP rw,relatime

       Dans  la  sortie /proc/self/mountinfo, on voit que /mntS est un montage partagé dans le groupe de pairs 1
       et que /mntP n’a pas d’étiquette facultative, indiquant que c’est un montage  privé.  Les  deux  premiers
       champs  de  chaque  enregistrement dans ce fichier sont l’ID unique pour ce montage et l’ID de montage du
       montage parent. Ce fichier peut être inspecté ultérieurement pour vérifier que le montage parent de /mntS
       et /mntP est le répertoire racine /, qui est monté comme privé :

           sh1# cat /proc/self/mountinfo | awk '$1 == 61' | sed 's/ - .*//'
           61 0 8:2 / / rw,relatime

       Dans un second terminal, créons un nouvel espace de noms montage où un deuxième interpréteur est  exécuté
       et inspectons les montages :

           $ PS1='sh2# ' sudo unshare -m --propagation unchanged sh
           sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           222 145 8:17 / /mntS rw,relatime shared:1
           225 145 8:15 / /mntP rw,relatime

       Le  nouvel  espace  de  noms montage reçoit une copie des montages initiaux d’espace de noms montage. Ces
       nouveaux montages conservent les mêmes types de propagation, mais ont des ID uniques de montage (l’option
       --propagation unchanged empêche unshare(1) de marquer tous les montages comme privés lors de la  création
       d’un nouvel espace de noms montage, ce qui est réalisé par défaut).

       Dans  le  second terminal, créons alors des sous-montages sous chacun des /mntS et /mntP et inspectons la
       configuration :

           sh2# mkdir /mntS/a
           sh2# mount /dev/sdb6 /mntS/a
           sh2# mkdir /mntP/b
           sh2# mount /dev/sdb7 /mntP/b
           sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           222 145 8:17 / /mntS rw,relatime shared:1
           225 145 8:15 / /mntP rw,relatime
           178 222 8:22 / /mntS/a rw,relatime shared:2
           230 225 8:23 / /mntP/b rw,relatime

       Dans ce qui précède, on peut voir que /mntS/a a été créé  comme  partagé  (héritant  ce  réglage  de  son
       montage parent) et que /mntP/b a été créé comme montage privé.

       En  retournant  dans  le  premier terminal et en inspectant la configuration, on peut voir que le nouveau
       montage créé sous le montage partagé /mntS s’est propagé vers son montage pair  (dans  l’espace  de  noms
       montage initial), mais que le nouveau montage créé sous le montage privé /mntP ne s’est pas propagé :

           sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           77 61 8:17 / /mntS rw,relatime shared:1
           83 61 8:15 / /mntP rw,relatime
           179 77 8:22 / /mntS/a rw,relatime shared:2

   Exemples pour MS_SLAVE
       Faire  d’un  montage  un  esclave  lui permet de recevoir des évènements mount(2) et umount(2) propagés à
       partir d’un groupe de pairs partagé maitre, tout en  l’empêchant  de  propager  des  évènements  vers  ce
       maitre.  Cela est utile, par exemple, si on veut recevoir un évènement de montage quand un disque optique
       est monté dans un groupe de pairs partagé maitre (dans un autre espace de noms montage), mais en  voulant
       empêcher que des évènements mount(2) et umount(2) dans le montage esclave n’aient des effets de bord dans
       d’autres espaces de noms.

       L’effet  de  l’asservissement  peut  être  démontré en d’abord marquant deux montages comme partagés dans
       l’espace de noms montage initial :

           sh1# mount --make-shared /mntX
           sh1# mount --make-shared /mntY
           sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           132 83 8:23 / /mntX rw,relatime shared:1
           133 83 8:22 / /mntY rw,relatime shared:2

       Dans un second terminal, créons un nouvel espace de noms montage et inspectons les montages :

           sh2# unshare -m --propagation unchanged sh
           sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           168 167 8:23 / /mntX rw,relatime shared:1
           169 167 8:22 / /mntY rw,relatime shared:2

       Dans le nouvel espace de noms montage marquons un des montages comme esclave :

           sh2# mount --make-slave /mntY
           sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           168 167 8:23 / /mntX rw,relatime shared:1
           169 167 8:22 / /mntY rw,relatime master:2

       Dans la sortie ci-dessus, nous voyons  que  /mntY  est  désormais  un  montage  esclave  qui  reçoit  les
       évènements de propagation du groupe de pairs partagé avec l’ID 2.

       En continuant dans le nouvel espace de noms, créons des sous-montages sous chaque /mntX et /mntY :

           sh2# mkdir /mntX/a
           sh2# mount /dev/sda3 /mntX/a
           sh2# mkdir /mntY/b
           sh2# mount /dev/sda5 /mntY/b

       Si  nous  inspectons l’état des montages dans le nouvel espace de noms montage, nous voyons que /mntX/a a
       été créé comme nouveau montage partagé (héritant du réglage « partagé » de son  montage  parent)  et  que
       /mntY/b a été créé comme montage privé :

           sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           168 167 8:23 / /mntX rw,relatime shared:1
           169 167 8:22 / /mntY rw,relatime master:2
           173 168 8:3 / /mntX/a rw,relatime shared:3
           175 169 8:5 / /mntY/b rw,relatime

       En retournant dans le premier terminal (dans l’espace de noms montage initial) nous voyons que le montage
       /mntX/a s’est propagé au pair (le /mntX partagé), mais que le montage /mntY/b ne s’est pas propagé :

           sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           132 83 8:23 / /mntX rw,relatime shared:1
           133 83 8:22 / /mntY rw,relatime shared:2
           174 132 8:3 / /mntX/a rw,relatime shared:3

       Créons maintenant un nouveau montage sous /mntY dans le premier interpréteur :

           sh1# mkdir /mntY/c
           sh1# mount /dev/sda1 /mntY/c
           sh1# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           132 83 8:23 / /mntX rw,relatime shared:1
           133 83 8:22 / /mntY rw,relatime shared:2
           174 132 8:3 / /mntX/a rw,relatime shared:3
           178 133 8:1 / /mntY/c rw,relatime shared:4

       Quand  nous  examinons les montages dans le second espace de noms montage, nous voyons que dans ce cas le
       nouveau montage s’est propagé au montage esclave et que  le  nouveau  montage  lui-même  est  un  montage
       esclave (au groupe de pairs 4) :

           sh2# cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           168 167 8:23 / /mntX rw,relatime shared:1
           169 167 8:22 / /mntY rw,relatime master:2
           173 168 8:3 / /mntX/a rw,relatime shared:3
           175 169 8:5 / /mntY/b rw,relatime
           179 169 8:1 / /mntY/c rw,relatime master:4

   Exemples pour MS_UNBINDABLE
       Une  des premières utilités des montages non liables (non bind) est d’éviter le problème « d’explosion de
       montages » lors de réalisation de manière répétée de montages bind d’un sous-arbre de haut niveau dans un
       montage de bas niveau. Le problème est illustré par la session d’interpréteur suivante :

       En supposant l’existence d’un système avec les montages suivants :

           # mount | awk '{print $1, $2, $3}'
           /dev/sda1 on /
           /dev/sdb6 on /mntX
           /dev/sdb7 on /mntY

       Supposons de plus que nous voulons de manière récursive monter  lié  (bind)  le  répertoire  racine  sous
       plusieurs  répertoires  home  d’utilisateurs.  Faisons-le  pour  le premier utilisateur et inspectons les
       montages :

           # mount --rbind / /home/cecilia/
           # mount | awk '{print $1, $2, $3}'
           /dev/sda1 on /
           /dev/sdb6 on /mntX
           /dev/sdb7 on /mntY
           /dev/sda1 on /home/cecilia
           /dev/sdb6 on /home/cecilia/mntX
           /dev/sdb7 on /home/cecilia/mntY

       Lorsque nous répétons cette opération pour le second utilisateur, le problème de l’explosion  commence  à
       apparaitre :

           # mount --rbind / /home/henry
           # mount | awk '{print $1, $2, $3}'
           /dev/sda1 on /
           /dev/sdb6 on /mntX
           /dev/sdb7 on /mntY
           /dev/sda1 on /home/cecilia
           /dev/sdb6 on /home/cecilia/mntX
           /dev/sdb7 on /home/cecilia/mntY
           /dev/sda1 on /home/henry
           /dev/sdb6 on /home/henry/mntX
           /dev/sdb7 on /home/henry/mntY
           /dev/sda1 on /home/henry/home/cecilia
           /dev/sdb6 on /home/henry/home/cecilia/mntX
           /dev/sdb7 on /home/henry/home/cecilia/mntY

       Sous /home/henry, nous n'avons pas seulement ajouté récursivement les montages /mntX et /mntY, mais aussi
       les  montages  récursifs de ces répertoires sous /home/cecilia qui ont été créés dans l’étape précédente.
       Si nous répétons cela pour un troisième utilisateur, il devient évident que  l’explosion  est  de  nature
       exponentielle :

           # mount --rbind / /home/otto
           # mount | awk '{print $1, $2, $3}'
           /dev/sda1 on /
           /dev/sdb6 on /mntX
           /dev/sdb7 on /mntY
           /dev/sda1 on /home/cecilia
           /dev/sdb6 on /home/cecilia/mntX
           /dev/sdb7 on /home/cecilia/mntY
           /dev/sda1 on /home/henry
           /dev/sdb6 on /home/henry/mntX
           /dev/sdb7 on /home/henry/mntY
           /dev/sda1 on /home/henry/home/cecilia
           /dev/sdb6 on /home/henry/home/cecilia/mntX
           /dev/sdb7 on /home/henry/home/cecilia/mntY
           /dev/sda1 on /home/otto
           /dev/sdb6 on /home/otto/mntX
           /dev/sdb7 on /home/otto/mntY
           /dev/sda1 on /home/otto/home/cecilia
           /dev/sdb6 on /home/otto/home/cecilia/mntX
           /dev/sdb7 on /home/otto/home/cecilia/mntY
           /dev/sda1 on /home/otto/home/henry
           /dev/sdb6 on /home/otto/home/henry/mntX
           /dev/sdb7 on /home/otto/home/henry/mntY
           /dev/sda1 on /home/otto/home/henry/home/cecilia
           /dev/sdb6 on /home/otto/home/henry/home/cecilia/mntX
           /dev/sdb7 on /home/otto/home/henry/home/cecilia/mntY

       Le  problème  de  l’explosion  de  montages  dans le scénario précédent peut être évité en rendant chaque
       nouveau montage non liable. Ainsi les montages récursifs du répertoire racine  ne  répliqueront  pas  les
       montages non liables. Un tel montage pour le premier utilisateur peut être effectué ainsi :

           # mount --rbind --make-unbindable / /home/cecilia

       Avant d’aller plus loin, nous montrons que les montages non liables le sont effectivement :

           # mkdir /mntZ
           # mount --bind /home/cecilia /mntZ
           mount: wrong fs type, bad option, bad superblock on /home/cecilia,
                  missing codepage or helper program, or other error

                  In some cases useful info is found in syslog - try
                  dmesg | tail or so.

       Maintenant nous créons des montages bind récursifs non liables pour les deux autres utilisateurs :

           # mount --rbind --make-unbindable / /home/henry
           # mount --rbind --make-unbindable / /home/otto

       Un  examen de la liste des montages permet de voir qu’il n’y a eu aucune explosion des montages parce que
       les montages non liables n’ont pas été répliqués sous chaque répertoire d’utilisateur :

           # mount | awk '{print $1, $2, $3}'
           /dev/sda1 on /
           /dev/sdb6 on /mntX
           /dev/sdb7 on /mntY
           /dev/sda1 on /home/cecilia
           /dev/sdb6 on /home/cecilia/mntX
           /dev/sdb7 on /home/cecilia/mntY
           /dev/sda1 on /home/henry
           /dev/sdb6 on /home/henry/mntX
           /dev/sdb7 on /home/henry/mntY
           /dev/sda1 on /home/otto
           /dev/sdb6 on /home/otto/mntX
           /dev/sdb7 on /home/otto/mntY

   Transitions de type de propagation
       La table suivante montre les effets que l’application d’un  nouveau  type  de  propagation  (c’est-à-dire
       mount --make-xxxx) a sur un type de propagation existant d’un montage. Les lignes correspondent aux types
       de  programmation  existants  et  les  colonnes  aux  nouveaux  réglages de propagation. Pour des raisons
       d’espace, « private » est abrégé en « priv » et « unbindable » en « unbind ».
                     make-shared   make-slave      make-priv  make-unbind
       ─────────────┬───────────────────────────────────────────────────────
       shared       │shared        slave/priv [1]  priv       unbind
       slave        │slave+shared  slave [2]       priv       unbind
       slave+shared │slave+shared  slave           priv       unbind
       private      │shared        priv [2]        priv       unbind
       unbindable   │shared        unbind [2]      priv       unbind

       Prenez note des détails suivants à propos de la table :

       [1]  Si un montage partagé est l’unique montage dans son groupe de pairs, faire de lui un esclave le rend
            automatiquement privé.

       [2]  Rendre esclave un montage non partagé n’a aucun effet sur le montage.

   Sémantiques de Bind (MS_BIND)
       Supposons que la commande suivante soit exécutée :

           mount --bind A/a B/b

       Ici, A est le montage source, B est le montage de destination, a est un chemin de sous-répertoire sous le
       point de montage A et b est un chemin de  sous-répertoire  sous  le  point  de  montage  B.  Le  type  de
       propagation  du  montage résultant, B/b, dépend des types de propagation des montages A et B, et cela est
       résumé dans la table suivante.

                                    source(A)
                            shared  private    slave         unbind
       ────────────────────┬──────────────────────────────────────────────
       dest(B)  shared     │shared  shared     slave+shared  non valable
                non partagé│shared  private    slave         non valable

       Remarquez qu’un bind récursif d’un sous-arbre suit les mêmes sémantiques que pour une opération bind  sur
       chaque  montage  dans  le sous-arbre (les montages non liables sont automatiquement élagués à la cible du
       montage cible).

       Pour de plus amples explications, consulter Documentation/filesystems/sharedsubtree.rst dans l’arbre  des
       sources du noyau.

   Sémantiques de Move (MS_MOVE)
       Supposons que la commande suivante soit exécutée :

           mount --move A B/b

       Ici,  A est le montage source, B est le montage de destination et b est un chemin de sous-répertoire sous
       le point de montage B. Le type de propagation du montage résultant, B/b, dépend des types de  propagation
       des montages A et B, et cela est résumé dans la table suivante.

                                    source(A)
                            shared  private    slave         unbind
       ────────────────────┬──────────────────────────────────────────────
       dest(B)  shared     │shared  shared     slave+shared  non valable
                non partagé│shared  private    slave         unbindable

       Remarque : déplacer un montage qui réside sous un montage partagé n’est pas autorisé.

       Pour  de plus amples explications, consulter Documentation/filesystems/sharedsubtree.rst dans l’arbre des
       sources du noyau.

   Sémantiques de montage
       Supposons que la commande suivante soit utilisée pour créer un montage :

           mount device B/b

       Ici, B est le montage de destination et b est un chemin de sous-répertoire sous le point de montage B. Le
       type de propagation du montage résultant, B/b, suit les mêmes règles que pour un montage bind où le  type
       de propagation du montage source est toujours considéré comme privé.

   Sémantiques de démontage
       Supposons que la commande suivante soit utilisée pour défaire un montage :

           umount A

       Ici,  A est un montage dans B/b, où B est le montage parent et b est un chemin de sous-répertoire sous le
       point de montage B. Si B est partagé, alors tous les montages les plus récemment montés dans  b  sur  des
       montages  qui  reçoivent  la  propagation  du  montage  B et qui n’ont pas de sous-montages sous eux sont
       démontés.

   L’étiquette /proc/ pid /mountinfo propagate_from
       L’étiquette  propagate_from:X  est   affichée   dans   les   champs   facultatifs   d’un   enregistrement
       /proc/pid/mountinfo  dans le cas où un processus ne peut voir un maitre immédiat d’esclave (c’est-à-dire,
       le chemin du maitre n’est pas accessible à partir du répertoire racine du système de fichiers)  et  ainsi
       ne peut pas déterminer la chaine de propagation entre les montages qu’il peut voir.

       Dans  l’exemple  suivant,  créons d’abord une chaine maitre-esclave à deux liens entre les montages /mnt,
       /tmp/etc et /mnt/tmp/etc. Ensuite la commande chroot(1) est utilisée pour  rendre  le  point  de  montage
       /tmp/etc  inaccessible  à  partir du répertoire racine, créant une situation où le maitre de /mnt/tmp/etc
       n’est pas accessible à partir du (nouveau) répertoire racine du processus.

       D’abord mous montons lié (bind) le répertoire racine sur /mnt, puis nous montons lié /proc sous /mnt/proc
       de telle façon qu’après le chroot(1) ultérieur, le système  de  fichiers  proc(5)  demeure  visible  dans
       l’emplacement correct de l’environnement chrooté.

           # mkdir -p /mnt/proc
           # mount --bind / /mnt
           # mount --bind /proc /mnt/proc

       Ensuite,  nous  nous  assurons que le montage /mnt est un montage partagé dans un nouveau groupe de pairs
       (sans aucun pair) :

           # mount --make-private /mnt  # Isolation de n’importe quel groupe de pairs précédent
           # mount --make-shared /mnt
           # cat /proc/self/mountinfo | grep '/mnt' | sed 's/ - .*//'
           239 61 8:2 / /mnt ... shared:102
           248 239 0:4 / /mnt/proc ... shared:5

       Ensuite, nous montons lié /mnt/etc sur /tmp/etc :

           # mkdir -p /tmp/etc
           # mount --bind /mnt/etc /tmp/etc
           # cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/ - .*//'
           239 61 8:2 / /mnt ... shared:102
           248 239 0:4 / /mnt/proc ... shared:5
           267 40 8:2 /etc /tmp/etc ... shared:102

       Initialement, ces deux montages sont dans le même groupe de pairs, mais nous rendons /tmp/etc esclave  de
       /mnt/etc  et  nous rendons aussi /tmp/etc partagé, de telle façon qu’il puisse propager les évènements au
       prochain esclave dans la chaine :

           # mount --make-slave /tmp/etc
           # mount --make-shared /tmp/etc
           # cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/ - .*//'
           239 61 8:2 / /mnt ... shared:102
           248 239 0:4 / /mnt/proc ... shared:5
           267 40 8:2 /etc /tmp/etc ... shared:105 master:102

       Ensuite nous montons lié /tmp/etc sur /mnt/tmp/etc. De nouveau, les deux montages sont initialement  dans
       le même groupe de pairs, mais nous faisons alors de /mnt/tmp/etc un esclave de /tmp/etc :

           # mkdir -p /mnt/tmp/etc
           # mount --bind /tmp/etc /mnt/tmp/etc
           # mount --make-slave /mnt/tmp/etc
           # cat /proc/self/mountinfo | egrep '/mnt|/tmp/' | sed 's/ - .*//'
           239 61 8:2 / /mnt ... shared:102
           248 239 0:4 / /mnt/proc ... shared:5
           267 40 8:2 /etc /tmp/etc ... shared:105 master:102
           273 239 8:2 /etc /mnt/tmp/etc ... master:105

       De ce qui précède, nous voyons que /mnt est le maitre de l’esclave /tmp/etc, qui à son tour est le maitre
       de l’esclave /mnt/tmp/etc.

       Puis  nous  effectuons  un  chroot(1)  sur  le  répertoire  /mnt,  ce  qui  rend le montage avec l’ID 267
       inaccessible à partir du (nouveau) répertoire racine :

           # chroot /mnt

       Lorsque nous examinons l’état des montages à l’intérieur de l’environnement chrooté, nous voyons  ce  qui
       suit :

           # cat /proc/self/mountinfo | sed 's/ - .*//'
           239 61 8:2 / / ... shared:102
           248 239 0:4 / /proc ... shared:5
           273 239 8:2 /etc /tmp/etc ... master:105 propagate_from:102

       Ci-dessus,  nous  voyons  que  le  montage  avec  l’ID 273 est un esclave dont le maitre est le groupe de
       pairs 105. Le point de montage pour ce maitre est inaccessible, et donc, une étiquette propagate_from est
       affichée, indiquant que le groupe de pairs dominant le plus proche (c’est-à-dire le montage accessible le
       plus proche dans la chaine esclave) est le groupe de pairs avec  l’ID  102  (correspondant  au  point  de
       montage /mnt avant que le chroot(1) soit réalisé).

STANDARDS

       Linux.

HISTORIQUE

       Linux 2.4.19.

NOTES

       Le  type  de propagation assigné à un nouveau montage dépend du type de propagation du montage parent. Si
       le montage a un parent (c’est-à-dire que ce n’est pas un point de  montage  racine)  et  si  le  type  de
       propagation du parent est MS_SHARED, alors le type de propagation du nouveau montage est aussi MS_SHARED.
       Sinon, le type de propagation du nouveau montage est MS_PRIVATE.

       Malgré  le  fait  que le type de propagation par défaut pour le nouveau montage soit dans de nombreux cas
       MS_PRIVATE, MS_SHARED est en général plus utile. Pour cette raison,  systemd(1)  remonte  automatiquement
       tous  les  montages  en  MS_SHARED  au  démarrage du système. Par conséquent, sur la plupart des systèmes
       modernes, le type de propagation par défaut est en pratique MS_SHARED.

       Puisque lorsqu'on utilise unshare(1) pour créer un espace de noms  montage,  le  but  est  couramment  de
       fournir   une  isolation  totale  des  montages  dans  le  nouvel  espace  de  noms,  unshare(1)  (depuis
       util-linux 2.27) à son tour inverse l’étape réalisée par systemd(1), en rendant tous les montages  privés
       dans  le  nouvel  espace de noms. C’est-à-dire que unshare(1) réalise l’équivalent de ce qui suit dans le
       nouvel espace de noms montage :

           mount --make-rprivate /

       Pour empêcher cela, on peut utiliser l’option --propagation unchanged de unshare(1).

       Une application qui crée un nouvel espace de noms montage directement en utilisant clone(2) ou unshare(2)
       peut vouloir empêcher la propagation d’évènements de montage aux autres espaces de  noms  montage  (comme
       cela est réalisé par unshare(1)). Cela peut être effectué en changeant le type de propagation de montages
       dans le nouvel espace de noms à MS_SLAVE ou MS_PRIVATE, en utilisant l'appel suivant :

           mount(NULL, "/", MS_SLAVE | MS_REC, NULL);

       Pour  des  explications  sur  les  types  de propagation lors de déplacements de montages (MS_MOVE) et de
       créations de montages liés (MS_BIND), consulter Documentation/filesystems/sharedsubtree.rst.

   Restrictions sur les espaces de noms montage
       Prenez note des points suivants concernant les espaces de noms montage :

       [1]  Chaque espace de noms  montage  a  un  espace  de  noms  utilisateur  propriétaire.  Comme  expliqué
            ci-dessus,  quand  un  nouvel  espace de noms montage est créé, sa liste de montages est initialisée
            comme copie de la liste de montages d’un autre espace de noms montage. Si le nouvel espace  de  noms
            et l’espace de noms depuis lequel la liste de montages a été copiée sont possédés par des espaces de
            noms  utilisateur  différents,  alors  le  nouvel  espace  de noms montage est considéré comme moins
            privilégié.

       [2]  Lors de la création d’un espace de noms moins privilégié, les montages partagés sont réduits  à  des
            montages esclaves. Cela permet de s'assurer que les mappages réalisés dans des espaces de noms moins
            privilégiés ne se propageront pas vers des espaces de noms montage plus privilégiés.

       [3]  Les montages qui viennent sous forme d’unité unique d’un espace de noms montage plus privilégié sont
            verrouillés ensemble et ne peuvent pas être séparés dans un espace de noms montage moins privilégié.
            L’opération  CLONE_NEWNS  de  unshare(2)  circule  à  travers  tous les montages de l’espace de noms
            montage originel comme unité unique, et les montages récursifs se propageant entre  les  espaces  de
            noms montage se propagent comme unité unique.

            Dans  ce  contexte,  «  ne  peuvent pas être séparés » signifie que les montages sont verrouillés de
            telle façon qu’ils ne puissent être démontés individuellement. En considérant l’exemple suivant :

                $ sudo sh
                # mount --bind /dev/null /etc/shadow
                # cat /etc/shadow       # Aucune sortie

            Les étapes ci-dessus, réalisées dans un espace de noms plus privilégié, ont créé un montage lié  qui
            dissimule  le  contenu  du  fichier  d’hachage  des  mots de passe, /etc/shadow. Pour des raisons de
            sécurité, il ne doit pas être possible d’effectuer un umount(2) de ce montage dans un espace de noms
            montage moins privilégié puisque cela permettrait de dévoiler le contenu de /etc/shadow.

            Supposons que nous  créons  un  nouvel  espace  de  noms  montage  propriété  d’un  espace  de  noms
            utilisateur.  Le  nouvel  espace  de  noms  montage  héritera des copies de tous les espaces de noms
            montage précédents. Cependant, ces montages seront verrouillés parce que le nouvel  espace  de  noms
            montage  est  moins  privilégié. Par conséquent, un essai d’umount(2) du montage échouera comme cela
            est montré dans l’étape suivante :

                # unshare --user --map-root-user --mount \
                               strace -o /tmp/log \
                               umount /mnt/dir
                umount: /etc/shadow: not mounted.
                # grep '^umount' /tmp/log
                umount2("/etc/shadow", 0)     = -1 EINVAL (Invalid argument)

            Le message d’erreur de mount(8) est un peu déroutant, mais la sortie de strace(1) révèle que l’appel
            système umount2(2) sous-jacent échoue avec l’erreur EINVAL qui est l’erreur  que  le  noyau  renvoie
            pour indiquer que le montage est verrouillé.

            Cependant, il est à remarquer qu’il est possible d’empiler (et désempiler) un montage au-dessus d’un
            des montages verrouillés hérités dans un espace de noms montage moins privilégié.

                # echo 'aaaaa' > /tmp/a    # Fichier à monter sur /etc/shadow
                # unshare --user --map-root-user --mount
                    sh -c 'mount --bind /tmp/a /etc/shadow; cat /etc/shadow'
                aaaaa
                # umount /etc/shadow

            La commande finale umount(8) ci-dessus, qui est réalisée dans l’espace de noms montage initial, rend
            le fichier /etc/shadow originel à nouveau visible dans cet espace de noms.

       [4]  Dans  le  prolongement  du  point  [3], remarquez qu’il est possible d’effectuer un umount(2) sur un
            sous-arbre entier de montages qui se sont propagés comme unité dans un espace de noms montage  moins
            privilégié, comme cela est illustré dans l’exemple suivant.

            D’abord,  créons  un  nouvel  espace  de  noms  utilisateur  et  un nouvel espace de noms montage en
            utilisant unshare(1). Dans le nouvel espace de noms montage, le type  de  propagation  de  tous  les
            montages  est  défini  comme  privé.  Créons  alors  un  montage  lié partagé sur /mnt et une petite
            hiérarchie de montages sous ce montage.

                $ PS1='ns1# ' sudo unshare --user --map-root-user
                                       --mount --propagation private bash
                ns1# echo $$        # PID de l’interpréteur nécessaire par la suite
                778501
                ns1# mount --make-shared --bind /mnt /mnt
                ns1# mkdir /mnt/x
                ns1# mount --make-private -t tmpfs none /mnt/x
                ns1# mkdir /mnt/x/y
                ns1# mount --make-private -t tmpfs none /mnt/x/y
                ns1# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
                986 83 8:5 /mnt /mnt rw,relatime shared:344
                989 986 0:56 / /mnt/x rw,relatime
                990 989 0:57 / /mnt/x/y rw,relatime

            En continuant dans la même session d’interpréteur, créons  alors  un  second  interpréteur  dans  un
            nouvel  espace  de  noms  utilisateur  et  un  nouvel  espace (moins privilégié) de noms montage, et
            vérifions l’état des montages propagés ayant pour racine /mnt.

                ns1# PS1='ns2# ' unshare --user --map-root-user
                                       --mount --propagation unchanged bash
                ns2# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
                1239 1204 8:5 /mnt /mnt rw,relatime master:344
                1240 1239 0:56 / /mnt/x rw,relatime
                1241 1240 0:57 / /mnt/x/y rw,relatime

            Il est à noter dans le résultat ci-dessus que le type de propagation du montage /mnt a été réduit  à
            esclave  comme  expliqué  dans  le  point  [2].  Cela signifie que les évènements de sous-montage se
            propageront du maitre /mnt dans « ns1 », mais  que  la  propagation  ne  se  produira  pas  dans  la
            direction opposée.

            À  partir  d’une  fenêtre  à part du terminal, utilisons alors nsenter(1) pour saisir des espaces de
            noms montage et utilisateur correspondant  à  «  ns1  ».  Dans  cette  fenêtre  de  terminal,  lions
            récursivement les montages /mnt/x à l’emplacement /mnt/ppp.

                $ PS1='ns3# ' sudo nsenter -t 778501 --user --mount
                ns3# mount --rbind --make-private /mnt/x /mnt/ppp
                ns3# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
                986 83 8:5 /mnt /mnt rw,relatime shared:344
                989 986 0:56 / /mnt/x rw,relatime
                990 989 0:57 / /mnt/x/y rw,relatime
                1242 986 0:56 / /mnt/ppp rw,relatime
                1243 1242 0:57 / /mnt/ppp/y rw,relatime shared:518

            Parce  que  le  type  de propagation du montage parent, /mnt, était partagé, le montage récursif lié
            propage un petit sous-arbre de montages sous le montage esclave /mnt dans « ns2 », comme  cela  peut
            être vérifié en exécutant la commande suivante dans cette session d’interpréteur :

                ns2# grep /mnt /proc/self/mountinfo | sed 's/ - .*//'
                1239 1204 8:5 /mnt /mnt rw,relatime master:344
                1240 1239 0:56 / /mnt/x rw,relatime
                1241 1240 0:57 / /mnt/x/y rw,relatime
                1244 1239 0:56 / /mnt/ppp rw,relatime
                1245 1244 0:57 / /mnt/ppp/y rw,relatime master:518

            Bien  qu’il  ne  soit  pas  possible  d’effectuer  un umount(2) sur une partie du sous-arbre propagé
            (/mnt/ppp/y) dans « ns2 », il est possible d’effectuer un umount(2)  sur  le  sous-arbre  en  entier
            comme cela est montré avec les commandes suivantes :

                ns2# umount /mnt/ppp/y
                umount: /mnt/ppp/y: not mounted.
                ns2# umount -l /mnt/ppp | sed 's/ - .*//'      # Succès...
                ns2# grep /mnt /proc/self/mountinfo
                1239 1204 8:5 /mnt /mnt rw,relatime master:344
                1240 1239 0:56 / /mnt/x rw,relatime
                1241 1240 0:57 / /mnt/x/y rw,relatime

       [5]  Les  réglages  des  attributs de mount(2) MS_RDONLY, MS_NOSUID, MS_NOEXEC et des attributs « atime »
            (MS_NOATIME, MS_NODIRATIME, MS_RELATIME) deviennent verrouillés quand ils sont  propagés  depuis  un
            espace  de  noms  montage  plus  privilégié vers un autre espace moins privilégié et ne peuvent être
            changés dans l’espace de noms montage moins privilégié.

            Ce point est illustré par l’exemple suivant où, dans un espace de noms montage plus privilégié, nous
            créons un montage lié qui est marqué comme en lecture seule. Pour des raisons  de  sécurité,  il  ne
            devrait  pas  être  possible  de permettre l’écriture dans le montage dans un espace de noms montage
            moins privilégié, et en effet le noyau empêche cela :

                $ sudo mkdir /mnt/dir
                $ sudo mount --bind -o ro /some/path /mnt/dir
                $ sudo unshare --user --map-root-user --mount
                               mount -o remount,rw /mnt/dir
                mount: /mnt/dir: permission denied.

       [6]  Un fichier ou un répertoire qui est un point de montage dans un espace de  noms  qui  n’est  pas  un
            point  de  montage dans un autre espace de noms peut être renommé, délié ou supprimé (rmdir(2)) dans
            l’espace de noms  montage  dans  lequel  il  n’est  pas  un  point  de  montage  (sous  réserve  des
            vérifications  habituelles  de  permissions).  Par conséquent, le point de montage est supprimé dans
            l’espace de noms montage où il n’est pas un point de montage.

            Auparavant (avant Linux 3.18), essayer de délier, renommer ou supprimer un fichier ou un  répertoire
            qui  était  un point de montage dans un autre espace de noms montage aboutissait à une erreur EBUSY.
            Ce comportement rencontre des problèmes techniques d’application (par exemple, pour NFS)  et  permet
            des  attaques  par déni de service sur des utilisateurs plus privilégiés (c’est-à-dire empêchant des
            fichiers individuels d’être mis à jour en utilisant un montage lié au-dessus d’eux).

EXEMPLES

       Consulter pivot_root(2).

VOIR AUSSI

       unshare(1),  clone(2),  mount(2),  mount_setattr(2),  pivot_root(2),  setns(2),  umount(2),   unshare(2),
       proc(5),   namespaces(7),  user_namespaces(7),  findmnt(8),  mount(8),  pam_namespace(8),  pivot_root(8),
       umount(8)

       Documentation/filesystems/sharedsubtree.rst dans l’arbre des sources du noyau.

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-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

       Cette  traduction  est  une  documentation libre ; veuillez vous reporter à la GNU General Public License
       version 3 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.9.1                    15 juin 2024                               mount_namespaces(7)