Plus couramment appelée « Et meeerde », l’opération de récupération de données dans une situation d’urgence que j’ai vécue hier fut édifiante. Pour en apprendre autant que moi, vous allez avoir besoin :

  • D’un disque dur sur lequel vous avez installé Mac OS X sans faire attention à l’étape de partitionnement ;
  • D’une table des partitions foutue en l’air par HFS+ ;
  • D’une partition /home de 125Go qui contient toutes les données auxquelles vous tenez et dont vous n’avez pas fait de sauvegarde préalable ;
  • D’un disque dur externe avec, au minimum, l’équivalent en espace libre de la taille du disque dur à récupérer ;
  • De patience, de sang-froid et de moi, évidemment.

C’est parti !

I – WTF

Vous venez de foutre en l’air toutes vos données avec un mauvais partitionnement/whatever. Criez FAIL 300 fois en effectuant 42 rotations de votre corps autour de votre bureau ; calmez-vous, puis asseyez-vous en prenant bien soin d’éteindre au plus vite votre PC. Oui, vous auriez pu le faire plus tôt.

Rebootez sur le live CD/USB d’un OS correct, voire quelque chose fait exprès pour la récupération de données.
Les utilitaires suivants seront (ou pas) salvateurs :

  • dd ;
  • mount ;
  • testdisk ;
  • fdisk ;
  • losetup.

Maintenant, c’est l’heure de la sauvegarde.

Mes données bien au chaud

On va se placer dans le répertoire de travail /media puis créer quelques répertoires. Le répertoire backup doit être créé une fois le disque dur externe monté, évidemment. Oui, c’est l’arborescence que j’ai utilisée :

.
|-- hdd
|   `-- backup
|-- interne
`-- pouet

Pour commencer, on monte le disque dur externe :

  1. mount /dev/sdc1 hdd/

Puis on fait une copie brute de notre disque à récupérer sur le disque dur externe :

  1. dd if=/dev/sda of=hdd/backup/disque.img

Si possible, c’est-à-dire si vous avez la place et le temps, faîtes une copie de cette sauvegarde, afin de pouvoir repartir d’une base propre si vous merdez. Normalement, on ne travaille jamais sur la seule backup qu’on a.

Ça y est, on va pouvoir commencer à travailler.

Récupérer la table des partitions

Testdisk va nous permettre de voir ce qu’il reste de votre table des partitions, et de la remettre en place si les marqueurs de partitions n’ont pas été effacés. Ce ne serait pas de chance, mais si c’était le cas, je ne serais plus compétent pour vous aider.

  1. testdisk hdd/backup/disque.img

Vous pouvez suivre les instructions à l’écran, c’est-à-dire commencer par analyser la table des partitions puis la récupérer. Procédez à un deeper search afin de retrouver tous les marqueurs, puis avec gauche/droite sélectionnez le type que vous voulez leur attribuer : primaire, étendue, logique, ou supprimée. Il faudra donc vous rappeler avec le plus de précision possible du schéma de votre ancienne table.

Si vous réussissez à retrouver une table identique à l’ancienne, vous pouvez être assuré de récupérer une bonne partie de vos données. C’est ce que l’on va faire maintenant.

Les données c’est bon, retrouvez-en

Grâce à fdisk, on va voir la taille des partitions en secteurs, afin de les délimiter. Voilà ce que cela donne sur ma sauvegarde (utilisez la commande « u » pour passer de cylindres à secteurs) :

eeepc [/media/bucket2/backup] $ fdisk disque.img
Il sera impossible d'écrire la table de partitions.
Vous devez initialiser cylindres.
Vous pouvez faire cela depuis le menu des fonctions avancées.

