{{tag>système sécurité conteneur}} ====== Chroot : changement d'environnement ====== La commande ''[[man>chroot]]''(([[wpfr>chroot|Wikipédia]])) permet de changer le répertoire [[:arborescence#racine]], et ainsi l'environnement d'exécution //[[:shell]]// de l'utilisateur concerné ou d'applications, vers un nouvel environnement d'exécution. chroot arborescence shell/application Pour s'y retrouver, il faut avoir un minimum de connaissance sur les [[:partitions]] avant de se lancer seul dans l'aventure **chroot** ! ===== Utilisations courantes ===== Cette opération peut être utilisée dans divers cas : * prison : empêche un utilisateur ou un programme de remonter dans l'arborescence et le cantonne à une nouvelle arborescence restreinte. * changement de système : permet de basculer vers un autre système Linux (autre architecture, autre distribution, autre version). Nous détaillerons ici cette technique. * Isolation d'applications C'est une action logicielle qui consiste à protéger l'environnement système des faiblesses de sécurités d'une application. Pour cela on peut utiliser ''[[man>chroot]]'', ou [[:virtualisation|les conteneurs ou la virtualisation matérielle]]. Dans cette documentation nous traitons de la mise en place avec **chroot**. Le concept de **chroot**, de changements ou d'isolation d'environnement système utilisateurs (ou d'exécution d'applications), s'est étendu aux ressources du système d'exploitation avec la notion de conteneurs comme [[:lxc]], [[:docker]] (sans changement du logiciel système d'exploitation), et aux systèmes d'exploitation au niveau du matériel avec la [[:virtualisation]] ou les proxy matériels pur, les XénoServeur, comme [[:xen]]. Pour //chrooter// (changer de système) dans un système a réparer, il faut évidemment démarrer sur un système parfaitement sain au préalable. Si ce n'est pas le cas, il faut alors démarrer sur une session //[[:live USB]]//. ===== La pratique : Changer de système ===== Cette technique est le plus souvent utilisée pour récupérer une installation endommagée ou pour installer un nouveau système d'exploitation. 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. - Démarrez sur un système sain. Par exemple : un //live USB// - Montez la partition racine du système endommagé :sudo mkdir -v /media/system sudo mount /media/system par exemple, si ''sda2'' est la partition racine, la commande sera : sudo mount /dev/sda2 /media/system - Préparez les répertoires 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-pc|grub]] avec ''[[man>update-grub]]'' par exemple) il faut aussi lier le répertoire ''/run'' :sudo mount --bind /run /media/system/run - 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 fichier ''/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 toutes les partitions montées avec la partition racine du système endommagé lorsque vous avez terminé : sudo umount /media/system/{dev,proc,sys,run,} ==== Pour un système avec prise en charge de l'EFI : ==== Il s'agit de faire en sorte une fois le **chroot** exécuté de faire le nécessaire pour prendre en charge l'EFI. * le chroot (en condensé) :sudo mkdir -v /media/system && sudo mount -v /dev/ /media/system && sudo mount -v /dev/ /boot/efi && sudo mount -v --bind /dev /media/system/dev && sudo mount -vt proc /proc /media/system/proc && sudo mount -v --bind /run /media/system/run && sudo mount -vt sysfs /sys /media/system/sys && sudo chroot /media/system * le nécessaire pour prise en charge EFI :mount -t efivarfs none /sys/firmware/efi/efivars Ne pas oublier bien sûr de remplacer : '''' et '''' par ce qui convient. RAPPEL : il est possible d' obtenir les informations de partitions préalablement avec la commande suivante : lsblk -fe7 ==== Exemple pratique avec une version 18.04, 20.04, 22.04 et 24.04 ==== Le plus souvent, cette utilisation est faite à partir d'une clé USB d'installation d'Ubuntu. Ceci est un cas pratique fait en EFI avec une partition système non chiffrée. Les commandes de préparation sont : setxkbmap fr ### afin d'avoir un clavier français L'identification de la partition système à cibler sera plus aisée en tapant la commande : lsblk -fe7 Si cette commande montre que Ubuntu est installé dans une partition chiffrée, il est nécessaire de l'ouvrir pour y avoir accès. sudo cryptsetup luksOpen /dev/xxx part_dechiffree La partition système à cibler se monte en entrant la commande (pensez à remplacer ''XXXX'' par la bonne valeur). sudo mount /dev/XXXX /media/system ### Si pas chiffrée ou sudo mount /dev/mapper/part_dechiffree /media/system ### Si chiffrée ou sudo zpool import -a -f -l -R /media/system ### Si partition zfs standard Le montage des répertoires se fera avec ces commandes (copier/coller). sudo mount -t proc /proc /media/system/proc sudo mount -t sysfs /sys /media/system/sys sudo mount --bind /dev /media/system/dev sudo mount --bind /run /media/system/run sudo mount --bind /etc/resolv.conf /media/system/etc/resolv.conf sudo modprobe efivars Le changement d'environnement se fera avec cette commande sudo chroot /media/system Quelques contrôles seront à faire par exemple sudo mount -t devpts devpts /dev/pts df -h && df -i ping -c4 8.8.8.8 && ping -c4 google.fr ls -ls /home Vous pouvez alors passer à la réparation proprement dite qui a justifié cette opération. Espérons simplement que le message d'erreur ''Running in chroot, ignoring request.'' n'empêchera pas votre réparation. Lorsque cela sera fini, le plus simple est de redémarrer pour vérifier. La commande suivante s'occupe de toutes les déconnexions : sudo reboot ---- Dans le cas d'une partition chiffrée, si vous obtenez avec ''lsblk -fe7'' après avoir passé la commande ''sudo cryptsetup luksOpen /dev/xxx part_dechiffree'', quelque chose comme : └─nvme1n1p3 crypto 2 3d9739ab-61a7-415e-b1b5-81246666e518 └─part_dechiffree LVM2_m LVM2 aa6Ped-pjQi-dIWF-WFlx-mOnB-P9Pf-EGorvY ├─vgubuntu-root │ ext4 1.0 0f2dd8fb-a4d8-479c-9863-18f8bbcb73cd └─vgubuntu-swap_1 swap 1 9c94fa4c-f4b9-4efd-bda9-a8fa468b08fc il faut alors monter la partition racine endommagée avec la commande suivante : sudo mount /dev/mapper/vgubuntu-root /media/system ==== Multi-architecture ==== Vous pouvez aussi vouloir démarrer en **chroot** un système Linux d'une [[https://wiki.debian.org/RaspberryPi/qemu-user-static|autre architecture matérielle]]. Pour cela il vous faut installer les paquets ''[[apt>binfmt-support]]'' et ''[[apt>qemu-user-static]]''. Vous pouvez alors lister les architectures matérielles supportées : ls /usr/bin/qemu-*-static ou plus verbeux : sudo update-binfmts --display Pour démarrer le **chroot** en ARM 64 bits par exemple, et après avoir monté tout ce dont vous avez besoin pour fonctionner en **chroot** dans ''/media/system'' : cp /usr/bin/qemu-aarch64-static /media/system/usr/bin sudo chroot /media/system qemu-aarch64-static /bin/bash Vous pouvez aussi utiliser des commande comme ''[[man>proot]]'' pour passer des commandes en **chroot**. proot -S /chemin/répertoire_monté/ -q qemu-architecture-static commande_bash proot -S /media/system/ -q qemu-aarch64-static arch proot -S /media/system/ -q qemu-aarch64-static bash -c "if ping -c 1 doc.ubuntu-fr.org &> /dev/null; then echo 'Réseau OK'; else exit 1; fi" === Utiliser un environnement 32 bits sur une installation 64 bits === Cette option devient de plus en plus désuète puisque la plupart des machines sont maintenant en 64 bits. Préférez toujours utiliser **chroot** entre deux systèmes de même architecture.\\ //USB live// 32 bits pour une installation système 32 bits et de même pour 64 bits. cp /usr/bin/qemu-i386-static /path/folder_system_32bit/usr/bin sudo chroot /media/system qemu-i386-static /bin/bash Voir le tutoriel [[:tutoriel:chroot32bits]] pour approfondir. === Convertir un environnement 32 bits en environnement 64 bits === Il faut d'abord utiliser ''chroot'' tel que décrit ci-dessus. Il est préférable de mettre à jour le logiciel de façon classique. sudo apt update && sudo apt upgrade Puis de procéder à l'installation des modules 64 bits absents avec ces commandes : dpkg --add-architecture amd64 sudo apt-get update sudo apt-get install linux-image-amd64:amd64 ==== Pour un Ubuntu installé dans une partition BTRFS ==== Voir [[https://forum.ubuntu-fr.org/viewtopic.php?pid=22031607#p22031607|le forum]] ou [[:timeshift#restauration_depuis_une_autre_instance|la documentation]] ou aussi [[https://forum.ubuntu-fr.org/viewtopic.php?pid=22771420#p22771420|là]] et [[https://forum.endeavouros.com/t/chroot-into-a-btrfs-uefi-system-from-live-media/15986|en anglais]]. ==== Procédure pas à pas à partir d ' une session live ==== Insérez la clé USB contenant ubuntu dans un port de l' ordi . Démarre l ' ordi sur la clé et choisir " essayer ubuntu ". Ouvrez un terminal et entrez : sudo add-apt-repository universe multiverse -y && sudo apt update && sudo apt install arch-install-scripts -y [[:tutoriel:comment_installer_un_paquet|Installer le paquet]] ''[[apt>arch-install-scripts]]'' sudo apt install arch-install-scripts Repérer votre partition système endommagée avec : lsblk -fe7 | grep ext4 et noter son //block device// (ce qui suit ''/dev/''), puis monter votre partition système endommagée : sudo mount -v /dev/ /mnt en remplaçant '''' par le //block device// correspondant à votre partition système endommagée. sudo arch-chroot /mnt ===== Voir aussi ===== * [[:schroot]] * commande ''[[man>fakeroot-sysv|fakeroot]]'' * [[https://linuxfr.org/news/care-et-la-reproductibilite-des-executions|care]] * [[https://linuxfr.org/tags/cde/public|cde]] ---- //Contributeurs : [[:utilisateurs:Id2ndR]].//