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.

Sommaire


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
[test]
description=Chroot test
type=directory
directory=/opt/chroot_env
groups=users
profile=minimal
setup.fstab=test/fstab
# Si l'environnement est en 32 bits et que vous êtes en 64, dé-commentez la ligne suivante
#personality=linux32

Créons aussi le fichier fstab :

Fichier: /etc/schroot/test/config
/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
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
  ─── 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

Utilisation

$ schroot -c test
(chroot: test) ~ $
$ schroot -c test -- mount
/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)
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
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)

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
Spawning namespace container on /opt/chroot_env (console is /dev/pts/3).
[tuxce@archtest ~]$
Note: Pour un environnement i686 sur du x86_64, le -u échoue.
Outils personnels