chroot (Français)
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 :
- Réinstaller le chargeur d'amorçage (bootloader).
- Reconstruire les initramfs.
- Mettre à jour ou bien rétrograder des paquets.
- Réinitialiser un mot de passe oublié (en).
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 un système hôte en 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:
loadkeys fr
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
/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/
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
-
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
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 similaire à démarrer un deuxième système d'exploitation, ce n'est pas une machine virtuelle mais un conteneur.
cd /mnt systemd-nspawn
La syntaxe complète serait :
systemd-nspawn -b -D ~/MyContainer -n
- L'option
-b
démarre le système du conteneur (avec le PID=1), au lieu de simplement y ouvrir un shell. Pour quitter une machine virtuelle lancée avec cette option, il faut exécuter le commandepoweroff
(en root) dans ladite machine, ou bien utiliser la commandemachinectl
depuis l'hôte. - L'option
-D
spécifie le dossier-racine du conteneur. - L'option
-n
établit un réseau privé entre hôte et conteneur. Elle n'est pas nécessaire pour connecter la machine à Internet; au contraire, elle implique d'avoir créé un réseau privé. - Disponible ausi l'option
--bind
qui permet de monter un répertoire de l’hôte dans le conteneur; par exemple : --bind /var/cache/pacman/pkg:/var/cache/pacman/pkg-host.
Voir le wiki (en) pour plus de détails.
systemd-container
.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/
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