Puis-je réparer de mauvais blocs sur mon disque dur avec une seule command?

Je travaille sur la correction des erreurs dans mon disque dur, il est possible de le faire manuellement mais cela peut prendre des heures.

Après avoir tapé cette command sudo badblocks -b 512 /dev/sda , j'ai obtenu des centaines de résultats et je veux éviter de les réparer manuellement.

Plus de détails sur mon erreur peuvent être trouvés ici

Donc, y at-il un outil que je peux utiliser pour corriger les erreurs? Ou peut-être que vous pourriez m'aider à écrire un script shell?

Eh bien, il y a quelques cas:

  1. Ce disque fait partie d'une masortingce RAID. Bien. Réparez le tableau comme echo 'repair' > /sys/block/md0/md/sync_action : echo 'repair' > /sys/block/md0/md/sync_action . Problème résolu sans perte de données. (Je suppose que ce n'est pas le cas pour vous, mais vous devriez vraiment envisager de changer cela.)
  2. Vous ne vous souciez pas des données sur le disque (ou il n'y en a pas). Utilisez simplement dd pour mettre à zéro le disque entier.
  3. Les mauvais blocs font partie de l'espace libre sur le disque. Utilisez par exemple, cat /dev/zero > tempfile pour remplir l'espace libre avec des zéros. Faites ceci en tant que root (il n'y a d'espace réservé pour root), probablement en mode mono-user (donc rien ne casse de manquer d'espace). Après cela, manquez d'espace, supprimez le file ( rm tempfile ).
  4. Les mauvais blocs font partie des données (files) ou des métadonnées (structure du système de files) sur le disque. Vous avez perdu des données. fsck -fc (exécuté avec le système de files démonté, ou le pire des cas en lecture seule au début du démarrage si c'est le système de files racine) vous dira quels files. Remplacez-les de la sauvegarde.

Il est également possible que les badblocks -n , qui ne doivent être faits que sur un système de files non monté , forceront un remap. Il ne devrait pas perdre de données (autre que ce qui était dans les mauvais blocs, ce qui est déjà perdu).

Si vous voulez le script basé sur la sortie des badblocks (ce qui n'est pas sûr , cela vous laisse une corruption silencieuse), c'est assez facile. Chaque ligne de sortie de blocs de blocs vous donne un numéro de bloc, en fonction de la taille de votre bloc (512 dans votre exemple). Utilisez la même taille de bloc pour les bs de dd. Le numéro de bloc est votre seek de dd. Votre count est de 1 (ou plus, s'il y a quelques blocs défectueux dans une rangée). of est la partition (ou le disque) sur laquelle vous avez exécuté les badblocks. Un bon if est /dev/zero .

passer en mode mono-user et faire fsck -yvf /dev/sda

Il semble que, il a besoin d'un fsck après tout.

Je ne suis pas sûr si vous pouvez le faire avec une seule command parce que j'ai vu une solution de script sur internet.

Le script ci-dessous détecte les secteurs défectueux, place les résultats des blocs défectueux dans un file text, et si la taille du file text est différente de zéro, e2fsck marquera les secteurs défectueux (donc ces secteurs marqués ne seront pas utilisés par le operating system).

 #!/bin/sh target=/tmp/bad-blocks.txt for disc in `fdisk -l | grep '^/' | awk '{ print $1 }'`; do badblocks -v $disc > $target if [ -s $target ]; then echo "badblock(s) found on $disc" e2fsck -l $target $disc else echo "no badblocks on $disc" fi done 

e2fsck -c -c semble faire la même chose, avec l'assurance de taille de bloc.