Disque dur mourant : récupérer mes données (GNU/Linux)

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é :

  1. Brancher le disque mourant (/dev/sdi)
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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 disque

    sudo losetup -o 32256 /dev/loop0  /home/myself/backupdisk.bin
  7. 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
  8. Monter la partition
    sudo mkdir /mnt/backupdisk
    sudo mount /dev/loop0 /mnt/backupdisk
  9. Accéder aux fichiers et les copier depuis /mnt/backupdisk
  10. Démonter la partition et détacher le périphérique loopback
    sudo umount /mnt/backupdisk
    sudo losetup -d /dev/loop0
Ce contenu a été publié dans Notes Info. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*