hr_eyes
flèche retour       Page d'accueil Moz -  IE 


Récupération d'une archive.tar.bz2



CHAPITRE 1 : Quel est le problème ?

Il est très simple en fait.
Vous avez un dossier IMPORTANT/ qui traîne sur votre disque dur.
Votre dossier est gros : il comporte plusieurs dizaines de milliers de fichiers et fait plusieurs centaines de mégaoctets.

Vous décidez de l'archiver pour le mettre sur CD/DVD ou bande.
Ceci afin de gagner de la place sur votre disque dur, et, par la même occasion, mettre en sûreté ce dossier si précieux.

Vous utilisez classiquement la commande suivante :
     $> tar    -cvjf    important.tar.bz2    IMPORTANT/

Explications : "c" pour "compress", "v" pour "verbose", "f" pour "force", et "j" pour compresser en bzip2.


Après un long moment, l'archive apparaît sur votre disque dur.
Et là, parce que vous êtes fatigué, ou que vous pensez à autre chose, vous effacez le dossier original SANS vérifier l'archive !!!
Et comme de bien entendu, malgré qu'il n'y a qu'une chance sur 4 milliards que cela arrive (dixit le man de bzip2), l'archive est corrompue.
Lorsque vous décidez de désarchiver votre dossier, quelques fichiers se décompactent, puis vient l'erreur fatale "Erreur CRC" !
TOUS les fichiers se trouvant après cette erreur semblent irrémédiablement perdus.

