virli/tutorial/3/chroot.md

144 lines
4.0 KiB
Markdown
Raw Normal View History

2022-05-04 09:18:16 +00:00
L'isolation ... avec `chroot`
-----------------------------
2016-10-05 09:13:56 +00:00
2016-10-06 01:58:52 +00:00
Depuis les premières versions d'Unix, il est possible de changer le répertoire
2021-10-05 15:23:09 +00:00
vu comme étant la racine du système de fichiers. En anglais : *change root*:
`chroot`. Le processus effectuant cette action ainsi que tous ses fils verront
donc une racine différente du reste du système.\
2016-10-05 09:13:56 +00:00
Pour se créer un environnement afin de changer notre racine, il va falloir
2021-10-05 15:23:09 +00:00
commencer par créer le dossier de notre nouvelle racine, peu importe où dans
l'arborescence :
2016-10-05 09:13:56 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
mkdir newroot
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
Nous allons ensuite remplir ce dossier afin qu'il soit vraiment utilisable
comme une racine : rien n'est strictement obligatoire, on s'assure simplement
d'avoir de quoi bidouiller : un shell sera amplement suffisant pour commencer.
2016-10-05 09:13:56 +00:00
### `busybox`
2021-10-05 15:23:09 +00:00
Queques mots, pour commencer, à propos du projet Busybox : c'est un programme
couteau-suisse qui implémente tous les binaires vitaux pour avoir un système
fonctionnel et utilisable : `ls`, `sh`, `cat`, mais aussi `init`, `mdev` (un
`udev`-like, cela permet de découvrir les périphériques attachés afin de les
exposer dans `/dev` notamment). C'est un programme *linké* statiquement,
c'est-à-dire qu'il ne va pas chercher ni charger de bibliothèque dynamique à
son lancement. Il se suffit donc à lui-même dans un *chroot*, car il n'a pas de
dépendances. Nous pouvons donc tester notre première isolation :
2016-10-05 09:13:56 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
cp $(which busybox) newroot/
chroot newroot /busybox ash
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
Nous voici donc maintenant dans un nouveau shell (il s'agit d'`ash`, le shell
de `busybox`).
Jusque-là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
2021-10-05 15:23:09 +00:00
`bash` :
2017-10-22 22:14:32 +00:00
<div lang="en-US">
```bash
42sh$ cp $(which bash) newroot/
42sh# chroot newroot /bash
chroot: failed to run command bash: No such file or directory
2017-10-22 22:14:32 +00:00
```
</div>
2021-10-05 15:23:09 +00:00
De quel fichier est-il question ici ?
2017-10-22 22:14:32 +00:00
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
### `debootstrap`, `pacstrap`
2016-10-05 09:13:56 +00:00
`debootstrap` est le programme utilisé par l'installeur des distributions
2017-10-22 22:14:32 +00:00
Debian et ses dérivées. Il permet d'installer dans un dossier (en général, ce
2016-10-06 01:58:52 +00:00
dossier correspond au point de montage de la nouvelle racine choisie par
2016-10-05 09:13:56 +00:00
l'utilisateur lors de l'installation) le système de base.
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
2021-10-05 15:23:09 +00:00
debootstrap bullseye newroot/ http://httpredir.debian.org/debian/
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
`pacstrap` est le programme équivalent pour Arch Linux. Alors que `debootstrap`
peut s'utiliser depuis n'importe quel environnement ou distribution,
`pacstrap` nécessite d'avoir installé et configuré `pacman` (le gestionnaire de
paquets d'Arch Linux), ce qui est le cas si vous êtes sous Arch Linux ou ses
dérivées.
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
<div lang="en-US">
```bash
pacstrap newroot/
```
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
Dans les deux cas, nous nous retrouvons avec un dossier `newroot` contenant une
2022-02-24 19:43:43 +00:00
distribution complète minimale, dans laquelle nous pouvons entrer :
2016-10-05 09:13:56 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
2021-10-05 15:23:09 +00:00
chroot newroot/ bash
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
### Archives *stage3*, *miniroot*
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
Les distributions *à l'ancienne* proposent de télécharger leur système de base
sous forme de tarball :
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
2022-04-09 00:50:14 +00:00
#### Gentoo
2016-10-05 09:13:56 +00:00
2022-02-24 19:43:43 +00:00
<http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64-openrc/stage3-amd64-openrc-20211128T170532Z.tar.xz>
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
2021-10-05 15:23:09 +00:00
tar xpf stage3-amd64-*.tar.xz -C newroot/
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
::::: {.more}
L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans un
environnement qui tient dans 200 MB.
:::::
Comme pour les autres distributions vues précédemment, nous pouvons entrer dans
2022-02-24 19:43:43 +00:00
notre nouvelle racine comme ceci :
2016-10-05 09:13:56 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
2021-10-05 15:23:09 +00:00
chroot newroot/ bash
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-05 09:13:56 +00:00
2021-10-05 15:23:09 +00:00
2022-04-09 00:50:14 +00:00
#### Alpine
2016-10-05 09:13:56 +00:00
2022-02-24 19:43:43 +00:00
<https://dl-cdn.alpinelinux.org/alpine/v3.14/releases/x86_64/alpine-minirootfs-3.14.2-x86_64.tar.gz>
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2021-10-05 15:23:09 +00:00
```bash
tar xpf alpine-minirootfs-*.tar.xz -C newroot/
```
2021-10-05 15:23:09 +00:00
</div>
Alpine se contentant de Busybox pour son système de base, nous n'avons pas
2022-02-24 19:43:43 +00:00
`bash`, mais on peut tout de même lancer `ash` :
2021-10-05 15:23:09 +00:00
<div lang="en-US">
```bash
chroot newroot/ ash
2016-10-05 09:13:56 +00:00
```
2017-10-17 06:29:07 +00:00
</div>