Salut,
juste pour ajouter que j'ai utilisé une solution de type I pour le dd de
mon serveur qui commençait à présenter des blocks défectueux l'été
dernier (saloperie de canicule), et que c'est plutôt satisfaisant.
Bon, comme j'avais la flemme de faire les calculs et de recréer des
partitions précisément au bons endroits, je me suis contenté de ne plus
utiliser la première partition de mon disque (qui contenait touts les
bad blocks) sur laquelle je montais / initialement. Résultat, je me
retrouve amputé de 10GB mais je n'ai plus eu aucun problème depuis.
Je croise les doigts pour qu'il passe cet été...
Mathieu.
On Wed, Jul 19, 2006 at 01:10:24AM +0200, Olivier Allard-Jacquin wrote:
> Bonsoir Frédéric,
>
> Frédéric a écrit :
> > On Tuesday 18 July 2006 23:54, Frédéric wrote:
> >
> >> J'ai un disque dur de portable qui commençait à merdouiller (secteurs
> >> illisibles) suite à un choc (je l'ai donc changé). Je suppose que la
> >> tête à bousillé une partir de la surface. Est-ce qu'il est quand même
> >> possible d'utiliser les parties non abîmées du disque ? Est-ce qu'au
> >> formatage le système de fichier est capable de sauter les endroits
> >> foireux ? Que faut-il utiliser comme outils ?
> >
> > Je viens de penser à un truc : si j'arrive à repérer quel est l'endroit
> > foireux, il doit être possible ensuite de l'éviter en faisant des
> > partitions hors de cette zone, non ? Comment faire ce repérage ?
>
> J'ai été confronté récemment à ce type de problème :
>
> ----- Solution I -----
>
> - pour la détection des blocs défectueux, et QUELQUE SOIT le type de
> partition qu'il y a sur le dd, un bon vieux
>
> dd if=/dev/hda of=/dev/null 1> /tmp/log/status_hda.txt 2>&1
>
> fait l'affaire. L'idée est de lire toute la surface du disque
> (/dev/hda), et de rediriger les messages d'erreur dans un fichier. Bien
> évidement, pour faire ce test on bootera la machine sur un autre disque
> dur, ou tout simplement sur un LiveCD (knoppix, ...)
>
> - en analysant les log, tu peux déterminer le ou les zones défectueuses.
> Tu auras les numéros blocs défectueux qui s'afficheront, et un "fdisk
> /dev/hda -l" te donnera le nombres de blocs du disque. Une simple règles
> de trois te donnera donc les secteurs de débuts et de fin endommagés.
>
> - l'idée sera alors de créer autant de partition "mortes" autour de ces
> zones de secteurs défectueux. Si tu veux être un peu tranquille,
> n'hésite pas à faire des partitions qui "débordent" largement autour de
> la zone abîmée, par exemple en commençant la partition 50Mo avant les
> premiers blocs défectueux, et terminant 50Mo après le dernier bloc abîmé.
>
> - lorsque tu feras tes partitions, tu peux changer le type pour les
> partitions "mortes" (sous "fdisk", il faut utiliser la touche "t"), en
> mettant par exemple "0". Ainsi, tu ne sera pas tenté de les formater ou
> de les monter.
>
> - enfin, tu formates les partitions "saines", et tu pries très fort pour
> que d'autres secteurs défectueux n'apparaissent pas...
>
> J'ai personnellement testé cette méthode sur un DD abîmé. J'avais isolé
> en DEBUT de disque une zone de 100Mo que je considérai comme
> défectueuse. Mais au bout de quelques semaines d'utilisation, les 7Go de
> FIN de disque ont commencé à faire apparaître de nouveaux blocs
> endommagés. Pire encore, les blocs étaient sur une table d'inode ext3,
> et j'ai eu des plantages très sévères. J'ai dus tout reformater, et
> créer une nouvelle partition "morte" de 7Go en fin de disque. Une
> semaine encore après, d'autres secteurs défectueux sont apparus, plutôt
> en MILIEU de disque...
>
> Bref, c'est pas la joie de travailler avec un DD abîmé... Plus on
> l'utilise, plus il peut y avoir de problèmes...
>
> ----- Solution II -----
>
> Une autre solution existe, moins "bourrine" que la création de
> partitions "mortes". Tu fais (sur une partition NON montée) un
> "fsck.ext3 -c /dev/hdaX", ou "X" est un numéro de partition. Cela va
> rechercher les secteurs défectueux, et modifier une table du système de
> fichier pour lui indiquer de NE PLUS utiliser ces blocs là. En fait,
> cette option "-c" utilise la commande "badblocks" pour faire cette
> recherche (lire "man badblocks" et "man e2fsck.ext3").
>
> A noter que "fsck.ext3 -c -c /dev/hdaX" effectue un test en
> lecture/écriture, ce qui est plus pertinent, mais aussi BEAUCOUP plus
> long... :=(
>
> A titre d'info, sur un DD de 80Go, il faut plusieurs heures pour un
> test en lecture. Et plusieurs JOURS pour un test en lecture/écriture...
>
> Cette méthode marche pas mal. MAIS, si tu as quelques secteurs
> "fragiles mais non cassés" à cotés des blocs défectueux, ceux-ci ne
> seront pas marqués comme inutilisables. Et donc tu pourrais rapidement
> avoir de nouveaux problèmes. C'est pourquoi la création de partition
> "mortes" est intéressantes, surtout lorsque beaucoup défectueux sont
> apparus dans une même zone.
>
> ----- Solution III -----
>
> Enfin, une troisièmes possibilité : lire tout les fichiers du disque
> dur, et repérer ceux qui se trouvent sur des secteurs défectueux. Une
> fois cette recherche faite, tu déplaces ces fichiers-la dans un
> répertoire à part (genre "/BAD_BLOCS/"), et tu penses à ne plus les
> utiliser. Cette technique permet donc de "réserver" l'espace de blocs
> défectueux.
>
> J'ai écris un petit script qui fait cette lecture et qui stocke dans
> "/tmp/test_file_RESULT.txt" le résultat de l'analyse. L'utilisation de
> la commande "time" permet d'avoir un aperçu du temps que le fichier a
> mis pour être lu. Si c'est anormalement long, alors il y avait des
> secteurs défectueux à cet endroit. De toute façon, tu trouveras aussi
> dans ce fichier des messages de type
>
> <extrait>
> ide: failed opcode was: unknown
> end_request: I/O error, dev hda, sector 137592695
> hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
> hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=137592700,
> sector=137592695
> </extrait>
>
> qui te diront aussi qu'il y a eu un problème.
>
> <script>
> [olivier@phoenix bin]$ cat test_file.sh
> #!/bin/bash -norc
>
> PID=$$
> TMP_FILE=/tmp/test_file.$PID
> RESULT_FILE=/tmp/test_file_RESULT.txt
>
> if [ -z "$1" ]; then
>
> echo "##### ERROR: Need at least a file name as parameter !"
> fi
>
> for FileName in $@; do
>
> echo "+ $FileName ..."
> Result=`time (echo "$FileName" && cat "$FileName" | wc -c) 1>
> $TMP_FILE 2>&1`
>
> echo -ne "`date "+%Y-%m-%d_%X"`\t" >> $RESULT_FILE
> tr \\n \\t < $TMP_FILE >> $RESULT_FILE
> echo "" >> $RESULT_FILE
>
> [ -f "$TMP_FILE" ] && rm -f $TMP_FILE
> done
> </script>
>
> Attention, le script accepte de tester plusieurs fichiers, mais pas de
> sous-répertoire
>
> Tu peux le lancer de cette manière :
> test_file.sh *
>
> ou pour une arborescence complète :
> find . -type f -print0 | xargs --null test_file.sh
>
> ----- CONCLUSION -----
>
> Pour conclure :
> - tu as plusieurs méthodes afin de continuer à utiliser ce disque dur
> défectueu.
>
> - je te conseille de ne pas y laisser dessus des données importantes,
> car elles peuvent disparaître à tout moment.
>
> - un phénomène de "pourrissement", ou de "gangrène" du disque dur peu
> arriver (des particules peuvent "voler" dans le disque, et peuvent
> corrompre de nouveaux blocs), auquel cas, tu peux perdre aléatoirement
> des fichiers.
>
> - si les inodes sont touchés par les secteurs défectueux, ET que Linux
> veut y accéder (en lecture/écriture), tu as droit à un plantage
> "semi-grave" : plus aucune application ne peut être lancée, le "init 0"
> ne marche donc plus -> reset hardware de la machine.
>
> Bonne chance quand même... ;)
>
> Olivier
>
> PS: Hummm, sacré tartine quand même... Jérôme a été plus rapide que
> moi... ;)
>
> --
> ~~~~~~~ _____/\_____ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Phoenix / _ \/ _ \ Olivier Allard-Jacquin
> / / \ / \ \ Web: http://olivieraj.free.fr/
> /___/ / \ \___\ Mail: olivieraj@???
> ~~~~ ///// ///\\\ \\\\\ ~~~~~~~~~~~~~~~~~~~~~~~ Linux Powered !!
--
If a function be advertised to return an error code in the event of
difficulties, thou shalt check for that code, yea, even though the
checks triple the size of thy code and produce aches in thy typing
fingers, for if thou thinkest "it cannot happen to me," the gods shall
surely punish thee for thy arrogance.