chroot (Français)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale-modified.pngLa traduction de cet article ou section ne reflète pas le texte original.Tango-preferences-desktop-locale-modified.png

Raison: Cet article ne respecte pas la structure de sa version anglophone, merci de le réécrire en conséquence. Vous pouvez aussi ajouter à la version anglophone les informations à-jour et dignes d’intérêt qui ne seraient portées que par la version francophone. Voir ArchWiki:Translation Team (Français) (Discuss in Talk: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).

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 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:

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 prenant en charge (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 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 commande poweroff (en root) dans ladite machine, ou bien utiliser la commande machinectl 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.

Astuce: Depuis une machine Debian tournant avec systemd un paquet spécifique doit avoir été installé : 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/
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