I y a 5 ans j’ai sauvegardé mes données vers 3 disques durs externes. Quand mon PC fixe est mort, j’ai utilisé un petit portable sur lequel je ne pouvais pas copier le Téraoctet de données de mes sauvegardes.
La semaine dernière, j’ai essayé de récupérer les données du portable et les anciennes sauvegardes sur un nouveau PC.
Sur les 3 disques de sauvegarde, un était complètement mort (il ne tourne plus quand on le branche), le second fonctionnait mais ne contenait qu’une sauvegarde partielle (disque plus petit que les autres), et le dernier n’était apparemment pas lisible.
Au branchement du disque, ‘dmesg’ affiche des dizaines d’erreurs de lecture, et Linux ne détecte aucune partition sur le disque. J’ai cru avoir perdu 1To de données…
Puis j’ai trouvé ça, ça et ça.
Et voilà comment j’ai presque tout récupéré :
- Brancher le disque mourant (/dev/sdi)
- Dans dmesg, il y avait des centaines de lignes comme ceci :
[200135.764454] Buffer I/O error on device sdi, logical block 9464 [200160.490454] sd 9:0:0:0: [sdi] Unhandled sense code [200160.490457] sd 9:0:0:0: [sdi] [200160.490458] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [200160.490460] sd 9:0:0:0: [sdi] [200160.490461] Sense Key : Medium Error [current] [200160.490463] sd 9:0:0:0: [sdi] [200160.490465] Add. Sense: Data phase error [200160.490466] sd 9:0:0:0: [sdi] CDB: [200160.490467] Read(10): 28 00 00 01 27 c0 00 00 08 00 [200160.490472] end_request: I/O error, dev sdi, sector 75712
- Faire une image du disque, en ignorant les erreurs de lecture (remplacées par des 0 dans le fichier). Ceci a pris 5 jours pour le disque de 1To.
sudo dd if=/dev/sdi of=/home/myself/backupdisk.bin conv=noerror,sync
- Réparer la table de partition en utilisant testdisk (sudo apt-get install testdisk)
I a trouvé une partition Linux (Ext3fs) remplissant l’image de disque, a proposé de réécrire la table de partition et a sauvé le résultat.testdisk /home/myself/backupdisk.bin
- Afficher la table de partition de l’image du disque
sudo fdisk -lu /home/myself/backupdisk.bin Disk /home/myself/backupdisk.bin: 1000.2 GB, 1000204886016 bytes 255 têtes, 63 secteurs/piste, 121601 cylindres, total 1953525168 secteurs Unités = secteurs de 1 * 512 = 512 octets Taille de secteur (logique / physique) : 512 octets / 512 octets taille d'E/S (minimale / optimale) : 512 octets / 512 octets Identifiant de disque : 0x00000000 Périphérique Amorçage Début Fin Blocs Id. Système /home/myself/backupdisk.bin1 * 63 1953520064 976760001 83 Linux
- Définir la partition avec le périphérique loopback (« rebouclage »)
D’après la table de partition, la partition commence au bloc 63 and l’unité est de 512 octets. Donc le début de la partition dans l’imageest à 32256 = 63*512 octets. On peut maintenant définir la partition /dev/loop0 pour qu’elle pointe vers la première partition de l’image du disquesudo losetup -o 32256 /dev/loop0 /home/myself/backupdisk.bin
- Vérifier et réparer la partition
L’option -y est utilisée pour forcer fsck à corriger les erreurs sans poser de question (sinon il demande des milliers de fois de confirmer, par exemple « Le décompte des i-noeuds libres est erroné pour le groupe n°7448 (16384, décompté=16334). Corriger ? »)sudo fsck -y /dev/loop0 # Ca se termine par: /dev/loop0: ***** LE SYSTÈME DE FICHIERS A ÉTÉ MODIFIÉ ***** /dev/loop0 : 968660/122109952 fichiers (3.9% non contigus), 234454083/244190000 blocs
- Monter la partition
sudo mkdir /mnt/backupdisk sudo mount /dev/loop0 /mnt/backupdisk
- Accéder aux fichiers et les copier depuis /mnt/backupdisk
- Démonter la partition et détacher le périphérique loopback
sudo umount /mnt/backupdisk sudo losetup -d /dev/loop0