Un chroot pour réparer une installation
Un chroot est une opération qui modifie le répertoire root courant pour le processus en cours et les processus enfants. Les applications lancées dans ce chroot n’ont plus accès aux fichiers à l’extérieur du chroot. Cela permet donc d’isoler un processus.
Il y a plusieurs usages possibles pour un chroot; un des usages est de pouvoir modifier ou administrer une distribution inactive. Un exemple? Vous n’arrivez plus à booter votre Linux parce que Grub est corrompu. Vous savez pourtant qu’il suffirait de lancer la commande update-grub pour que tout rentre dans l’ordre. Coment arriver à lancer cette commande comme si votre Linux était actif? La solution est évidemment de lancer un LiveCD, de monter votre installation de Linux et de créer un chroot pour que le root directory devienne celui de votre installation et non plus celui du LiveCD.
Imaginons que le système Linux à réparer se trouve sur sda1. Il faut commencer par monter le disque dans /mnt par exemple:
$ sudo mount /dev/sda1 /mnt
Il faut aussi monter le système de fichiers /dev:
$ sudo mount --bind /dev /mnt/dev/
Maintenant, on peut créer le chroot proprement dit. Il existe une commande pour cela qui s’appelle…chroot !
$ sudo chroot /mnt
A partir de maintenant, sudo n’est plus nécessaire puisque nous sommes dans le chroot avec des droits root. On peut lancer les commandes nécessaires pour réparer notre installation:
# update-grub
Une fois le système réparé, on sort du chroot et on démonte les systèmes de fichiers:
# exit $ sudo umount /mnt/dev $ sudo umount /mnt
Notez que si votre /home est sur une partition séparée, par exemple sda5, il faudra aussi la monter avant de faire le chroot:
$ sudo mount /dev/sda5 /mnt/home
De même si /boot est sur une partition séparée.
Dépendant de ce que vous devez faire dans le chroot, vous serez peut-être amener à monter aussi le système de fichiers /proc ou /sys:
$ sudo mount -t proc /proc /mnt/proc $ sudo mount -t sysfs /sys /mnt/sys
J’ai donné ici l’exemple d’une réparation de Grub dans le chroot mais on peut bien évidemment y faire d’autre chose; installer des paquets, modifier des fichiers de configs, accéder au réseau, toutes choses qui peuvent être utiles pour restaurer votre Linux.
Posted: mars 21st, 2010 under Ubuntu.
Comments: 1
Tweet
Comment from Épictète
Time: 14 juin 2010, 12 h 34 min
Il faut bien noter que le remplacement du répertoire racine implique le remplacement aussi des commandes.
Le répertoire racine est hérité par tous les enfants du processus ayant fait le changement, c’est-à-dire le terminal, qui ira donc chercher toute commande tapée dans ce terminal à partir de ce moment-là dans l’arborescence cible.
Exemple : dans le système origine, le paquet grub-pc est est dans sa version 20080724 et quand on passe au système cible, il est dans sa version 20090725 :
$ aptitude show grub-pc | grep Version
Version : 1.96+20080724-12ubuntu2
$
$ sudo chroot /media/HUIT
root@ubuntu-bqf:/#
root@ubuntu-bqf:/# aptitude show grub-pc| grep Version
Version : 1.96+20090725-1ubuntu1
chroot conduit donc à travailler sur l’arborescence cible mais aussi avec les seules commandes présentes dans l’arborescence cible.
Si on essaie d’utiliser une commande qui n’est pas installée dans le système cible, chroot renverra une erreur.
Exemple : dans le système origine, on peut appeler ddrescue qui y est installé mais l’appel après le chroot renvoie une erreur car cette commande n’est pas installée dans le système cible :
$ ddrescue –version
GNU ddrescue version 1.2
Copyright (C) 2006 Antonio Diaz Diaz.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
$
$ sudo chroot /media/HUIT
root@ubuntu-bqf:/#
root@ubuntu-bqf:/# ddrescue –version
bash: /proc/self/stat: Aucun fichier ou dossier de ce type
bash: test: 17038 : opérateur unaire attendu
Le programme « ddrescue » n’est pas installé actuellement. Vous pouvez l’installer en tapant :
apt-get install gddrescue
bash: ddrescue : commande introuvable
Ainsi il faut faire attention si on utilise System Rescue CD comme outil de sauvetage.
Lors d’un chroot, une erreur est souvent générée par le fait que SRCD utilise zsh comme shell et non bash comme la plupart des distributions. Donc lorsque le shell courant de SRCD bascule sur le système cible du chroot et essaye d’y lancer “zsh” en exécutant ”/bin/zsh” qui n’y est généralement pas présent cela génère l’erreur : «/bin/zsh: no such file or directory ».
Ainsi pour utiliser le shell bash généralement installé par défaut, il faut utiliser comme commande de chroot :
chroot /mnt/systeme_cible/ bin/bash