Journal Grosse boulette : Exemple de récupération de données

Posté par .
Tags : aucun
99
18
avr.
2010
Comme tout humain, il m'arrive de faire des boulettes. La dernière en date est le lancement en tant que root d'un script permettant de créer une clé USB multi-iso avec comme paramètre /dev/sda. Malheureusement, /dev/sda n'était pas ma clé USB mais le disque dur de mon portable. Ce script (dont je ne retrouve pas le nom) partitionne le disque passé en paramètre avec une partition, la format en fat32 et installe tous le nécessaire pour créer une clé multi-iso.

Premier réflexe : Logique de base
Ctrl-C. Dès que j'ai pris conscience de ma boulette.

Deuxième réflexe : Le cri primal
Ha non, pas possible. Il est tard et un enfant dort à côté.

Troisième réflexe : Oxygène
Je prends une bonne grosse bouffée d'air pour évacuer mon stress.

Quatrième réflexe : Bien commencer la récupération de données
Le PC tournant encore et sachant que la première casse est la destruction de la table de partition, j'essaye de lancer la commande cat /proc/partitions. Si j'arrive à lancer cette commande et de noter le résultat sur un bout de papier, je pourrai sûrement reconstruire la partition qui m'intéresse : celle contenant mon LVM. Surtout qu'il n'y a qu'une seule valeur à réellement noter : le premier secteur de la partition contenant mon LVM. Le reste des partitions étant deux /boot et une swap.
# cat /proc/partitions
ENTER

Freeze

Cinquième réflexe : Oxygène¹⁰⁰⁰⁰
Et retrait de la batterie, pas de pitié.

Début de la récupération :
Après un bon café et m'être calmé. Je commence à préparer la contre-attaque. Je mets dans un boîtier externe USB un disque dur plus gros que le disque de mon portable. Je vérifie qu'il n'y a pas de données importantes dessus. Je recherche un liveCD ubuntu et je boot dessus sur mon portable. Une fois sur le liveCD, je mets à jour la liste des paquets et installe LVM, testdisk et gpart. Je monte ensuite mon disque dur externe et je fais une image de mon disque dur local
dd if=/dev/sda of=/media/XXXX/sda.img
Une fois l'image créé, je la protège en interdisant l'écriture dessus et je fais une somme de contrôle sur l'image et le disque local. Je garde la somme à côté de mon image au cas où. Cette image sera ma copie de sauvegarde. Le disque local étant plus rapide, il sera plus facile de travailler dessus dans un premier temps. Plus tard, je ne ferai que des lectures sur l'image puisque j'aurai réinstaller un système sur mon portable.

Premier essai :
Je tente alors de lancer testdisk sur mon disque local. Sans succès. Celui-ci ne me trouve que deux partitions appartenant à des disques virtuels. Cool, mais je préfère récupérer mon /home entier.
Je tente alors gpart avec encore moins de succès.
Je lancerai bien un photorec sur mon disque mais cela prendre pas mal de temps et surtout que c'est le bordel après pour trier les fichiers récupérés sans compter les vieux fichiers effacés qu'il risque de trouver.

Début de la force brute : Grrrrrrr
Je me dis alors que je vais attaquer le disque à la main. Retrouver par moi-même la partition LVM. Je commence alors par prendre un bloc-note, y inscris les informations que je possède sur mes anciennes partitions, leurs tailles estimées et leurs ordres sur le disque dur. Cela me donne une première estimation me donne le début de la partition LVM vers les 1,5Go à plus ou moins 200Mo. Pour regarder la structure d'un volume physique LVM, je crée une image de disque, crée un VG (volume group), transforme cette image en volume physique et l'ajout au VG. Je sors alors hexedit (éditeur hexadécimal) pour inspecter la structure de mon volume physique. Je repère rapidement une chaîne de caractère facilement identifiable "LABELONE" dans le 3ème secteur. Je me dis cette chaîne est une bonne première solution pour retrouver mon LVM. Mais bon, 400Mo soit 800000 secteurs à inspecter avec hexedit à la main, c'est du boulot. Je me lance donc dans la création d'un script, certe brutal, qui va me chercher cette chaine [1]. Ce script fait une recherche dicothomique permettant de retrouver la chaîne LABELONE et garde une copie des secteurs qui correspondent. Il est brutal, à base de dd et de grep mais il est suffisamment rapide à mon goût.

