Sommaire :
- État des lieux,
- Créer une image disque,
- L'utilitaire dd,
- L'utilitaire ddrescue,
- Montage des images,
- Les volumes logiques,
- Conclusion,
- Références.
Récemment j'ai été confronté à un problème de taille :
Mon serveur de fichier m'a lâché, avec dessus 1To de données. Alimentation HS et un disque avec des erreurs d'entrée / sortie.
Le problème aurait pu rester simple si je n'avais pas mis en place un VG éclaté sur trois disques durs dont 1 en scsi et 2 en sata.
Mais comme chaque problème à toujours sa solution sous GNU/Linux je vous propose la méthode que j'ai utilisé pour récupérer mes données.
Le premier réflexe à avoir pour tout problème concernant le stockage est de créer des images. En effet, travailler sur une image en plus d'être plus rapide, est plus sécurisé.
Si le fait de récupérer des données sur un média défecteux risque de dégrader celui-ci, l'image ne bougera pas et vous ne risquez pas de formater par erreur.
Pour cette étape, j'ai utilisé dd 1 et GNU ddrescue 2.
dd est réservé aux disques sains, en effet, à la première erreur celui-ci stoppera net. Mais sur un média propre je le trouve plus rapide.
ddrescue lui sera donc utilisé sur les disques contenant des erreurs. Cet outil est un peu le sauveur des médias HS. Non seulement il va continuer à créer l'image en évitant les secteurs erronés, mais en plus va tenter de les lire avec des tailles de blocs différents pour essayer de récupérer ceux-ci.
Le temps nécéssaire à la création des images sera bien-sûr en fonction de la taille de votre média. À titre d'exemple, il m'a fallut 2h pour les disques scsi en réseau, 30 minutes en local, 5 heures pour 500 gigas avec 3 secteurs HS et 8 heures pour 500 gigas avec plus de 130 secteurs HS.
Pour les disques scsi j'ai monté la carte sur une autre machine puis j'ai booté sur un liveUSB Fedora17. La machine de sauvegarde étant à distance je suis passé par le réseau :
Sur un terminal :
dd if=/dev/sdf | ssh user@192.168.1.x "dd of=/media/hdd/save/scsi01.img"
dd if=/dev/sdh | ssh user@192.168.1.x "dd of=/media/hdd/save/scsi02.img"
Ici, rien de compliqué : if= -> le média à sauvegarder of= -> l'image à créer. J'utilise un pipe pour envoyer les données via ssh puis dd sur la machine distante pour compléter la commande.
L'extension est accessoire et ne sert simplement qu'à se repérer plus facilement. De ce fait vous pouvez très bien ne rien mettre, sous GNU/Linux ce n'est pas un souci 3 !
Pour les disques sata avec les I/O errors, on va d'abord sauvergarder les secteurs sains du disque :
ddrescue -B -v -n /dev/sdb /media/save/seagate.img /media/save/seagate.log
Explication de la commande 4 :
l'option la plus importante ici est l'option -n, elle nous permet de ne copier que les secteurs sain. Ainsi ddrescue saute tout ce qui ne va pas et crée une première image.
L'option -B permet d'avoir les tailles et dimensions en binaire
L'option -v pour avoir un affichage de ce qu'il se passe.
Le premier paramètre est le disque à sauvegarder (non monté),
Le second est l'image dans laquelle sauvegarder les données,
Afin de pouvoir travailler sur la même image il faut spécifier à l'utilitaire un fichier de log qui sera déclaré à chaque appel de la commande sur un même disque. Ce fichier enregistrera les zones défectueuses, il sera ainsi possible revenir dessus plus tard pour travailler dessus sans à avoir à tout sauvegarder de nouveau.
ddrescue -B -v -c 16 -r 2 /dev/sdb /media/save/seagate.img /media/save/seagate.log
L'option -c 16 permet de lire les secteurs corrompus par blocs de 16 secteurs (par défaut 128).
L'option -r 2 pour faire deux passes.
Si vous avez toujours des erreurs, il faut refaire une lecture de celles-ci secteur par secteur (et avec 5 passes) afin de récupérer le maximum de données, et ce autant de fois que nécéssaire pour que ddrecue vous affiche un joli "finished !".
ddrescue -B -v -c 1 -r 5 /dev/sdb /media/save/seagate.img /media/save/seagate.log
Pour mon disque contenant plus de 130 I/O erros, j'ai du le faire dix fois (donc 50 passes !) et toutes les données ont été récupérées.
Cette étape consiste à monter les images disque sur la machine de sauvegarde. Non pas un montage classique de système de fichiers car ça ne fonctionnerait pas avec des VG mais un montage en "bloc disque" qui se compare à une représentation d'un disque physique dans /dev afin d'avoir accès aux commandes lvm dessus. C'est à ma connaissance le seul moyen de travailler des images de volumes logiques.
Pour pouvoir monter ces images en bloc nous avons besoin de l'utilitaire losetup 5 qui permet de créer des disques dur virtuels à partir d'image.
Il y a deux façon de monter l'image, la première, plus simple est disponible si le module loop n'a pas été compilé en dur dans le noyau, quand à la seconde, je ne l'expliquerai pas ici (ne l'ayant pas utilisée) je vous laisse le soin de suivre le lien dans mes références6.
Si vous avez plusieurs partitions, afin qu'elle soient toutes disponibles, il faut décharger puis charger le module loop avec les bons paramètres :
modprobe -r loop modprobe & modprobe loop max_part=63
max_part=63 demander à loop de monter jusqu'à 63 partitions d'une image (on a de quoi voir venir ;) )
Ceci fait, il ne reste qu'à monter les différentes images :
losetup /dev/loop0 /media/hdd/save/scsi01.img
losetup /dev/loop1 /media/hdd/save/scsi02.img
losetup /dev/loop2 /media/hdd/save/seagate.img
losetup /dev/loop3 /media/hdd/save/western.img
Si le besoin de vouloir des explications se faisait resentir : /dev/loop0 => la boucle ou l'on veut monter l'image disque et ensuite le chemin vers l'image concernée.
Si tout c'est bien passé, vous devriez voir apparaitre vos disques comme non monté. Ou comme ici, voir votre groupe de volumes logiques dans /dev/mapper/
Si c'est le cas, Il ne vous reste maintenant qu'à travailler vos partitions de manière tout à fait classique avec les outils lvm 7.
Pour commencer il faut scanner les disques :
pvscan
Si le groupe apparait il suffit de le charger :
vgchange -ay mongroupe
ou simplement vgchange -ay si vous n'avez qu'un groupe sur vos disques
Et il ne nous reste plus qu'à lister et monter les volumes logiques :
lvs
Puis :
mount /dev/mapper/myvol /media/source
À ce stade, les données devraient être présentes.
Comme d'habitude sous GNU/Linux l'impossible n'existe pas. Et avec ces utilitaires indispensables, nous pouvons facilement récupérer nos chères données !
Il faut certes un peu de temps, mais qu'est ce que sont quelques heures de travail pour nos précieuses photos de famille.
1 https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html
2 https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html
3 https://fr.wikipedia.org/wiki/Extension_de_nom_de_fichier
4 http://forum.pcastuces.com/recuperation_de_donnees_sous_linux_ddrescue__tuto-f1s120710.htm?page=1
5 https://en.wikipedia.org/wiki/Loop_device
6 http://www.thegibson.org/blog/archives/467
7 https://fr.wikipedia.org/wiki/Gestion_par_volumes_logiques
— Permalink