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 :
-
mount /dev/sdc1 hdd/
Puis on fait une copie brute de notre disque à récupérer sur le disque dur externe :
-
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.
-
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 :
-
echo $((17591238*512))
-
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 :
-
losetup -f
-
/dev/loop3
/dev/loop3 est le premier périphérique de type loop disponible, je vais donc l’utiliser :
-
losetup -o 9006713856 /dev/loop3 disque.img
… Que je n’ai plus qu’à monter dans le mountpoint précédemment créé :
-
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 :
-
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.
-
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 :
-
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 :
-
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.
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.
@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à
Ce qui est cool, c’est qu’il ne m’était jamais venu à l’idée d’utiliser mon shell comme calculatrice.
@PillOow: Grand bien t’en fasse, c’est vraiment l’utilisation la plus pourrie qu’on puisse en avoir.
Sympa le howto
Quelle idée d’installer Mac OS X. Tu t’es pris pour un riche ou quoi?
@kazounet: bah j’avais envie, une fois dans ma vie… J’ai honte…
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
@François: Relis bien le passage dont tu parles avant de dire n’importe quoi
. 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.