diff --git a/tutorial/4/mount.md b/tutorial/4/mount.md index da0ddbf..f4128a4 100644 --- a/tutorial/4/mount.md +++ b/tutorial/4/mount.md @@ -5,9 +5,226 @@ Des particularités de `mount` ## Les points de montage +Au premier abord, les points de montage dans l'arborescence d'un système de +fichiers n'ont pas l'air d'être remplis de notions complexes : un répertoire +peut être le point d'entrée d'un montage vers la partition d'un disque +physique... ou d'une partition virtuelle, comme nous l'avons vu au TP +précédent. + +Mais avez-vous déjà essayé de monter la même partition d'un disque physique à +deux endroits différents de votre arborescence ? + +Si pour plein de raisons on pourrait se dire que cela ne devrait pas être +autorisé, ce problème s'avère être à la base de beaucoup de fonctionnalités +intéressantes. Le noyau va finalement décorréler les notions de montage, +d'accès et d'accroches dans l'arborescence : et par exemple, une partition ne +sera plus forcément démontée après un appel à `umount(2)`, mais le sera +seulement lorsque cette partition n'aura plus d'accroches dans aucune +arborescence. + +Durant cette partie du TP, vous allez avoir besoin de la commande +`findmnt(1)`. Commençons par la lancer maintenant pour se familiariser avec les +différents points d'accroche actuellement montés. + + ## `bind` -## `shared` +Lorsque l'on souhaite monter à un deuxième endroit (ou plus) une partition, on +utilise le *bind mount* : `mount --bind olddir newdir`. + +Lorsque l'on utilise des `chroot`s sur un système complet (par exemple lorsqu'on +l'installe ou qu'on le répare via un live CD), il est nécessaire de dupliquer +les points de montage de `/dev`, `/proc` et `/sys`. + +Reprenons l'environnement que nous avons créé au précédent TP. Sans monter ces +partitions, vous ne serez pas en mesure d'utiliser le système dans son +intégralité : vous ne pourrez pas monter les partitions indiquées par le +`/etc/fstab`, vous ne pourrez pas utiliser `top` ou `ps`, ... + +Pour que tout cela fonctionne, vous avez besoin au préalable d'exécuter les +commandes suivantes : + +``` + cd newroot + mount --bind /dev dev + mount --bind /proc proc + mount --bind /sys sys +``` + +En se `chroot`ant à nouveau dans cette nouvelle racine, nous voyons que tous +nos outils fonctionnent comme prévu. + +Tous ? ... en fait non. Si l'on jette un œil à `findmnt(1)`, nous constatons +par exemple que `/sys/fs/cgroup` dans notre nouvelle racine est vide, alors que +celui de notre machine hôte contient bien les répertoires de nos CGroups. + +`--bind` va se contenter d'attacher le système de fichiers (ou au moins une +partie de celui-ci) à un autre endroit, sans se préoccuper des points de +montages sous-jacents. Pour effectuer cette action récursivement, et donc +monter au nouvel emplacement le système de fichier ainsi que tous les points +d'accroche qu'il contient, il faut utiliser `--rbind`. Il serait donc plus +correct de lancer : + +``` + cd newroot + mount --rbind /dev dev + mount -t proc none proc + mount --rbind /sys sys +``` + + +## Les montages parfumés + +On distingue 4 variétés de répercution des montages pour un sous-arbre : +partagé, esclave, privé et non-attachable. + +Il s'agit d'agir sur la manière dont seront propagées les nouvelles accroches +au sein d'un système de fichiers attaché à plusieurs endroit. + + +### partagé -- *shared mount* + +Une nouvelle accroche sera propagée parmi tous les systèmes de fichiers de ce +partage (on parle de *peer group*). + +Essayons de voir à quoi cela correspond avec l'exemple suivant : + +```shell +# Création de nos répertoires de travail +cd /mnt +mkdir test-shared + +# On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared +mount --make-shared /tmp + +# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches +mount --bind /tmp /mnt/test-shared +``` + +Si l'on attache un nouveau point de montage dans `/tmp` ou dans +`/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée : + +```shell +mkdir /mnt/test-shared/toto +mount -t tmpfs none /mnt/test-shared/toto +``` + +Un coup de `findmnt` nous montre l'existence de deux nouveaux points de +montages. À `/mnt/test-shared/toto`, mais également à `/tmp/toto`. + + +### esclave -- *slave mount* + +De la même manière que lorsque la propagation est partagée, cette politique +propagera, mais seulement dans un sens. Le point de montage déclaré comme +esclave ne propagera pas ses nouveaux points de montage. + +```shell +# Suite de l'exemple précédent +cd /mnt +mkdir test-slave + +# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches +mount --bind /mnt/test-shared /mnt/test-slave + +# On rend notre dossier esclave +mount --make-slave /mnt/test-slave +``` + +Si l'on effectue un montage dans `/mnt/test-shared` : + +```shell +mkdir /mnt/test-shared/foo +mount -t tmpfs none /mnt/test-shared/foo +``` + +Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre : + +```shell +mkdir /mnt/test-slave/bar +mount -t tmpfs none /mnt/test-slave/bar +``` + +Le nouveau point de montage n'est pas propagé dans `/mnt/test-shared/bar`. + + +### privé -- *private mount* + +C'est le mode le plus simple : ici les points de montage ne sont pas propagés. + +Pour forcer un point d'accroche a ne pas propager et à ne pas recevoir de +propagation, on utilise l'option suivante : + +```shell +mount --make-private mountpoint +``` + + +### non-attachable -- *unbindable mount* + +Ce mode interdira tout tentative d'attache à un autre endroit. + +```shell +mount --make-unbindable /mnt/test-slave +``` + +Il ne sera pas possible de faire : + +```shell +mkdir /mnt/test-unbindable +mount --bind /mnt/test-slave /mnt/test-unbindable +``` + + +### Parfums récursifs + +Les options que nous venons de voir s'applique sur un point de montage. Il +existe les mêmes options pour les appliquer en cascade sur les points d'attache +contenu dans le sous-arbre : + +``` +mount --make-rshared mountpoint +mount --make-rslave mountpoint +mount --make-rprivate mountpoint +mount --make-runbindable mountpoint +``` + + +## `bind` de dossiers et de fichiers + +Il n'est pas nécessaire que le point d'accroche que l'on cherche à dupliquer +pointe sur un point de montage. Il peut parfaitement pointer sur un dossier, et +même sur un simple fichier, à la manière d'un *hardlink*, mais que l'on +pourrait faire entre plusieurs partition et qui ne persisterait pas au +redémarrage. + +Nous verrons dans la partie *namespace* réseau, une utilisation d'attache sur +un fichier. + + +## Déplacer un point de montage + +À tout moment, il est possible réorganiser les points de montage, en les +déplaçant. Comme cela se fait sans démonter de partition, il est possible de le +faire même si un fichier est en cours d'utilisation. Il faut cependant veiller +à ce que les programmes suceptibles d'aller chercher un fichier à l'ancien +emplacement soit prévenu du changement. + +On utilise pour cela l'option `--move` de `mount(8)` : + +```shell +mount --move olddir newdir +``` + +Par exemple : + +```shell +mount --move /dev /newroot/dev +``` + +Il est courant de faire appel à cette option lorsque l'on souhaite changer la +racine de notre système de fichier : passer de l'initramfs au système au +booter, de notre système hôte au système d'un conteneur, ... ## `switch_root` ou `pivot_root`