Présentation

Le chroot (abréviation de CHanging ROOT) est un processus qui permet de changer la racine en entrant dans un environnement isolé. Un programme lancé dans cet environnement ne peut pas accéder aux fichiers et aux commandes du système hôte. Cet environnement modifié est appelé chroot jail (une prison).

Quand chrooter

Le chroot est généralement utilisé pour dépanner des systèmes qui ne démarrent pas ou bien où le logging est impossible. Quelques exemples courants :

Exigences

Avant de chrooter, assurez-vous de :

Utilisation

Changer de système

Cette technique est le plus souvent utilisée pour récupérer une installation endommagée.

Ici le chroot sera utilisé après le démarrage sur un système sain pour se retrouver dans l'environnement endommagé et faire des modifications directement dans ce dernier environnement.

Astuce : Vous pouvez taper

sudo -i

avant de faire les opérations suivantes pour devenir "root" et ne pas devoir entrer "sudo".

Démarrez sur un système sain. Par exemple : un live CD Montez la partition racine du système endommagé :

sudo mkdir /media/system
sudo mount </dev/partition> /media/system

par exemple, si sda2 est la partition racine, la commande sera :

sudo mount /dev/sda2 /media/system

Préparez les dossiers spéciaux /proc et /dev :

    sudo mount --bind /dev /media/system/dev
    sudo mount -t proc /proc /media/system/proc

Dans certains cas (réparation de Grub avec update-grub par exemple) vous devrez lier le /run :

sudo mount --bind /run  /media/system/run

Note : Vous pourriez aussi avoir besoin de monter /sys :

sudo mount -t sysfs /sys /media/system/sys

Pour démarrer la connexion internet:

net-setup eth0 

Copiez le /etc/resolv.conf pour la connexion internet (à faire seulement si votre connexion internet ne marche pas directement sans rien faire dans l'environnement chrooté) :

sudo cp /etc/resolv.conf /media/system/etc/resolv.conf

Changez d'environnement :

sudo chroot /media/system

En cas d'erreur à propos de "/bin/zsh" remplacer cette commande par

sudo chroot /media/system /bin/bash 

Maintenant vous êtes sur l'installation endommagée et vous pouvez travailler dessus pour y corriger les problèmes.

Pour quitter l'environnement, il suffit d'un :

exit

Pour démonter la partition racine du système endommagé :

sudo umount /media/system/dev
sudo umount /media/system/proc
sudo umount /media/system/sys
sudo umount /media/system/run
sudo umount /media/system

Exemple: Isoler Bash & Ls

sudo -i

Créer un répertoire pour l'isolation.

mkdir /mnt/mychroot

Créer le répertoire :

mkdir /mnt/mychroot/bin 

Copier bash & ls :

cp /bin/bash /bin/ls /mnt/mychroot/bin/

Rechercher les liens de bash & ls :

ldd /bin/bash /bin/ls
/bin/bash:
	linux-vdso.so.1 (0x00007ffe429f9000)
	libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fd135368000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd135164000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd134d73000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd1358ac000)
/bin/ls:
	linux-vdso.so.1 (0x00007fff551ba000)
	libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f357f84c000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f357f45b000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f357f1e9000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f357efe5000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f357fc96000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f357edc6000)

Créer les répertoires :

mkdir /mnt/mychroot/lib /mnt/mychroot/lib64
mkdir /mnt/mychroot/lib/x86_64-linux-gnu

Copier les librairies:

cp  /lib/x86_64-linux-gnu/libtinfo.so.5 /lib/x86_64-linux-gnu/libdl.so.2 /mnt/mychroot/lib
cp /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libselinux.so.1 /mnt/mychroot/lib
cp /lib/x86_64-linux-gnu/libpcre.so.3 /lib/x86_64-linux-gnu/libdl.so.2 /mnt/mychroot/lib
cp /lib/x86_64-linux-gnu/libpthread.so.0 /mnt/mychroot/lib
cp /lib64/ld-linux-x86-64.so.2 /mnt/mychroot/lib64

Chrooter :

chroot /mnt/mychroot

Essai :

pwd; ls

Exemple pratique avec une version 17.10 et 18.04

Le plus souvent, cette utilisation est faite à partir d'une clé USB d'installation de ubuntu. Ceci est un cas pratique fait en EFI sur partition système non chiffrée. Les commandes de préparation sont

setxkbmap fr       ### afin d'avoir un clavier français.
sudo -i            ### afin d'éviter de passer son temps à frapper cette commande

L'identification de la partition système à cibler sera plus aisée en frappant la commande

fdisk -l

Le montage de la partition système à cibler se fera en frappant la commande (pensez à remplacer XXXX par la bonne valeur).

mount   /dev/XXXX /mnt

Le montage des répertoires se fera avec ces commandes (copier/coller).

   mount -t proc  /proc              /mnt/proc
   mount -t sysfs /sys               /mnt/sys
   mount --bind   /dev               /mnt/dev
   mount --bind   /run               /mnt/run
   mount --bind   /sys               /mnt/sys
   mount --bind   /etc/resolv.conf   /mnt/etc/resolv.conf
   modprobe efivars     

Le changement d'environnement se fera avec cette commande

 chroot /mnt

Quelques contrôles seront à faire par exemple

mount -t devpts devpts /dev/pts 
df -h && df -i
ping -c4 8.8.8.8  && ping -c4 google.fr

Vous pouvez alors passer à la réparation proprement dite qui a justifié cette opération. Espérons simplement que ce message d'erreur "Running in chroot, ignoring request." n'empêchera pas votre réparation. Lorsque cela sera fini, le plus simple est de rebooter pour vérifier. La commande suivante s'occupe de toutes les déconnexions.

reboot

Créer un environnement Chroot avec debootstrap

Utilisez la commande debootstrap pour créer un nouvel environnement chroot:

sudo debootstrap trusty trusty/

This will create a directory trusty and install a minimal trusty system into it.

If your version of debootstrap does not know about Trusty you can try upgrading to the version in backports.

Vous pouvez alors travailler dans l’environnement chroot:

sudo chroot trusty

ou vous pouvez installer ou désinstaller le paquet que vous souhaitez sans affecter votre système principal.

Vous devriez copier vos clés GPG/ssh et votre configuration Bazaar dans l’environnement chroot de manière à accéder aux paquets et les signer directement:

sudo mkdir trusty/home/<username>
sudo cp -r ~/.gnupg ~/.ssh ~/.bazaar trusty/home/<username>

Pour empêcher apt et d’autres programmes de se plaindre de l’absence d’informations linguistiques, vous pouvez installer les paquets linguistiques adéquats:

apt-get install language-pack-en

Si vous voulez exécuter des programmes X, vous devez lier le répertoire /tmp dans le chroot, en dehors de chroot, exécutez:

sudo mount -t none -o bind /tmp trusty/tmp
xhost +

Certains programmes peuvent nécessiter que vous liez /dev ou /proc.