Mount story writed
This commit is contained in:
parent
58a228ef2d
commit
ff75a07312
@ -5,9 +5,226 @@ Des particularités de `mount`
|
|||||||
|
|
||||||
## Les points de montage
|
## 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`
|
## `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`
|
## `switch_root` ou `pivot_root`
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user