virli/tutorial/4/mountns.md

156 lines
4.5 KiB
Markdown
Raw Normal View History

2016-10-19 22:39:34 +00:00
\newpage
Le *namespace* `mount`
2021-10-31 19:51:17 +00:00
----------------------
2016-10-19 22:39:34 +00:00
2017-11-09 00:30:41 +00:00
L'espace de noms `mount` permet d'isoler la vision du système de fichiers
qu'ont un processus et ses fils.
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
Peut-être que l'on peut trouver avec ça, un moyen de faire un `chroot` plus sûr ?
2016-10-19 22:39:34 +00:00
2021-10-31 19:51:17 +00:00
::::: {.warning}
Attention il convient de prendre garde aux types de liaison existant entre vos
points de montage (voir la partie sur [les particularités des points de
montage](#mount)), car les montages et démontages pourraient alors être
répercutés dans l'espace de noms parent.\
2016-10-19 22:39:34 +00:00
2021-10-31 19:51:17 +00:00
Une manière rapide pour s'assurer que nos modifications ne sortiront pas de
notre *namespace* est d'appliquer le type esclave à l'ensemble de nos points de
montage, récursivement, dès que l'on est entré dans notre nouvel espace de
noms.
2016-10-19 22:39:34 +00:00
2021-10-31 19:51:17 +00:00
<div lang="en-US">
```bash
mount --make-rslave /
```
</div>
:::::
### Préparation du changement de racine
2016-10-19 22:39:34 +00:00
Nous allons essayer de changer la racine de notre système de fichier. À la
différence d'un `chroot(2)`, changer de racine est quelque chose d'un peu plus
sportif car il s'agit de ne plus avoir aucune trace de l'ancienne racine. Au
moins ici, il ne sera certainement pas possible de revenir en arrière dans
2022-02-24 19:43:43 +00:00
l'arborescence !
2016-10-19 22:39:34 +00:00
Pour l'instant, votre système utilise sans doute la partition d'un disque
physique comme racine de son système de fichier. Le changement de racine, va
nous permettre d'utiliser un autre système.
Bien sûr, nous n'allons pas changer la racine de votre système hôte, nous
allons faire cela dans un *namespace* qui nous permet d'avoir des points de
montage virtuels. Le changement de racine sera donc effectif uniquement dans
cet espace de noms.
2022-04-09 00:50:14 +00:00
#### L'environnement
2016-10-19 22:39:34 +00:00
Pour pouvoir changer de racine, il est nécessaire que la nouvelle racine soit
la racine d'un point de montage, comme l'explique `pivot_root(2)`. En effet, il
serait encore possible hypothétiquement de remonter dans l'arborescence si l'on
ne se trouvait pas à la racine d'une partition au moment du basculement.
2022-02-24 19:43:43 +00:00
Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` :
2016-10-19 22:39:34 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
42sh# mkdir /mnt/newroot
42sh# mount -t tmpfs none /mnt/newroot
2016-10-19 22:39:34 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
Placez ensuite dans cette nouvelle racine le système de votre choix.
2016-10-19 22:39:34 +00:00
::::: {.exercice}
2016-10-19 22:39:34 +00:00
### Changer de racine -- `myswitch_root.sh`
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
Voici les grandes étapes du changement de racine :
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
1. S'isoler dans les *namespaces* adéquats ;
2016-10-19 22:39:34 +00:00
2. Démonter ou déplacer toutes les partitions de l'ancienne racine vers la
2022-02-24 19:43:43 +00:00
nouvelle racine ;
3. `pivot_root` !
2016-10-19 22:39:34 +00:00
2022-04-09 00:50:14 +00:00
#### S'isoler
2016-10-19 22:39:34 +00:00
Notre but étant de démonter toutes les partitions superflues, nous allons
2022-02-24 19:43:43 +00:00
devoir nous isoler sur :
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
* les points de montages, ça semble évident ;
* les PIDs : car on ne pourra pas démonter une partition en cours
2016-10-19 22:39:34 +00:00
d'utilisation. S'il n'y a pas de processus, il n'y a personne pour nous
2022-02-24 19:43:43 +00:00
empêcher de démonter une partition !
2016-10-19 22:39:34 +00:00
* les autres *namespaces* ne sont pas forcément nécessaires.
2022-02-24 19:43:43 +00:00
Isolons-nous :
2016-10-19 22:39:34 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
42sh# unshare -p -m -f --mount-proc
2016-10-19 22:39:34 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 22:39:34 +00:00
2022-04-09 00:50:14 +00:00
#### Dissocier la propagation des démontages
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
Attention ! avant de pouvoir commencer à démonter les partitions, il faut
2016-10-19 22:39:34 +00:00
s'assurer que les démontages ne se propagent pas via une politique de *shared
mount*.
Commençons donc par étiqueter tous nos points de montage (de ce *namespace*),
2022-02-24 19:43:43 +00:00
comme esclaves :
2016-10-19 22:39:34 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
42sh# mount --make-rslave /
2016-10-19 22:39:34 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-19 22:39:34 +00:00
2022-04-09 00:50:14 +00:00
#### Démonter tout !
2016-10-19 22:39:34 +00:00
À vous maintenant de démonter vos points d'attache. Il ne devrait vous rester
2022-02-24 19:43:43 +00:00
après cette étape que : `/`, `/dev`, `/sys`, `/proc`, `/run` et leurs fils.
2016-10-19 22:39:34 +00:00
2022-04-09 00:50:14 +00:00
#### Switch !
2016-10-19 22:39:34 +00:00
2022-02-24 19:43:43 +00:00
À ce stade, dans votre console, vous avez plusieurs solutions : utiliser
2016-10-19 22:39:34 +00:00
`switch_root(8)` ou `pivot_root(8)`. La première abstrait plus de choses que la
seconde.
2021-10-31 19:51:17 +00:00
##### `switch_root`\
2016-10-19 22:39:34 +00:00
Cette commande s'occupe de déplacer les partitions restantes pour vous, et lance
la première commande (*init*) de votre choix.
2021-10-31 19:51:17 +00:00
##### `pivot_root`\
2016-10-19 22:39:34 +00:00
Cette commande, plus proche du fonctionnement de l'appel système
2017-11-09 00:30:41 +00:00
`pivot_root(2)`, requiert de notre part que nous ayons préalablement déplacé
2016-10-19 22:39:34 +00:00
les partitions systèmes à leur place dans la nouvelle racine.
2022-02-24 19:43:43 +00:00
L'appel de la commande sert à intervertir les deux racines ; elle prend en argument :
2017-11-09 00:30:41 +00:00
* le chemin de la nouvelle racine,
* le chemin dans la nouvelle racine où placer l'ancienne.
2016-10-19 22:39:34 +00:00
Une fois le pivot effectué, on peut démonter l'ancienne racine.
Pour lancer la première commande dans la nouvelle racine, on passe généralement
2022-02-24 19:43:43 +00:00
par :
2016-10-19 22:39:34 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
42sh# exec chroot / command
2016-10-19 22:39:34 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
:::::