Utilisation chroot

De ArchwikiFR

On peut être amené à avoir besoin d'environnements différents sur notre système sans pour autant avoir besoin de recourir à de la virtualisation. Un environnement 32 bits, les outils d'une distribution différente, un environnement vierge, etc. Ce besoin peut être comblé par l'utilisation d'un environnement chroot. Cette page regroupe différentes manière de les utiliser.

Note: Cette page ne couvre pas la construction d'un environnement chroot qui dépend de votre besoin, il existe néanmoins des exemples dans la page environnement chroot.

Pour les besoins de la page, nous prenons comme dossier racine de l'environnement /opt/chroot_env.

chroot

L'utilisation la plus basique reste celle avec la commande chroot :

mount -t proc proc /opt/chroot_env/proc
mount -t sysfs sys /opt/chroot_env/sys
mount -o bind /dev /opt/chroot_env/dev
mount -o bind /dev/pts /opt/chroot_env/dev/pts
chroot /opt/chroot_env commande_a_executer
umount /opt/chroot_env/dev/pts /opt/chroot_env/dev /opt/chroot_env/dev/sys /opt/chroot_env/dev/proc

schroot

schroot permet à un utilisateur de lancer une commande ou un shell dans un environnement chroot. L'avantage de cette commande est de pouvoir configurer assez finement l'environnement chroot. On peut définir les montages à faire systématiquement, les fichiers à copier depuis le système hôte, les scripts à lancer avant et/ou après etc. Vous pouvez vous reférer à man schroot et/ou man schroot.conf pour plus d'informations.

Installation

pacman -S schroot

Configuration

schroot lors de son lancement va exécuter un nombre de script afin de préparer l'environnement. Ces scripts se basent sur des fichiers de configuration regroupés par profile. Nous allons nous baser sur le profile minimal tout en spécifiant un fstab plus étoffé :

Fichier: /etc/schroot/chroot.d/test

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none">[test] description=Chroot test type=directory directory=/opt/chroot_env groups=users profile=minimal setup.fstab=test/fstab

  1. Si l'environnement est en 32 bits et que vous êtes en 64, dé-commentez la ligne suivante
  2. personality=linux32</pre<noinclude></noinclude>>

Créons aussi le fichier fstab :

Fichier: /etc/schroot/test/config

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none">/proc /proc none rw,bind 0 0 /sys /sys none rw,bind 0 0 /dev /dev none rw,bind 0 0 /dev/pts /dev/pts none rw,bind 0 0 none /dev/shm tmpfs defaults 0 0 /home /home none rw,bind 0 0 /tmp /tmp none rw,bind 0 0</pre<noinclude></noinclude>>

Attention: L'environnement qu'on a décrit ici reprendra entre autre notre dossier personnel. Ça peut être intéressant pour lancer des applications nécessitant un environnement i686 ou les outils d'une autre distribution.

Ceci dit, pour ne pas se mélanger, vous pouvez rajouter ceci dans votre ~/.bash_profile :

[[ $SCHROOT_CHROOT_NAME ]] && PS1="(chroot: $SCHROOT_CHROOT_NAME) $PS1"

On peut avoir un aperçu de la configuration finale avec :

$ schroot -c test -i

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0"> ─── Chroot ─── Nom test Description Chroot test Type directory Verbosité des messages normal Utilisateurs Groupes users Utilisateurs root Groupes root Alias Conservation de l'environnement faux Interpréteur de commandes par défaut Filtre d'environnement ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TERMPATH)$ Exécuter les scripts de configuration (« Setup Scripts ») vrai Profil de configuration minimal Script de configuration Session gérée (« Session Managed ») vrai Session clonée (« Session Cloned ») faux Session nettoyée (« Session Purged ») faux Répertoire /opt/chroot_env Personnalité undefined Clés modifiables par l'utilisateur Clés modifiables par le super-utilisateur Données utilisateur setup.config minimal/config setup.copyfiles minimal/copyfiles setup.fstab test/fstab setup.nssdatabases minimal/nssdatabases Type d'union de systèmes de fichiers none </pre<noinclude></noinclude>>

Utilisation

$ schroot -c test

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0">(chroot: test) ~ $</pre<noinclude></noinclude>>

$ schroot -c test -- mount

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0"> /dev/mapper/vgrp0-root on / type ext4 (rw,relatime,data=ordered) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) dev on /dev type devtmpfs (rw,nosuid,relatime,size=1956304k,nr_inodes=489076,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) /dev/mapper/vgrp0-home on /home type ext4 (rw,relatime,data=ordered) </pre<noinclude></noinclude>>

Note: Le message suivant s'affiche lors du lancement de la commande et la sortie du chroot :
E : 15binfmt: which: no update-binfmts in ...
Ça n'a pas d'incidence. Ça ne concerne que les chroot possédant des exécutables de formats différents.

Vous pouvez lancer une application graphique, par exemple:

schroot -p -c test -- xterm
Astuce: Selon l'environnement que vous utilisez, il se peut que l'application à lancer depuis le chroot nécessite l'installation de paquets supplémentaire. Si vous utilisez Gnome, par exemple, il vous faudra les libs de gnome aussi dans l'environnement chroot.

systemd-nspawn

Cette commande n'est disponible que si on utilise systemd. Pour lancer l'environnement :

# systemd-nspawn -D /opt/chroot_env

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0">Spawning namespace container on /opt/chroot_env (console is /dev/pts/3). [root@chroot_env ~]# mount /dev/mapper/vgrp0-root on / type ext4 (rw,relatime,data=ordered) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) proc on /proc/sys type proc (ro,relatime) sys on /sys type sysfs (ro,relatime) tmpfs on /dev type tmpfs (rw,nosuid,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755) devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /proc/kmsg type tmpfs (rw,nosuid,mode=755) /dev/mapper/vgrp0-root on /etc/resolv.conf type ext4 (ro,relatime,data=ordered)</pre<noinclude></noinclude>>

Ou si vous êtes en x86_64 et que le chroot est en i686 :

linux32 systemd-nspawn -D /opt/chroot_env

Contrairement à schroot, la commande est à lancer en root mais on peut lancer l'environnement pour un utilisateur particulier :

# systemd-nspawn -D /opt/chroot_env -u tuxce

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0">Spawning namespace container on /opt/chroot_env (console is /dev/pts/3). [tuxce@archtest ~]$</pre<noinclude></noinclude>>

Note: Pour un environnement i686 sur du x86_64, le -u échoue.