Je le lance donc avec comme espace de recherche la zone allant de 1,3Go à 1,7Go de mon disque. Il me trouve assez rapidement des ensembles correspondant. Je visionne alors les secteurs trouvés avec hexedit et je me rends vite compte que ces premiers secteurs son des pages de mémoires mise en swap. La partition swap se trouvant juste avant la partition LVM que je désire récupérer. Je laisse quand même tourner le script jusqu'au bout, mais je me rends compte qu'il me trouve trop de correspondance. Je tente quand même d'inspecter quelque unes de ces correspondance mais je ne trouve rien de significatif.

La force : la connaissance des outils utilisés
Connaissance assez bien LVM depuis la première version de celui-ci, je savais que LVM copiait une copie de sauvegarde de la structure d'un volume dans /etc/lvm. Un petit cat /etc/lvm/backup/vgtmp (nom du vg créer auparavant pour en voir la structure) me donne un exemple ce fichier. La première ligne me semble assez significative, que le numéro de version y apparaissant est sûrement une variable dans le code et qu'il y a de forte chance que je tombe sur un fichier backup LVM. Je modifie donc mon script pour rechercher la chaine "# Generated by LVM2 version 2." et l'exécute sur le disque entier. Je laisse tourner tout cela la nuit. Et, bonne nouvelle au réveil, le script m'a trouvé une trentaine de secteurs contenant correspondantes. Ce qui est normal, car LVM en garde plusieurs. La première ligne de ces fichiers contiennent une date, je peux alors rapidement trouver le fichier le plus récents. Coup de bol, le plus récent date de deux jours et je n'ai pas fait de modification dans mon LVM depuis 2 semaines au moins. Je récupère le fichier entier à coup de dd [2]. Puis je commence à l'analyser. Celui-ci m'apprends la taille de la partition ainsi que les différents emplacements des partitions logiques. En supposant, que la partition LVM était bien calé à la fin de mon disque, j'obtiens la limite maximale où se trouve le début de ma partition LVM. Toutefois, ce fichier contient aussi des information sur la partition logique de mon /home. Je me dis alors que je peux m'amuser à directement récupérer mon /home à la place du LVM. Seul mon /home m'intéresse vraiment.

Je commence donc à calculer l'emplacement possible de mon /home d'après le fichier backup LVM. Et je tombe sur 46920993ème secteurs + 384 de je ne sais quoi. 384 pouvant être des secteurs ou des blocs de 8192 secteurs. Après un email sur la mailing-list de LVM, c'est apparemment des secteurs. Mon /home se trouverait donc autour du 46921277ème secteurs.

Le côté obscur : on ne voit rien dans le noir
Ce secteur et les secteurs suivant n'ont rien de spécial (rempli de zéro de mémoire). En réalisant des petites recherches autour de ce secteur, je tombe vraiment par hasard sur un secteur passez particulier, le secteur 46928794. Il contient, en effet, la liste des répertoires de la racine de mon /home. Je suis sur la bonne voie mais cette valeur va me dérouté puisque je vais la prendre comme limite haute alors que mon premier calcul est plus juste. Pensant que le début de ma partition /home ne pouvait être loin de ce secteur, je perdu pas mal de temps à faire des recherches avec mon script notament sur la chaine "EF53", celle-ci étant le magic quote d'un superblock Ext3. Malheureusement, des secteurs contenant cette chaîne, il y en as beaucoup. Et même en utilisant "tune2fs -l" sur ces secteurs, on obtiens énormement de secteurs qui conviennent à cette commande. Et pas mal ne donne rien.

