7.4 KiB
\newpage
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
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 :
# 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 :
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.
# 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
:
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 :
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 :
mount --make-private mountpoint
non-attachable -- unbindable mount
Ce mode interdira tout tentative d'attache à un autre endroit.
mount --make-unbindable /mnt/test-slave
Il ne sera pas possible de faire :
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)
:
mount --move olddir newdir
Par exemple :
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, ...
Aller plus loin
Voici quelques articles qui valent de détour :