Commande (m pour l'aide): u
Modification des unités d'affichage/saisie à secteurs

Commande (m pour l'aide): p

Disque disque.img: 0 Mo, 0 octets
255 têtes, 63 secteurs/piste, 0 cylindres, total 0 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Identifiant de disque : 0x00000000

Périphérique Amorce  Début        Fin      Blocs     Id  Système
disque.img1              63    15631244     7815591   83  Linux
disque.img2        15631245   281169629   132769192+   f  W95 Etendue (LBA)
La partition 2 a des fins physique/logique différentes:
     phys=(1023, 254, 63) logique=(17501, 254, 63)
disque.img3       281169630   312480314    15655342+  af  HFS / HFS+
La partition 3 a des débuts physique/logique différents (non Linux?):
     phys=(1023, 254, 63) logique=(17502, 0, 1)
La partition 3 a des fins physique/logique différentes:
     phys=(1023, 254, 63) logique=(19450, 254, 63)
disque.img5        15631308    17591174      979933+  82  Linux swap / Solaris
disque.img6        17591238   281169629   131789196   83  Linux

À vos calculatrices ! On va faire quelques multiplications.
Supposons que vous vouliez récupérer la partition 6 (identifiée par fdisk comme disque.img6). On prend la position de début de notre partition, c’est-à-dire 17591238, et on la multiplie par 512 pour obtenir un résultat en octets :

  1. echo $((17591238*512))
  2. 9006713856

Le début de ma partition est donc situé à 9006713856 octets. C’est ce que l’on va dire à losetup, utilitaire avec lequel je vais balancer la partie qui m’intéresse de ma sauvegarde dans un périphérique de type loop :

  1. losetup -f
  2. /dev/loop3

/dev/loop3 est le premier périphérique de type loop disponible, je vais donc l’utiliser :

  1. losetup -o 9006713856 /dev/loop3 disque.img

… Que je n’ai plus qu’à monter dans le mountpoint précédemment créé :

  1. mount -o loop /dev/loop3 pouet/

Si tout va bien – ça a été le cas pour moi – vous avez accès à vos données. L’opération est à effectuer pour chaque partition, si vous le voulez.

Ce que j’ai fait par la suite est contestable, mais en attendant j’ai tout récupéré :) .

Le bon vieux copier/coller des familles !

Content d’avoir accès à mon /home, j’en fais une copie qui va bien sur le disque dur externe :

  1. cp -rf pouet/* hdd/backup/home

Ça prend du temps. Mais ça marche.

Une fois que c’est fait, je peux tout démonter proprement et vérifier ma copie : tout y est. Dans quel état ? C’est ce que l’on va voir, en commettant l’irréparable : ON VA RALLUMER LE DISQUE DUR INTERNE.

Tin tin tin, tin tintin, tin tintin…

On va utiliser testdisk à nouveau, cette fois-ci directement sur le disque dur interne. Sachez qu’en ce faisant, vous pouvez dire adieu à toute chance de récupérer ce qui reste sur votre disque interne, puisque vous allez recommencer à écrire dessus. D’où l’intérêt d’avoir fait deux copies dès le départ.

  1. testdisk /dev/sda

On commence à connaitre ; il suffit de reproduire ce que vous avez fait plus tôt sur votre sauvegarde. Une fois la table fonctionnelle, quittez testdisk. On va la vérifier puis la sauvegarder avec fdisk :

  1. fdisk /dev/sda

Si cela vous va, utilisez « w » pour enregistrer et synchroniser les disques. fsck va à présent vérifier votre partition à la recherche d’erreurs de manière approfondie :

  1. fsck.ext4 -f /dev/sda6

Si vous avez de la chance, comme moi, rien n’est perdu. Sinon… Eh bien, j’irai brûler un cierge pour vous.
Vous pouvez vérifier toutes les partitions. La première, chez moi, était complètement foutue. J’ai réinstallé Arch ;) .

Les maux de la faim

Je vous souhaite sincèrement bonne chance. Je me suis rendu compte à quel point ça peut être gênant, ne serait-ce que d’envisager pouvoir perdre toutes ses données. Mais bien évidemment, si vous en êtes arrivé là, c’est entièrement de votre faute. Bande de moules.
En tout cas, je vous déconseille newfs -T /dev/disk0, ça pique.



9 commentaires sur “Récupération de données”

  1. Mwyann dit :

    Comme je t’ai dit, tu t’es bien fait chier à bosser sur la sauvegarde ;) losetup, le comptage des secteurs, et re-testdisk ensuite sur le disque interne… De manière générale, il ne faut PAS bosser sur une sauvegarde (ça date déjà des disquettes, lorsqu’on faisait des sauvegardes sur disquettes on ne travaillait JAMAIS directement dessus). Là pareil, après que tu as fait une backup de ton disque interne sur l’externe, tu peux te défouler sur l’interne ya pas de problème, au pire tu peux le restaurer depuis la backup. Seule exception toutefois : lorsque le disque à récupérer est mort (disque dur, clé USB ou carte flash en fin de vie) dans ce cas on fait deux copies sur un disque sain, et on travaille sur l’une d’elles, car faire travailler le disque mort risque d’endommager encore plus les données.

    RépondreRépondre
  2. AddiKT1ve dit :

    @Mwyann: Je précise bien qu’il ne faut travailler sur la sauvegarde que si l’on en a deux. Je pense qu’il vaut mieux éviter de toucher au disque interne inutilement, avant de savoir précisément ce que l’on va y faire – sans compter que l’on peut s’être planté en faisant la sauvegarde, si l’on est vraiment manchot. Puisque le disque interne est le dernier espoir, je *pense* qu’il vaut mieux n’y toucher qu’en dernier.
    Mais tu as sans doute raison ; j’ai en grande partie fait de la merde hier, heureusement que tu étais là ;) .

    RépondreRépondre
  3. PillOow dit :

    Ce qui est cool, c’est qu’il ne m’était jamais venu à l’idée d’utiliser mon shell comme calculatrice.

    RépondreRépondre
  4. AddiKT1ve dit :

    @PillOow: Grand bien t’en fasse, c’est vraiment l’utilisation la plus pourrie qu’on puisse en avoir.

    RépondreRépondre
  5. Kane dit :

    Sympa le howto

    RépondreRépondre
  6. kazounet dit :

    Quelle idée d’installer Mac OS X. Tu t’es pris pour un riche ou quoi?

    RépondreRépondre
  7. AddiKT1ve dit :

    @kazounet: bah j’avais envie, une fois dans ma vie… J’ai honte…

    RépondreRépondre
  8. François dit :

    Je n’ai pas encore tout lu, mais sur le mount du début, j’aurai mis un -r (ou -o ro) pour read only, histoire de se prémunir d’autres bétises ;)

    RépondreRépondre
  9. AddiKT1ve dit :

    @François: Relis bien le passage dont tu parles avant de dire n’importe quoi :P . Au début, je mount le disque dur externe ! Ce n’est qu’à la fin que je monte le disque dur interne, et en rw puisqu’on refait la table des partitions.

    RépondreRépondre

Laisser une réponse

Utilisateur de Twitter ?
Remplissez les informations ci-dessus ou connectez-vous via Twitter en cliquant sur le bouton ci-dessous.