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.
Sous Linux, on peut utiliser hexedit en ligne de commande.
Sous Win32 vous avez un bon choix entre UltraEdit32 et WinHex.
* La méthode :
Prévoir une place disque égale à au moins deux fois celle du
dossier original !
lancer bzip2recover sur l'archive corrompue.
=> on obtient une multitude de petits fichiers en tar.bz2
Trouver, parmi les fichiers obtenus, celui qui contient l'erreur CRC.
Créer une archive à valide partir des fichiers en tar.bz2 qui suivent le fichier
tar.bz2 corrompu.
=> c'est cette partie qui nécessite l'emploi d'un éditeur hexadécimal, et
c'est là que l'on va récupérer les fichiers qui semblent perdus !
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 :
L'archive rec00197.tar.bz2 est endommagée et irrécupérable : on la laisse tomber !
Les archives qui suivent, rec00198.tar.bz2, etc ..., contiennent la fin du fichier contenu
dans rec00197.tar.bz2, suivi d'un nouveau fichier, lui-même suivi du fichier suivant, etc ...
Notre but va maintenant être de virer la fin du fichier perdu, et de reconstruire
une archive tar propre, commençant par le premier fichier suivant le fichier corrompu.
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.
Tout d'abord, on édite le fichier : $> hexedit recover.tar
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/").
Frappez les touches ESC-ESPACE pour marque le début de bloc.
Frappez la touche ">" pour aller directement en fin de fichier.
Frappez les touches ESC-W pour copier le bloc sélectionné en mémoire.
Frappez les touches ESC-Y pour sauver le bloc dans un fichier. Donnez-lui le nom de rec00201.tar
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.