URL: https://linuxfr.org/news/sauver-un-disque-dur-mecanique Title: Sauver un disque dur mécanique Authors: ʭ ☯ Pierre Jarillon, ZeroHeure, Davy Defaud et Julien Jorge Date: 2020-02-06T10:47:20+01:00 License: CC by-sa Tags: Score: 7 Nous savons tous qu’un disque qui a des secteurs défectueux n’est pas réputé fiable, que ça ne coûte rien un disque de remplacement, etc. Il n’empêche que c’est dommage de jeter le disque, certaines pannes sont contournables. Nous allons voir comment nous en servir pour nous familiariser avec la structure du disque, de ses partitions logiques (LVM) et de son formatage, tout en sachant que la fiabilité d'un disque abimé reste très aléatoire et que la _réparation_ sera précaire. Il ne s’agit pas ici de [récupérer des données](/news/ddrescue-dd_rescue-myrescue-recuperer-ses-donnees-apres-un-crash-disque) (vous aviez des sauvegardes, n’est‑ce pas ?) mais uniquement de pouvoir réutiliser le disque. Voyons comment faire… ---- ---- HS et HS ======== J’ai joué sur mon temps libre à essayer d’utiliser un disque de 1 To qui a énormément de secteurs défectueux suite à une chute allumé. Ce qui rend cette panne intéressante, c’est que le disque reste stable : les secteurs abimés n’augmentent pas dans le temps. Le disque est tout à fait fonctionnel si l’on utilise les « bonnes » zones. En revanche, il devient très lent et finit par réinitialiser l’interface SATA si on lit aux mauvais endroits. Il nous faut donc choisir les bonnes zones et les assembler ensemble pour avoir quand même une « grosse » partition virtuelle utilisable. Une stratégie possible est de créer une partition logique par zone correcte, et de les assembler dans un seul volume logique avec LVM. Travailler hors disque ====================== Pour travailler sur le disque, il ne faut pas l’utiliser. J’utilise donc un média autonome de ma distribution préférée. Je commence par supprimer toutes les partitions, puis m’assure que le début du disque est correct car c’est là que sera stockée la liste des partitions avec `dd`. dd if=/dev/sda of=/dev/null count=1000 Chercher les bonnes zones ========================= Pour trouver les bonnes zones, il faut tâtonner. Cela veut dire essayer de lire le disque, jusqu’à ce que ça coince. Si la zone avant que ça coince est suffisamment grande, on en fait une partition logique. Pour lire, on utilisera l’utilitaire `dd` combiné avec `pv` : ils permettent de lire des secteurs précis, tout en observant le débit constaté. dd if=/dev/sda skip=nbSecteursSautés | pv > /dev/null En faisant `Ctrl` + `c` dès que le débit baisse, j’évite de coincer trop longuement la lecture, et obtiens le nombre de secteurs lus. Ainsi, je trouve par exemple que la zone entre les secteurs 3 450 000 et 4 510 000 est correcte. Je le vérifie en la relisant précisément avec une commande similaire : dd if=/dev/sda skip=3450000 count=4510000 | pv > /dev/null Je peux alors créer ma partition. Comme il y en aura bien plus de quatre, j’utilise des partitions logiques dans `fdisk`, qui permet d’indiquer le secteur de début et le secteur de fin de chaque partition créée : fdisk /dev/sda Industrialiser (un peu) ======================= Ce serait dommage de perdre tout ce travail sur une fausse manipulation, il est donc tentant de garder sous le coude la table des partitions prête à être recréée. L’outil `sfdisk` permet de générer un fichier avec les partitions existantes, et surtout on peut y ajouter les nouvelles partitions au fur et à mesure qu’on trouve des zones. sfdisk -d /dev/sda > table_partitions.txt En éditant ce fichier, on voit que les partitions sont simplement définies par un début, une longueur et un type. J’ajoute donc les lignes des zones trouvées : ``` /dev/sda6 : start= 4100000, size= 900000, type=8E /dev/sda7 : start= 5100000, size= 900000, type=8E /dev/sda8 : start= 6100000, size= 900000, type=8E ``` Ensuite on remplace la table de partitions : sfdisk /dev/sda < table_partitions.txt Oh, chouette ! On dirait bien que c’est tout le temps la même zone de 100 000 secteurs qui est HS, suivie de 900 000 corrects. Je peux extrapoler les partitions suivantes, tout en vérifiant avec la commande ci‑dessus que cette zone est bien lisible. En pratique, ça ne marche pas aussi facilement à tous les coups, les zones se décalent, mais, bon, tout besoin de l’espace disque requis. Pour ma part, une fois 10 Go trouvés, je pouvais m’installer un système sur le disque, et ajouter de l’espace plus tard. Assembler l’espace ================== Les connaisseurs de LVM vous diront que c’est facile d’ajouter des volumes physiques à un groupe de volumes. Mais avec une soixantaine de partitions, un script aide bien. J’ai utilisé ça : ```sh $i=5; while vgextend VG-disk-HS /dev/sda$i; do i=$(($i+));done ``` Et voilà, un beau disque tout prêt. Pour m’assurer de la qualité du résultat obtenu, j’ai créé une partition qui utilisait tout le volume VG-disk-HS, je l’ai formatée, puis je l’ai vérifiée en lecture‐écriture : fsck.ext4 -cc /dev/mapper/VG-disk--HS-grosseBertha Notez le double « c » qui permet un test non destructif en écriture. Grappiller encore ================= Une fois le système installé, j’ai à nouveau du temps pour chercher des zones correctes, mais il est moins aisé d’ajouter des partitions : le disque est occupé en permanence. Qu’à cela ne tienne, on enlève un garde‐fou de `sfdisk` et ça passe : sfdisk --no-reread /dev/sda < table_partitions.txt partprobe J’en suis à soixante partitions, et cela ne met que huit secondes à l’allumage pour que LVM les rende disponibles. Le débit est très bon, puisque c’est le début du disque qui est sauvé.