New part on pivot_root

This commit is contained in:
nemunaire 2016-10-20 00:39:34 +02:00
parent ff75a07312
commit a5249d48a5
3 changed files with 131 additions and 3 deletions

View File

@ -1,4 +1,4 @@
SOURCES = tutorial.md mount.md namespaces.md networkns.md userns.md pidns.md clone.md seccomp.md project.md
SOURCES = tutorial.md mount.md namespaces.md networkns.md pidns.md mountns.md userns.md clone.md seccomp.md project.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \

View File

@ -226,8 +226,6 @@ 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`
## Aller plus loin

130
tutorial/4/mountns.md Normal file
View File

@ -0,0 +1,130 @@
\newpage
Le *namespace* `mount`
======================
## Introduction
Le *namespace* `mount`, comme nous l'avons vu au chapitre précédent, permet
d'isoler la vision du système de fichiers qu'à un processus et ses fils.
Peut-être que l'on peut trouver avec ça, un moyen de faire un `chroot` plus sûr ?
## Préparation du changement de racine
### Avant propos
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
l'arborescence !
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.
### L'environnement
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.
Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` :
```shell
mkdir /mnt/newroot
mount -t tmpfs none /mnt/newroot
```
Placez ensuite dans cette nouvelle racine le système de votre choix (cf. le TP
précédent pour les différentes méthodes et liens).
## Changer de racine
Voici les grandes étapes du changement de racine :
1. S'isoler dans les *namespaces* adéquats ;
2. Démonter ou déplacer toutes les partitions de l'ancienne racine vers la
nouvelle racine ;
3. `pivot_root` !
### S'isoler
Notre but étant de démonter toutes les partitions superflues, nous allons
devoir nous isoler sur :
* les points de montages, ça semble évident ;
* les PIDs : car on ne pourra pas démonter une partition en cours
d'utilisation. S'il n'y a pas de processus, il n'y a personne pour nous
empêcher de démonter une partition !
* les autres *namespaces* ne sont pas forcément nécessaires.
Isolons-nous :
```shell
unshare -p -m -f --mount-proc
```
### Dissocier la propagation des démontages
Attention ! avant de pouvoir commencer à démonter les partitions, il faut
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*),
comme esclave :
```shell
mount --make-rslave /
```
### Démonter tout !
À vous maintenant de démonter vos points d'attache. Il ne devrait vous rester
après cette étape que : `/`, `/dev`, `/sys`, `/proc`, `/run` et leurs fils.
### Switch !
À ce stade, dans votre console, vous avez plusieurs solutions : utiliser
`switch_root(8)` ou `pivot_root(8)`. La première abstrait plus de choses que la
seconde.
#### `switch_root`
Cette commande s'occupe de déplacer les partitions restantes pour vous, et lance
la première commande (*init*) de votre choix.
#### `pivot_root`
Cette commande, plus proche du fonctionnement de l'appel système
`pivot_root(2)`, requiert de notre part que nous ayons préalablement déplacées
les partitions systèmes à leur place dans la nouvelle racine.
L'appel de la commande, qui prend en argument le chemin de la nouvelle racine
et le chemin dans la nouvelle racine où placer l'ancienne, va donc intervertir
les deux racines.
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
par :
```shell
exec chroot / command
```