La bonne méthode : se vider l'esprit
Il m'a fallu laisser reposer cela deux bonne semaines pour repartir sur de bonne base. En repartant du calcul du secteur du début de mon /home, je recherche des chaînes de caractères dans les secteurs le précédent. Je tombe alors sur des chaînes qui sont clairement des sources et des compilations effectuées sur mon ancienne distribution Archlinux. Cette distribution réalise ces compliations dans /tmp qui se trouvent bien avant /home d'après le backup LVM. Les derniers secteurs remarquables de ce style se trouvant après le secteur 46916000. Cela devient alors ma limite base. Mais, têtu, je garde encore le secteur contenant la liste des dossiers racines de mon /home comme limite haute. Ce qui me donne une brochette de 13000 secteurs sur plus de 230000000 que contient mon disque dur.

Avec mon dernier script [3], je repars à la recherche du magicquote d'un superblock Ext3 avec ces deux bornes. Et là, miracle, il se déclenche assez vite sur le secteur 46916276. Je vérifie avec hexedit, il s'agit bien d'un superblock Ext3. Je copie quelques blocs à partir de 46916274 (il faut soustraire 2 secteurs au premier superblock pour obtenir le début réel de la partition, les 2 secteurs de boot) et je vérifie si tune2fs -l ne gueule pas. Je lance alors une copie de mon /home
dd if=/media/0776c516-2504-418f-8962-15b1853038f6/sda.img of=/mnt/sda1/home.img bs=512 skip=46916274 count=96468992
comme si mon /home était continu. Mon /home est en faites coupé en deux stripes, le premier de 43Go et le dernier de 3Go. Ayant fait des expériences avant, je sais que fsch.ext3 ne gueulera pas de trop s'il les 3 derniers Go ne sont pas bon. Cela me permets aussi de gagner du temps si ce n'est pas le bon secteur.

Conclusion : délivrance
Une fois la copie faite avec dd, je lance fsck.ext3 dessus. Il trouve une bonne centaines de fichiers corrompu mais termine bien. Je monte l'image (
mount -o loop /mnt/sdb1/home.img /mnt/home
). Cool, pas d'erreur de montage.

ls /mnt/home/
film guest kikoun kikoun2 kkn lost+found nath nuokik ogg test


Réussite. Après avoir copier depuis ce montage les fichiers les plus importants, buvons un peu de bon vin et partageons ma satisfaction sur quelques chats.

Maintenant, je peux faire correspondre les valeurs présentes de mon backup LVM à des secteurs. Je pu donc recréer entièrement mon /home et même monter directement les systèmes de fichier d'un seul bloc présent dans mon LVM grâce à l'option offset d'un montage loop.


