virli/tutorial/3/chroot.md

2.6 KiB
Raw Blame History

\newpage

L'isolation ... du pauvre

Depuis les premières versions d'Unix, il est possible de changer le répertoire 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.

Mise en place de l'environnement

Pour se créer un environnement afin de changer notre racine, il va falloir commencer par créer le dossier de notre nouvelle racine :

```bash mkdir newroot ```

busybox

Queques mots, pour commencer, à propos du projet Busybox : 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\ :

```bash cp $(which busybox) newroot/ chroot newroot /busybox ash ```

Jusque là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour bash :

```bash 42sh$ cp $(which bash) newroot/ 42sh# chroot newroot /bash chroot: failed to run command bash: No such file or directory ```

De quel fichier est-il question ici ?

debootstrap

debootstrap est le programme utilisé par l'installeur des distributions Debian et ses dérivées. Il permet d'installer dans un dossier (en général, ce dossier correspond au point de montage de la nouvelle racine choisie par l'utilisateur lors de l'installation) le système de base.

```bash debootstrap buster newroot/ http://httpredir.debian.org/debian/ ```

pacstrap est le programme équivalent pour Archlinux.

stage3

Les distributions à l'ancienne proposent encore de télécharger leur système de base sous forme de tarball\ :

L'avantage de télécharger l'archive de Gentoo est que l'on a déjà gcc dans un environnement qui tient dans 300 MB.

Exercice {-}

Écrivons maintenant un programme dont le seul but est de s'échapper du chroot :

```bash make escape echo bar > ../foo chroot . ```

Dans le nouvel environnement, vous ne devriez pas pouvoir faire :

```bash cat ../foo ```

Mais une fois votre programme escape exécuté, vous devriez pouvoir !

``` (chroot) 42sh# ./escape bash# cat /path/to/foo ```