web-dev-qa-db-fra.com

Comment utiliser HDPARM pour réparer un secteur en attente?

SMART indique un secteur en attente du disque dur de mon serveur. J'ai lu des articles de lot de lots recommandant d'utiliser HDParm pour forcer "facilement" le disque pour déplacer le mauvais secteur, mais je ne trouve pas la bonne façon de l'utiliser.

Quelques informations de mon "smartctl":

Error 95 occurred at disk power-on lifetime: 20184 hours (841 days + 0 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 d7 55 dd 02  Error: UNC at LBA = 0x02dd55d7 = 48059863

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 08 d6 55 dd e2 00  18d+05:13:42.421  READ DMA
  27 00 00 00 00 00 e0 00  18d+05:13:42.392  READ NATIVE MAX ADDRESS EXT
  ec 00 00 00 00 00 a0 02  18d+05:13:42.378  IDENTIFY DEVICE
  ef 03 46 00 00 00 a0 02  18d+05:13:42.355  SET FEATURES [Set transfer mode]
  27 00 00 00 00 00 e0 00  18d+05:13:42.327  READ NATIVE MAX ADDRESS EXT

 SMART Self-test log structure revision number 1
 Num  Test_Description    Status                  Remaining  LifeTime(hours)        LBA_of_first_error
 # 1  Extended offline    Completed: read failure       90%     20194         48059863
 # 2  Short offline       Completed without error       00%     15161         -

Avec ce "mauvais LBA" (4805986) à la main, comment utiliser HDParm? Quel type d'adresse Les paramètres "- paysad-secteur" et "-" Secteur "devraient avoir?

Si je délivrant la commande HDPARM-SecteurADead-Sector 48095863/Dev/SDA Il lit et vide les données. Si cette commande avait raison, je devrais vous attendre à une erreur d'E/S, non?

Au lieu de cela, il décharge des données:

$ ./hdparm --read-sector 48059863 /dev/sda

/dev/sda:
reading sector 48059863: succeeded
4b50 5d1b 7563 a932 618d 1f81 4514 2343
8a16 3342 5e36 2591 3b4e 762a 4dd7 037f
6a32 6996 816f 573f eee1 bc24 eed4 206e
(...)
7
Nino

Si, pour une raison quelconque, vous préférez essayer de supprimer ces secteurs défectueux et que vous ne vous souciez pas du contenu existant d'un lecteur, l'extrait de coque ci-dessous peut aider. J'ai testé cela sur une ancienne bague de barracuda Seagate qui dépasse bien sa garantie. Cela pourrait ne pas fonctionner avec d'autres modèles d'entraînement ou fabricants, mais il devrait vous mettre sur le bon chemin si vous DOIT Script quelque chose. IT Will Détruire tout contenu que vous avez sur le lecteur.

Vous préférerez peut-être simplement courir des badblocs, une Erase sécurisée HDPARM (SE) ( https://wiki.archlinux.org/index.php/securely_wipe_disk ) ou un autre outil réellement conçu pour cela. Ou même le fabricant fourni des outils tels que SoinTools (il existe une version de 32 bits Linux 'Enterprise', Google IT).

Assurez-vous que le lecteur en question est complètement inutilisé/démonté avant de le faire. En outre, je sais, tandis que la boucle, pas d'excuses. C'est un hack, vous pouvez le rendre meilleur ...

baddrive=/dev/sdb
badsect=1
while true; do
  echo Testing from LBA $badsect
  smartctl -t select,${badsect}-max ${baddrive} 2>&1 >> /dev/null

  echo "Waiting for test to stop (each dot is 5 sec)"
  while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print substr($4,1,9)}')" != "Completed" ]; do
    echo -n .
    sleep 5
  done
  echo

  badsect=$(smartctl -l selective ${baddrive} | awk '/# 1  Selective offline   Completed: read failure/ {print $10}')
  [ $badsect = "-" ] && exit 0

  echo Attempting to fix sector $badsect on $baddrive
  hdparm --repair-sector ${badsect} --yes-i-know-what-i-am-doing $baddrive
  echo Continuning test
done

L'un des avantages de l'utilisation de la méthode "Selftest" est la charge est gérée par le micrologiciel du variateur, de sorte que le PC qu'il est connecté n'est pas chargé comme si elle serait avec DD ou Badblocks.

Remarque: Je suis désolé, j'ai commis une erreur, la condition correcte tandis que c'est comme ça:

while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print $4}')" = "Self_test_in_progess" ]; do

Et la condition de sortie du script devient:

[ $badsect = "-" ] || [ "$badsect" = "" ] && exit 0
7
Glenn

Je pense que cela peut avoir lu sans erreur car ce secteur n'est pas mauvais, mais d'autres outils échouent à la lecture du secteur en raison d'un autre comportement. (lu à l'avance qui atteint un secteur réellement illisible?)

J'ai trouvé des secteurs méchants et si je répare le seul illisible avec "HDParm-Sector", les autres secteurs "mauvais" ne sont plus illisibles avec des choses comme DD. Et de manière intéressante, lorsque vous regardez la sortie "DMESG", seuls les personnes maladables-illisibles sont jamais signalées.

par exemple. J'ai eu des secteurs 36589320 à 36589327 et 36589344 à 36589351 illisibles avec DD, mais seulement 36589326 et 36589345 étaient illisibles avec le secteur HDParM -Read. Ensuite, j'ai utilisé le secteur HDParm --Write sur ces 2, puis tous les 16 secteurs étaient à nouveau lisibles.

Voici une petite partie de la sortie DMESG:

[30152036.527940] end_request: I/O error, dev sda, sector 36589326
[30152077.363710] end_request: I/O error, dev sda, sector 36589345

Et les informations sur le disque:

# smartctl -i /dev/sda
...
=== START OF INFORMATION SECTION ===
Device Model:     Toshiba MK2002TSKB
...
Firmware Version: MT2A
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Size:      512 bytes logical/physical
...

Et apparemment, ce micrologiciel de ce disque n'enregistre pas correctement les secteurs réaffectés, sinon ils n'étaient pas vraiment réaffectés, mais simplement corrompus (comme une erreur ECC irrécupérable, mais la surface fonctionne toujours, comme si elle était causée par une pourriture des bits plutôt que des électrons défectueux ou mauvais médias):

# smartctl -A /dev/sda | egrep "Reallocated|Pending|Uncorrectable"
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0

# smartctl -l error /dev/sda
...
SMART Error Log Version: 1
No Errors Logged

Veuillez noter que j'ai dirigé un secteur -Nead et un secteur A -WRITE. Une lecture peut être nécessaire pour réaffecter correctement un secteur, pas seulement une écriture. Si vous ne lisez pas en premier, cela pourrait ne pas savoir que le secteur est mauvais.

4
Peter