[1] Script seek.sh : http://paste.debian.net/69497/
[2] Fichier backup LVM récupéré : http://pastebin.com/TTSnpr47
[3] Script seek2.sh : http://pastebin.com/91pFt5MM
  • # restauration rapide ?

    Posté par . Évalué à 5.

    j'ai mis pertinent pour le courage et la méthode tendu du slip.

    Mais 2 semaines pour récupérer un /home faut pas être pressé ? A moins que pas de backup ?
    • [^] # Re: restauration rapide ?

      Posté par . Évalué à 3.

      J'avais, en effet, pas mal de backup. Mais je n'avais pas de backup de deux semaines de programmation dont le panneau d'affichage du jeu télévisé pour enfant (cf ma signature) et le début d'un gros projet. Je n'avais pas de backup de ma dernière clé gpg aussi, juste la clé de révocation imprimée sur une feuille.

      J'avais d'autre chose à faire pendant ces deux semaines, je n'étais pas spécialement pressé de récupérer mes données et, à part la clé gpg, j'aurai pu refaire tout ça en une ou deux semaines de travail. Il faut dire qu'après une telle boulette, on n'a pas forcément envie de se replonger dans de la programmation perdue de suite.

      Je n'ai pas passé deux semaines à travailler dessus. En tout mon pc a du faire du traitement pendant 24h (copie, script) pour environ 8h à réfléchir, calculer, programmer et analyser les résultats. Ces deux semaines sont surtout deux semaines de détente, à ne rien faire et à reprendre l'envie de bosser là-dessus.
      • [^] # Re: restauration rapide ?

        Posté par (page perso) . Évalué à 4.

        deux semaines de programmation dont le panneau d'affichage du jeu télévisé pour enfant

        tu travailles sans outil de gestion de version du code ? un dépôt subversion c'est bien pratique tout de même :-)
        • [^] # Re: restauration rapide ?

          Posté par (page perso) . Évalué à 9.

          De la gestion de version, ce n'est pas de la sauvegarde. Si tu perds ton système de fichiers, ben, ton code et ton dépôt, y'a plus.
          • [^] # Re: restauration rapide ?

            Posté par . Évalué à 7.

            Je ne comprends pas le sens de ta remarque.
            Il voulait bien entendu dire un dépôt svn sur un serveur externe.

            Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

            • [^] # Re: restauration rapide ?

              Posté par (page perso) . Évalué à 2.

              C'est pas forcément évident si on code tout seul (moi c'est ce que je fait, ça permet d'éviter les problème de bande passante).

              « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: restauration rapide ?

          Posté par (page perso) . Évalué à 5.

          Un dépôt Git saymieux.
        • [^] # Re: restauration rapide ?

          Posté par . Évalué à 5.

          Pour le script du tableau d'affichage, c'est un script comme beaucoup de monde en fait à la va-vite et qui ne servira peut-être qu'une ou deux fois. Je comptais sur mes sauvegardes pour en garder une tarce et je l'aurai surment publier sur le web. Malheureusement, je n'ai pas fait de sauvegarde avec les dernières modifications.

          Pour le projet, c'était prévu. C'est même déjà fait depuis que j'ai récupéré les sources. De plus, je ne suis pas très famillier de ces outils. Ça doit être la première fois depuis ma sortie de l'école que je me lance dans un aussi gros projet.

          Je prendrais pour ma défense, Murphy, qui aurait dis que si je avais fait un dépôt et mise à jour mes sauvegarde, je n'aurai jamais planter mon disque.
  • # Ca...

    Posté par . Évalué à 10.

    ...c'est une méthode couillue !

    Perso j'aurais sans doute laché bien avant :D
    • [^] # Re: Ca...

      Posté par . Évalué à 2.

      Perso je n'ai pas les compétences nécessaires à cette récupération!

      Ça me rappelle la fois où des amis ont subi un "paf le disque dur".
      Sauvegardes?
      - Aucune
      Windows XP?
      - Oui
      (et mer...)
      chkdsk -R (ou un truc dans le genre, me rappelle plus de la commande, ça se trouve sur le net)
      Aucun succès
      J'abandonne!
      - (et mer... toutes les photos de vacances depuis x années...)
      Sinon ils savent récupérer les données à la FNAC, ça coûte une petite fortune...
      - euh... non!
      Sinon faut trouver un vrai admin système windows qui saura faire mieux
      - On a trouvé un pote qui est technicien en support win. Il a fait... pareil que toi et puis il a abandonné aussi
      Ah. C'est ballot...
      • [^] # Re: Ca...

        Posté par (page perso) . Évalué à 5.

        Ouais enfin, un LiveCD avec Photorec dessus et tu les récupérais tes photos...
        • [^] # Re: Ca...

          Posté par . Évalué à 3.

          Oui, ben pas les compétences, ça implique pas les connaissances:
          Je viens de découvrir photorec, merci pour le tuyau!

          A ma décharge (peut-être?), mais ça existe depuis combien de temps? Je trouve rien avant 2008, et mon histoire date pas de la semaine dernière...
          Ca doit bien remonter à 2005 au plus tard!
  • # Pauvres bêtes...

    Posté par . Évalué à 10.

    buvons un peu de bon vin et partageons ma satisfaction sur quelques chats

    O_O

    J'imagine qu'il te fallait décompresser, mais j'espère que les pauvres bêtes étaient consentantes...

    Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

    • [^] # Re: Pauvres bêtes...

      Posté par . Évalué à 3.

      Mon chat fût un peu choqué de recevoir un bisou. Il s'est rapidement remis à attaquer mes pieds comme d'habitude.

      Quand à jabber et irc, je n'ai pas été kické après cet élan de jouissance.
  • # J'ai pas tout lu mais...

    Posté par (page perso) . Évalué à 2.

    Je ne comprends pas pourquoi c'est si compliqué.

    Il y a quelques années, j'avais fait la bêtise d'exécuter les outils LVM 1 d'un live-DVD alors que j'étais en LVM 2. Les outils en question ne géraient pas la possibilité d'une nouvelle version. Ils ont supprimé les infos de mon LVM. Grand moment de tristesse.

    Après avoir retrouvé mes esprits (et déploré de ne pas avoir de sauvegarde, youpi!), j'ai démarré sur un live-DVD et j'ai vu que les données LVM étaient sauvegardées à plusieurs emplacements, sous la même forme texte que le fichier de config (comme tu l'as vu).
    J'ai fait un script qui passe le disque en revue et qui les retrouve. Je ne sais plus si j'ai trouvé le plus récent par date ou par taille. À la fin, j'ai pu faire un "vgcfgrestore". Au bout d'un jour et demi. Et là j'avais vraiment l'impression d'être passé à côté d'une catastrophe.

    Depuis, j'ai une sauvegarde incrémentale quasi-quotidienne, et une autre quasi-hebdomadaire.

    Pourquoi n'as-tu pas pu appliquer la config LVM et retrouver ta partition HOME (découpée à la sauce LVM)?
    • [^] # Re: J'ai pas tout lu mais...

      Posté par . Évalué à 2.

      Le problème ici est que la partition n'existe plus. J'aurai bien voulu donner le fichier à vgcfgrestore mais il va vite gueuler car la partition /dev/sda7 n'existe plus et ne pourra donc pas réappliquer la configuration.

      J'ai essayer de rechercher le début de cette partition mais j'ai vite abandonner, pensant qu'il serai plus simple de récupérer directement les partitions logiques et que le début de la partition avait plus de chance d'être détruite par le formatage que son milieu. La plus part des partitions logiques m'était égale. Seul /home m'intéressait. J'essayerai peut-être de retrouver la partition /dev/sda7 pour m'amuser et recréer le volume.
  • # chapeau bas !

    Posté par (page perso) . Évalué à 2.

    très impressionnant ! qu'est-ce qu'on peut pas faire avec de la motivation !

    j'aurais sans doute abandonner avant me disant que c'était foutu de toute façon.

    Mais une très bonne idée que tu as eu c'est de laisser reposer le problème 2 semaines avant de t'y recoller. Ça marche toujours mieux l'esprit clair.

    je me suis fais des sueurs froides en supprimant ma table de partition en jouant avec je sais plus quel outil (sfdisk ?). enfin j'avais une sauvegarde tout simple (de la table de partition) et je m'en suis sorti assez facilement finalement. Pas de la même ampleur que ton problème c'est sûr...
  • # recherche dicothomique ?

    Posté par . Évalué à 5.

    en regardant le script, j'ai plutôt l'impression d'une recherche séquentielle ?
    • [^] # Re: recherche dicothomique ?

      Posté par . Évalué à 3.

      Tout à fait. En faites, le message que je voulais faire passer c'est que je recherche dans un grand nombre de secteur la présence d'une chaîne avant de chercher le secteur exacte contenant cette chaîne. Disons que le script effectue une recherche séquentielle grossière puis une recherche séquentielle plus précise.

      J'ai vite remarqué que le script faisait pratiquement autant d'itérations par seconde quelques soit de nombres de secteurs recopiés (sans toutefois prendre trop de secteur), surtout pour la première lecture. Le cache aide grandement pour la recherche plus précise. Cette méthode m'a vite parue la plus économique en temps sans toutefois détailler le pourquoi.
  • # Dans le même genre

    Posté par . Évalué à 1.

    Coïncidence! en lisant ton journal je repense à une histoire lue hier, histoire qui n'est plus toute récente mais le moins qu'on puisse dire c'est qu'ils ne se sont pas découragés!

    http://www.justpasha.org/folk/rm.html

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.