Chroot

De ArchwikiFR

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).

Note: Si vous avez atterri sur cette page en cherchant comment installer en chroot, ça se passe plutôt ici.

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 :

Cette méthode présente toutefois des limitations (voir Wikipedia (en)).

Exigences

Avant de chrooter, assurez-vous de :

  • Avoir le privilège root.
  • Avoir un autre environnement GNU/Linux, tel un LiveCD/USB, ou bien depuis une autre installation existante.
  • Avoir la même architecture entre les deux environnements (c'est-à-dire être depuis une distribution x86_64 pour chrooter une Arch x86_64). On peut trouver l'architecture de l'environnement courant avec la commande uname -m (le résultat étant i686 ou bien x86_64).
  • Avoir les modules noyaux nécessaires chargés qui serviront dans l'environnement chrooté.
  • Avoir son swap activé si nécessaire (swapon /dev/sdXY.
  • Avoir une connexion Internet fonctionnelle si nécessaire.

Montage des partitions

Pour chrooter dans un système sur lequel vous n'avez pas démarré, il faut préparer un minimum l'environnement. Prenons le cas où vous devez utiliser votre système Arch depuis un autre système GNU/Linux (LiveCD, autre installation, ...); en supposant que vous utilisez le dossier /mnt, vous devez monter au minimum les dossiers suivants:

Astuce: Vous venez de charger un LiveCD, et vous auriez plus de facilités en utilisant votre clavier français ; faites :
loadkeys fr
Note: Si vous utilisez LVM, munissez-vous d'un LiveCD le supportant (celui d'Arch par exemple) et avant les opérations de montage, activez-le en lançant :
vgchange -a y

Vous pouvez utiliser les commandes lsblk, fdisk -l ou blkid pour trouver les partitions de votre système.

Une fois les partitions repérées, procédez au montage :

mount /dev/sdXY /mnt
Note: /dev/sdXY étant la partition de votre racine (/).

N'oubliez pas de monter les partitions séparées si besoin (/boot, /boot/efi (la partition d'ESP, /home, /usr, /var, ...) dans le sous-répertoire approprié de /mnt.

Changement de racine

Il existe plusieurs méthodes pour procéder au chroot. La première étant propre à Arch, la deuxième plus générique dans le monde UNIX, et la troisième étant propre à Systemd.

En utilisant arch-chroot

Si vous êtes depuis le LiveCD d'Arch ou bien depuis une autre Arch où le paquet arch-install-scripts est installé, vous n'avez qu'une seule commande à faire (le script s'occupant de préparer au mieux l'environnement à chrooter).

Pour un chroot habituel :

arch-chroot /mnt

Pour exécuter un autre shell dans l'environnement chrooté (ici on veut utiliser Bash) :

arch-chroot /mnt /bin/bash

Pour exécuter une seule commande dans l'environnement chrooté (par exemple mkinitcpio -p linux) :

arch-chroot /mnt /usr/bin/mkinitcpio -p linux

En utilisant chroot

Il faut monter soi-même les systèmes de fichiers nécessaires au bon fonctionnement de l'environnement chrooté (pour éviter les commandes à rallonge, on utilise volontairement à la fois des chemins absolus et relatifs, soyez prudent) :

cd /mnt
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/

Et optionnellement :

mount --rbind /run run/

Pour utiliser une connexion Internet dans l'environnement chrooté, il faut copier les informations du DNS :

cp /etc/resolv.conf etc/
Astuce: Si vous souhaitez lancer des applications graphiques, vous serez peut-être amené à utiliser xhost + pour permettre au chroot d'accéder à X, une fois fini n'oubliez pas d'enlever cette autorisation avec xhost -.

Enfin le chroot :

chroot /mnt /bin/bash
Note: Si vous voyez une erreur :
  • chroot: cannot run command '/usr/bin/bash': Exec format error, c'est que l'architecture du système hôte est différente du système à chrooter.
  • chroot: '/usr/bin/bash': permission denied, remonter la partition avec l'option exec : mount -o remount,exec /mnt.

Une fois le chroot effectué, vous aurez peut-être besoin de charger la configuration de Bash :

source /etc/profile
source ~/.bashrc
Astuce: Pour différencier l'environnement chrooté, vous pouvez utiliser un prompt différent :
export PS1="(chroot) $PS1".

En utilisant systemd-nspawn

Bien que cette méthode soit similaire, ce n'est pas à proprement parler du chroot. Cette commande est plus puissante, elle virtualise l'ensemble du système à chrooter, comme si ce dernier était en cours d'exécution. C'est comme si un démarrait un deuxième OS sur la machine, mais ça n'est pas une machine virtuelle.

cd /mnt
systemd-nspawn

Quitter le chroot

Une fois les modifications terminées, utilisez exit pour sortir du chroot (ou encore Ctrl+D).

exit

Il faut enfin démonter ce que vous avez monté, en utilisant la commande umount:

cd /
umount --recursive /mnt/
Note: Si un message tel umount: /chemin: device is busy apparaît, c'est qu'un programme s'exécute toujours dans le chroot. Le moyen le plus propre consiste à terminer ce programme, puis à utiliser la commande mount pour localiser la ou les partitions qui n'ont pas été démontées, puis d'utiliser à nouveau umount. Si cela ne fonctionne toujours pas, utilisez umount --force, ou umount --lazy en dernier recours. Si le problème n'est toujours pas résolu, préférez un redémarrage pour éviter de futur conflits.

Et éventuellement redémarrer:

reboot