From a5249d48a55f56ce7616b12672d81b6bc16bf691 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Thu, 20 Oct 2016 00:39:34 +0200 Subject: [PATCH] New part on pivot_root --- tutorial/4/Makefile | 2 +- tutorial/4/mount.md | 2 - tutorial/4/mountns.md | 130 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 tutorial/4/mountns.md diff --git a/tutorial/4/Makefile b/tutorial/4/Makefile index a904ca8..99965da 100644 --- a/tutorial/4/Makefile +++ b/tutorial/4/Makefile @@ -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 \ diff --git a/tutorial/4/mount.md b/tutorial/4/mount.md index f4128a4..b4a7b93 100644 --- a/tutorial/4/mount.md +++ b/tutorial/4/mount.md @@ -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 diff --git a/tutorial/4/mountns.md b/tutorial/4/mountns.md new file mode 100644 index 0000000..b73a2c1 --- /dev/null +++ b/tutorial/4/mountns.md @@ -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 +```