Man page - mount_namespaces(7)

Packages contains this manual

Available languages:

en fr sv de

Manual

mount_namespaces

NOM
DESCRIPTION
SOUS-ARBRES PARTAGÉS
Exemples pour MS_SHARED et MS_PRIVATE
Exemples pour MS_SLAVE
Exemples pour MS_UNBINDABLE
Transitions de type de propagation
Sémantiques de Bind (MS_BIND)
Sémantiques de Move (MS_MOVE)
Sémantiques de montage
Sémantiques de démontage
L’étiquette /proc/ pid /mountinfo propagate_from
STANDARDS
HISTORIQUE
NOTES
Restrictions sur les espaces de noms montage
EXEMPLES
VOIR AUSSI
TRADUCTION

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

Image grohtml-3848949-1.png

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.

Image grohtml-3848949-2.png

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.

Image grohtml-3848949-3.png

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 .