Nous nous penchons donc sur une erreur due à bzip2 (pendant la compression de l'archive tar, donc).
pour une erreur due à tar, je ne pense pas que cette méthode soit valable. Mais vous pouvez toujours essayer de lire plus loin.

CHAPITRE 2 : Notice légale !

Ce présent HowTo est libre de droit.
Vous pouvez le recopier, l'utiliser, le modifier, bref en faire ce que vous voulez.
Bien sûr je serais heureux si vous pouviez citer mon nom et donner l'adresse du présent site comme référence.

TRES IMPORTANT : JE NE POURRAIS ETRE TENU POUR RESPONSABLE S'IL ADVENAIT QUE VOUS PERDIEZ DES DONNEES OU QU'IL ARRIVE QUOIT QUE CE SOIT À VOTRE ORDINATEUR SUITE À L'UTILISATION DE CETTE METHODE !!!
ELLE EST DONNEE UNIQUEMENT À TITRE INDICATIF POUR AIDER DES PERSONNES EN DIFFICULTÉ MAIS SANS GARANTIE AUCUNE QU'ELLE PERMETTRA D'OBTENIR L'EFFET SOUHAITÉ.

Cependant, inutile de paniquer, il n'y a que peu de risques à utiliser cette méthode, si on le fait intelligemment. C'est à dire en suivant les conseils, mais aussi et surtout en utilisant sa cervelle afin de comprendre ce qui se passe et pourquoi cela est fait ainsi.
N'hésitez pas aussi à m'envoyer un email (voir en bas de page) pour demander des précisions ou m'indiquer d'éventuelles erreurs, si besoin est.


CHAPITRE 3 : Gardons notre sang froid !

Nous venons de perdre virtuellement une quantité phénoménale de fichiers plus importants les uns que les autres !
Ce qui est le plus difficile dans ce genre de situation, c'est de garder son calme.
Une fois que l'on a l'esprit clair on peut commencer à chercher une solution dans les man des différents programmes utilisés.
En l'occurence nous avons besoin de lire le man de BZIP2 et celui de TAR.

Commençons par bzip2. Le man nous apprend que bzip2 compacte les fichiers par blocs de 900Ko environ et qu'avec la commande bzip2recover on peut espérer récupérer une partie de nos fichiers.
Voilà une bonne nouvelle, tout cela nous laisse espérer que seuls 900Ko de données compactées auront été perdues.

Le man de tar ne nous apprend rien de bien intéressant. Aussi c'est moi qui vais vous donner les informations importantes sur ce format d'archive.
Tout d'abord, la commande less (qui permet habituellement de lire un fichier texte en avant et en arrière dans un terminal) permet ici d'avoir la liste des fichiers contenus dans l'archive.
Ensuite, une archive tar est (en gros) constituée ainsi :
   - chaîne de caractères = arborescence du fichier1
   - le fichier1 lui-même
   - chaîne de caractères = arborescence du fichier2
   - le fichier2 lui-même.
et ainsi de suite.

Super ! Une archive Tar n'est tout bonnement qu'une concaténation des fichiers originels, précédés d'une chaîne de caractères indiquant leur emplacement.
C'est très bon pour nous ça !


CHAPITRE 4 : Outils et méthode utilisés !

* L'outil est simple : un héditeur hexadécimal.
* La méthode :

CHAPITRE 5 : Un exemple concret !

Je pense que le meilleur moyen d'expliquer comment faire est d'utiliser une exemple (vécu par votre serviteur) et de détailler chaque étape avec minutie.
Nous avons l'archive important.tar.bz2 à récupérer.
Toutes les lignes commençant par un "$>" indique une ligne de commande à taper dans un shell (bash ou tcsh selon votre envie)

En avant :
Pour commencer utilisons bzip2recover :
     $> bzip2recover important.tar.bz2
Nous obtenons de nombreuses petites archives. Par exemple : rec0001.tar.bzip2 à rec00625.tar.bzip2

Nous recherchons l'archive corrompue :
     $> bzip2 -vt rec*.tar.bz2
La commande précédente teste chaque archive dans le dossier courant, et indiquera celle qui est corrompue.

L'archive corrompue est rec00197.tar.bz2 (si si je vous assure, la saleté !)


Petit rappel : tous les fichiers contenus dans les archives rec0001 à rec00196 peuvent être récupérés normalement par la commande :
     $> tar -xvjf important.tar.bz2
En effet, cette commande va décompacter l'archive et tous les fichiers s'y trouvant jusqu'à ce qu'elle arrive à l'erreur CRC.
Donc tous les fichiers précédents cette erreur sont déjà sauvés sans que l'on ait besoin de rien faire.
En conséquence, les petites archives rec0001 à rec00196 ne nous servent à rien. Déplacez-les dans un autre dossier afin de faire le ménage dans celui-ci.

Pour récupérer les fichiers suivant l'erreur CRC, il faut savoir que l'information importante est le nom du dossier principal : ici c'est "IMPORTANT/".
En effet, voici où nous en sommes : Prenons l'exemple d'une archive contenant gaga.txt, gogo.txt, gugus.txt, gnagna.txt.
Cette archive est corrompue au niveau de gogo.txt.
gaga.txt est sauvé par défaut, mais on se retrouve avec la fin de gogo.txt collée à gugus.txt lui même collé à gnagna.txt. Ce qui n'est pas une archive valide !
On va virer la fin de gogo.txt afin de se retrouver avec gugus.txt collé à gnagna.txt, et ainsi reconstruire une archive valide.

Pour cela, nous décompactons la première archive suivant l'archive corrompue, puis nous utilisons hexedit pour rechercher la chaîne qui nous intéresse dans celle-ci :
     $> bzip2 -dc rec00198.tar.bz2 > recover.tar
     $> hexedit recover.tar
Dans hexedit, frapper la touche TAB pour passer en mode ASCII.
Puis frapper CTRL-S pour lancer une recherche en avant. Entrer le mot IMPORTANT dans la fenêtre de dialogue qui apparaît.
Là deux cas de figure se présentent :
- On trouve la chaîne : sauter le prochain paragraphe ou cliquez ici : TROUVE.
- On ne trouve pas la chaîne : lire le prochain paragraphe.

Si on ne trouve pas la chaîne, c'est que le fichier compacté dans rec00197.tar.bzip2 était assez gros et continue sur plusieurs des petites archives.
Il suffit alors de recommencer la manipulation précédente sur les archives successives suivantes jusqu'à trouver la chaîne voulue (le nom du dossier) :
     $> bzip2 -dc rec00199.tar.bz2 > recover.tar
     $> hexedit recover.tar
Chercher la chaîne. Et si on ne la trouve pas alors faire :
     $> bzip2 -dc rec00200.tar.bz2 > recover.tar
     $> hexedit recover.tar
ETC ...

Nous trouvons enfin la chaîne de caractères "IMPORTANT" dans rec00201.tar.bzip2

Une fois que nous avons trouvé cette chaîne de caractères, cela signifie que nous avons trouvé le début d'un nouveau fichier archivé !
C'est là toute l'importance de la démarche.
Il peut arriver que la chaîne de caractères fasse partie du fichier que l'on est en train de vérifier, auquel cas, il faut continuer la recherche plus loin.
Comme indiqué en début de page, nous supposons que vous avez un minimum de sens de réflexion : vérifiez que la chaîne de caractères trouvée est semblable à celle que vous pouvez trouver en tout début de l'archive rec0001.tar.

Bien maintenant nous avons trouver notre chaîne de caractères et elle indique bien le début d'un nouveau fichier dans l'archive.
Là il faut s'arranger pour sauver l'archive sans tout ce qui se trouve au-dessus de la chaîne de caractères.

* Avec UltraEdit, faites une sélection à la souris, effacer tout ce qui se trouve avant la chaîne de caractères et sauver le résultat.

* Avec Hexedit, c'est un peu plus compliqué. Tout d'abord veuillez noter que l'aide de Hexedit se trouve en tapant la touche F1 dans le programme.
  1. Tout d'abord, on édite le fichier :
         $> hexedit recover.tar
  2. Placez le curseur sur la première lettre de la chaîne de caractères (ici nous le plaçons sur le "I" de "IMPORTANT/").
  3. Frappez les touches ESC-ESPACE pour marque le début de bloc.
  4. Frappez la touche ">" pour aller directement en fin de fichier.
  5. Frappez les touches ESC-W pour copier le bloc sélectionné en mémoire.
  6. Frappez les touches ESC-Y pour sauver le bloc dans un fichier. Donnez-lui le nom de rec00201.tar
  7. Quitter hexedit par CTRL-C.

OUF !
Nous avons presque terminé et nos fichiers sont quasiment sauvés.

A ce stade sauvez les fichiers rec00197.tar.bz2 à rec00201.tar.bz2 quelque part.
Vous pourriez vous en servir plus tard : en effet, si le fichier que les archives rec00197 à rec00201 contiennent est vraiment important, vous pourrez essayer de le récupérer partiellement en trifouillant plus tard.
Avec la méthode décrite ici, nous ne récupérons que les fichiers intactes. Le fichier touché par l'erreur CRC est fichu !

Bien, à partir de maintenant la marche à suivre est assez simple : reconstruire une archive valide à partir des archives rec00201.tar.bz2 à rec00625.tar.bz2 ATTENTION : je parle de notre nouvelle archive rec00201 que nous avons créée à partir du fichier édité avec hexedit, de la manière suivante :
     $> bzip2 rec00201.tar
     => création d'une nouvelle archive rec00201.tar.bz2

Nous nous trouvons dans un dossier où se trouvent les archives rec00201 à rec00625. Le autres ont été copiées ailleurs précédemment, il est très IMPORTANT qu'il n'y ait pas d'autres archives rec* dans le dossier courant !)
Enfin, la touche finale, nous reconstruisons l'énorme archive tar contenant tous les fichiers qui suivent le fichier corrompu.
Nous le faisons ainsi :
     $> bzip2 -dc rec*.bz2 > données-récupérées.tar


CHAPITRE 6 : Conclusion !

Et bien voilà. Nous avons reconstruit une archive valide et avec un peu de chance nous n'avons perdu qu'un seul fichier dans l'histoire.
Pour finir il suffit de désarchiver tout ça par un simple :
     $> tar -xvf données-récupérées.tar

Et c'est là qu'on se dit que la vie est belle, finalement !
J'ai personnellement récupéré 400Mo de données, contenant tous mes fichiers d'étudiant !

Bonne chance à vous, et, encore une fois, n'hésitez-pas à m'envoyer un email pour toute demande de précision, j'y répondrais avec plaisir, dans la mesure de mes moyens.


Par Gaël Mifsud sur PC 1.2GHz sous Linux Mandrake.   Dernière mise à jour : le 04/06/2003.
Pour tout contact : ArobaseCourrier électronique Valid HTML 4.0!