virli/tutorial/4/mount.md

312 lines
10 KiB
Markdown
Raw Normal View History

2016-10-19 03:24:05 +00:00
\newpage
2017-11-09 00:30:41 +00:00
Des particularités de `mount` {#mount}
2016-10-19 03:24:05 +00:00
=============================
2021-10-31 19:51:17 +00:00
Petite parenthèse avant de parler des *namespaces*, car nous avons encore
besoin d'appréhender un certain nombre de concepts relatifs aux montages de
systèmes de fichiers.
2019-11-03 17:54:22 +00:00
2016-10-19 03:24:05 +00:00
## Les points de montage
2016-10-19 21:31:04 +00:00
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
2016-10-19 21:31:04 +00:00
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 précédemment.
2016-10-19 21:31:04 +00:00
Mais avez-vous déjà essayé de monter la même partition d'un disque physique à
deux endroits différents de votre arborescence ?
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
Si pour plein de raisons on pouvait se dire que cela ne devrait pas être
2016-10-19 21:31:04 +00:00
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'accroche dans l'arborescence : et par exemple, une partition ne
2016-10-19 21:31:04 +00:00
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.
2017-11-09 00:30:41 +00:00
La commande `findmnt(1)`, des
[`util-linux`](https://www.kernel.org/pub/linux/utils/util-linux/) nous permet
d'avoir une vision arborescente des points de montage en cours d'utilisation.
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
<div lang="en-US">
```
TARGET SOURCE FSTYPE OPTIONS
2022-05-04 09:18:16 +00:00
/ /dev/sda1 ext4 rw,data=ordered,...
/proc proc proc rw,nosuid,nodev,...
/sys sysfs sysfs rw,nosuid,nodev,...
├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,...
├─/sys/firmware/efi/efivars efivarfs efivarfs ro,relatime
2022-05-04 09:18:16 +00:00
└─/sys/fs/cgroup cgroup_root tmpfs rw,nosuid,...
├─/sys/fs/cgroup/unified none cgroup2 rw,nsdelegate,...
├─/sys/fs/cgroup/cpuset cpuset cgroup rw,nosuid,cpuset,...
├─/sys/fs/cgroup/cpu cpu cgroup rw,nosuid,cpu,...
├─/sys/fs/cgroup/cpuacct cpuacct cgroup rw,nosuid,cpuacct,...
├─/sys/fs/cgroup/blkio blkio cgroup rw,nosuid,blkio,...
├─/sys/fs/cgroup/memory memory cgroup rw,nosuid,memory,...
├─/sys/fs/cgroup/devices devices cgroup rw,nosuid,devices,...
├─/sys/fs/cgroup/freezer freezer cgroup rw,nosuid,freezer,...
├─/sys/fs/cgroup/net_cls net_cls cgroup rw,nosuid,net_cls,...
├─/sys/fs/cgroup/perf_event perf_event cgroup rw,nosuid,p_event,...
├─/sys/fs/cgroup/net_prio net_prio cgroup rw,nosuid,net_pri,...
└─/sys/fs/cgroup/pids pids cgroup rw,nosuid,pids,...
/dev devtmpfs devtmpfs rw,nosuid,size=...
├─/dev/pts devpts devpts rw,nosuid,gid=5,...
├─/dev/shm tmpfs tmpfs rw
2022-05-04 09:18:16 +00:00
└─/dev/mqueue mqueue mqueue rw,nosuid,nodev,...
/home /dev/sda3 ext4 rw,nosuid,nodev,...
/run tmpfs tmpfs rw,mode=755,...
/tmp tmpfs tmpfs rw,nosuid,nodev,...
2017-11-09 00:30:41 +00:00
```
</div>
2016-10-19 21:31:04 +00:00
2021-10-31 19:51:17 +00:00
## `bind` -- montage miroir
2016-10-19 03:24:05 +00:00
2016-10-19 21:31:04 +00:00
Lorsque l'on souhaite monter à un deuxième endroit (ou plus) une partition, on
utilise le *bind mount* :
2017-11-09 00:30:41 +00:00
<div lang="en-US">
```bash
mount --bind olddir newdir
2017-11-09 00:30:41 +00:00
```
</div>
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
Lorsque l'on souhaite `chroot` dans 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
certains points de montage, tels que `/dev`, `/proc` et `/sys`.
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
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
2017-11-09 00:30:41 +00:00
le `/etc/fstab`, vous ne pourrez pas utiliser `top` ou `ps`, `sysctl` ne pourra
pas accorder les paramètres du noyau, ...
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
Pour que tout cela fonctionne, nous aurons besoin, au préalable, d'exécuter les
commandes suivantes :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
cd newroot
mount --bind /dev dev
mount --bind /proc proc
mount --bind /sys sys
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
En se `chroot`ant à nouveau dans cette nouvelle racine, tous nos outils
fonctionneront comme prévu.
2016-10-19 21:31:04 +00:00
Tous ? ... en fait non. Si l'on jette un œil à `findmnt(1)`, nous constatons
2016-10-19 21:31:04 +00:00
par exemple que `/sys/fs/cgroup` dans notre nouvelle racine est vide, alors que
2017-11-09 00:30:41 +00:00
celui de notre machine hôte contient bien les répertoires de nos *cgroups*.
2016-10-19 21:31:04 +00:00
`--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 :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
cd newroot
mount --rbind /dev dev
mount -t proc none proc
mount --rbind /sys sys
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
2021-10-31 19:51:17 +00:00
## Les types de propagation des points de montage
2016-10-19 21:31:04 +00:00
On distingue quatre variétés de propagation des montages pour un sous-arbre :
2016-10-19 21:31:04 +00:00
partagé, esclave, privé et non-attachable.
2017-11-09 00:30:41 +00:00
Chacun va agir sur la manière dont seront propagées les nouvelles accroches au
sein d'un système de fichiers attaché à plusieurs endroits.
2016-10-19 21:31:04 +00:00
### partagé -- *shared mount*
2018-11-06 13:44:59 +00:00
Dans un montage partagé, une nouvelle accroche sera propagée parmi tous les
2019-11-03 17:54:22 +00:00
systèmes de fichiers de ce partage (on parle de *peer group*). Voyons avec un
exemple :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
# Création de notre répertoire de travail
mkdir /mnt/test-shared
2016-10-19 21:31:04 +00:00
# On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared
mount --make-shared /tmp
2016-10-19 21:31:04 +00:00
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
mount --bind /tmp /mnt/test-shared
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
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 :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mkdir /mnt/test-shared/toto
mount -t tmpfs none /mnt/test-shared/toto
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
Un coup de `findmnt` nous montre l'existence de deux nouveaux points de
2017-11-09 00:30:41 +00:00
montage. À `/mnt/test-shared/toto`, mais également à `/tmp/toto`.
2016-10-19 21:31:04 +00:00
### 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
2017-11-09 00:30:41 +00:00
esclave ne propagera pas ses nouveaux points de montage à son *maître*.
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
# Suite de l'exemple précédent
cd /mnt/test-slave
2016-10-19 21:31:04 +00:00
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
mount --bind /mnt/test-shared /mnt/test-slave
2016-10-19 21:31:04 +00:00
# On rend notre dossier esclave
mount --make-slave /mnt/test-slave
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
Si l'on effectue un montage dans `/mnt/test-shared` :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mkdir /mnt/test-shared/foo
mount -t tmpfs none /mnt/test-shared/foo
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
2022-11-11 09:14:16 +00:00
Le point de montage apparaît bien sous `/mnt/test-slave/foo`.
Par contre :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mkdir /mnt/test-slave/bar
mount -t tmpfs none /mnt/test-slave/bar
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
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 tout
2017-11-09 00:30:41 +00:00
simplement pas propagés.
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
Pour forcer un point d'accroche à ne pas propager et à ne pas recevoir de
propagation, on utilise l'option suivante :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mount --make-private mountpoint
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
### non-attachable -- *unbindable mount*
2021-09-11 12:41:43 +00:00
Ce mode interdira toute tentative d'attache à un autre endroit.
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mount --make-unbindable /mnt/test-slave
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
Il ne sera pas possible de faire :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mkdir /mnt/test-unbindable
mount --bind /mnt/test-slave /mnt/test-unbindable
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
2021-10-31 19:51:17 +00:00
### Propagation récursive
2016-10-19 21:31:04 +00:00
2017-11-09 00:30:41 +00:00
Les options que nous venons de voir s'appliquent sur un point de montage. Il
2016-10-19 21:31:04 +00:00
existe les mêmes options pour les appliquer en cascade sur les points d'attache
contenus dans leur sous-arbre :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mount --make-rshared mountpoint
mount --make-rslave mountpoint
mount --make-rprivate mountpoint
mount --make-runbindable mountpoint
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
2021-10-31 19:51:17 +00:00
## Montage miroir de dossiers et de fichiers
2016-10-19 21:31:04 +00:00
Il n'est pas nécessaire que le point d'accroche que l'on cherche à dupliquer
pointe sur un point de montage (c'est-à-dire, dans la plupart des cas : une
2017-11-09 00:30:41 +00:00
partition ou un système de fichiers virtuel). Il peut parfaitement pointer sur
un dossier, et même sur un simple fichier, à la manière d'un *hardlink*, mais
2021-09-11 12:41:43 +00:00
que l'on pourrait faire entre plusieurs partitions et qui ne persisterait pas
au redémarrage (le *hardlink* persiste au redémarrage, mais doit se faire au
sein d'une même partition).
2016-10-19 21:31:04 +00:00
2021-10-31 19:51:17 +00:00
Nous verrons dans la partie [*namespace* réseau](#net-ns) une utilisation
2019-11-03 17:54:22 +00:00
d'attache sur un fichier.
2016-10-19 21:31:04 +00:00
## Déplacer un point de montage
2017-11-09 00:30:41 +00:00
À tout moment, il est possible de réorganiser les points de montage, en les
2016-10-19 21:31:04 +00:00
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
2017-11-09 00:30:41 +00:00
à ce que les programmes susceptibles d'aller chercher un fichier à l'ancien
2019-11-03 17:54:22 +00:00
emplacement soient prévenus du changement.
2016-10-19 21:31:04 +00:00
Pour déplacer un point de montage, on utilise l'option `--move` de `mount(8)` :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mount --move olddir newdir
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
Par exemple :
2016-10-19 21:31:04 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mount --move /dev /newroot/dev
2016-10-19 21:31:04 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 21:31:04 +00:00
2022-11-11 09:14:16 +00:00
::::: {.question}
#### Quand a-t-on besoin de déplacer un point de montage ? {-}
\
2021-09-11 12:41:43 +00:00
Cette possibilité s'emploie notamment lorsque l'on souhaite changer la racine
de notre système de fichiers : par exemple pour passer de l'*initramfs* au
2022-11-11 09:14:16 +00:00
système démarré, ou encore de notre système hôte au système d'un conteneur, ...
2016-10-19 03:24:05 +00:00
2022-11-11 09:14:16 +00:00
:::::
2016-10-19 03:24:05 +00:00
## Aller plus loin {-}
2016-10-19 03:24:05 +00:00
2017-11-09 00:30:41 +00:00
Voici quelques articles qui valent le détour, en lien avec les points de
2022-02-26 10:03:32 +00:00
montage :
2016-10-19 03:24:05 +00:00
2022-02-26 10:03:32 +00:00
* [Shared subtree](https://lwn.net/Articles/159077) (<https://lwn.net/Articles/159077>) et la
[documentation du noyau associée](https://kernel.org/doc/Documentation/filesystems/sharedsubtree.txt) (<https://kernel.org/doc/Documentation/filesystems/sharedsubtree.txt>) ;
* [Mount namespaces and shared subtrees](https://lwn.net/Articles/689856) : <https://lwn.net/Articles/689856> ;
2022-02-26 10:03:32 +00:00
* [Mount namespaces, mount propagation, and unbindable mounts](https://lwn.net/Articles/690679) : <https://lwn.net/Articles/690679>.