tuto4 ready

This commit is contained in:
nemunaire 2022-11-11 10:14:16 +01:00
commit e928733d61
17 changed files with 789 additions and 203 deletions

View file

@ -1,5 +1,3 @@
\newpage
Le *namespace* `mount`
----------------------
@ -20,7 +18,7 @@ montage, récursivement, dès que l'on est entré dans notre nouvel espace de
noms.
<div lang="en-US">
```bash
```
mount --make-rslave /
```
</div>
@ -45,7 +43,7 @@ montage virtuels. Le changement de racine sera donc effectif uniquement dans
cet espace de noms.
#### L'environnement
#### 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
@ -55,7 +53,7 @@ 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` :
<div lang="en-US">
```bash
```
42sh# mkdir /mnt/newroot
42sh# mount -t tmpfs none /mnt/newroot
```
@ -75,7 +73,7 @@ Voici les grandes étapes du changement de racine :
3. `pivot_root` !
#### S'isoler
#### S'isoler\
Notre but étant de démonter toutes les partitions superflues, nous allons
devoir nous isoler sur :
@ -89,48 +87,54 @@ devoir nous isoler sur :
Isolons-nous :
<div lang="en-US">
```bash
```
42sh# unshare -p -m -f --mount-proc
```
</div>
::::: {.warning}
#### Dissocier la propagation des démontages
Attention ! avant de pouvoir commencer à démonter les partitions, il faut
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*.
:::::
#### Dissocier la propagation des démontages\
Commençons donc par étiqueter tous nos points de montage (de ce *namespace*),
comme esclaves :
<div lang="en-US">
```bash
```
42sh# mount --make-rslave /
```
</div>
#### Démonter tout !
#### 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 !
#### 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`\
##### `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`\
##### `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é
@ -147,9 +151,58 @@ Pour lancer la première commande dans la nouvelle racine, on passe généraleme
par :
<div lang="en-US">
```bash
```
42sh# exec chroot / command
```
</div>
#### Erreurs courantes {-}
\
Voici une liste des erreurs les plus courantes que vous allez sans doute rencontrer :
`EINVAL`
: - La nouvelle racine n'est pas un point de montage.
: - Le chemin où placer l'ancienne racine n'est pas sur la nouvelle racine.
: - Le point de montage de la nouvelle ou l'ancienne racine utilise le type de propagation *shared*.
`EBUSY`
: La nouvelle racine ou le chemin où mettre l'ancienne racine se trouve sur la racine actuelle.
`ENOTDIR`
: La nouvelle racine ou le chemin où mettre l'ancienne racine ne sont pas des dossiers.
`EPERM`
: Le processus appelant ne dispose pas de la capability `CAP_SYS_ADMIN`.
Vous pouvez retrouver toutes les erreurs dans le manuel de `pivot_root(2)`.
#### Assemblage {-}
\
Vous devriez maintenant pouvoir réaliser un script `myswitch_root.sh` qui
enchaîne toutes les étapes précédentes.
On considère préalablement que l'environnement est propice à la réalisation de ce script :
<div lang="en-US">
```
42sh# mkdir -p /mnt/newroot
42sh# mount -t tmpfs none /mnt/newroot
42sh# wget https://dl-cdn.alpinelinux.org/alpine/v3.14/releases/x86_64/alpine-minirootfs-3.14.8-x86_64.tar.gz
42sh# tar xpf alpine-minirootfs-*.tar.gz -C /mnt/newroot
42sh# cd /
```
</div>
Puis on s'attend à le lancer ainsi :
<div lang="en-US">
```
42sh# ~/myswitch_root.sh /mnt/newroot /bin/bash
innewns# _
```
</div>
:::::