DISQUE DUR : diagnostic et réparation avec smartctl/fsck, dual-boot

Bonjour,

j’ai sous la main un portable (d’un parent) datant de quelques années, initialement vendu sous windows 7. L’os d’origine est encore installé, et tourne, avec des ralentissements insupportables, mais pas systématiques : lors de mon premier test, je n’ai par exemple observé aucun problème. Le propriétaire ayant entre-temps acheté une machine neuve, cela a été l’occasion d’installer un dual-boot (jessie) sur la vieille machine. L’installation s’est bien déroulée, le premier démarrage aussi.

Lors des démarrages suivants sous debian, j’observe toutes sortes de blocages : pas de session graphique, ou bascule vers initramfs, ou kernel panic.

Lors du démarrage sous jessie, mais aussi durant un fsck à partir de initramfs, j’ai des lignes de codes qui s’affichent, comportant notamment :
end_request I/O error, dev sda, sector ********* Buffer I/O error on device sda5, logical block *********

Windows 7 continue à démarrer. La machine tourne sans souci sur live usb.

J’ai tenté des fsck depuis live usb et initramfs, beaucoup d’erreurs sont corrigées à chaque fois (de natures diverses, mais je ne connais pas les notions qui me permettraient une description utile - je suis prêt évidemment à relever ce qui vous paraîtra pertinent).

Je pense à un disque dur en fin de vie (les données ont été sauvegardées). Mes questions :

  1. comment confirmer le diagnostic (et vous paraît-il sensé ?)
  2. existe-t-il un moyen pour mettre de côté les secteurs défectueux et continuer à travailler avec des parties saines du dd ?

Merci beaucoup.

1/ Selon la marque du HD, le fabriquant met à disposition un outil, c’est le cas de Seagate, de WD … qui permet d’analyser le HD en question …
2/ Avec ce genre d’outils, oui s’ils le peuvent, ils le font bien … mais cela reste et doit rester une solution temporaire, car le HD en question est vraiment en fin de vie. Mieux vaut investir dans un nouveau !

Linux a toujours été plus critique, sensible et est généralement le premier a dévoilé ce genre de dysfonctionnement.

En fait, Windows le marque quand les logs qui sont totalement incompréhensible pas le commun des mortels, du coup, si tu ne vas pas voir les logs, tu n’es pas au courant.

En affichant le diagnostic SMART du disque.
Installer le paquet smartmontools et exécuter la commande
smartctl -a /dev/sda

A trois niveaux.

  • Au niveau du disque lui-même, on peut tenter de faire réallouer les secteurs défectueux dans des secteurs de réserve, s’il en reste.
  • Au niveau de la table de partitions, si les secteurs défectueux sont suffisamment regroupés et/ou peu nombreux, les isoler hors des partitions ou dans des partitions inutilisées.
  • Au niveau du système de fichiers, détecter et marquer les blocs défectueux avec l’option -c de fsck (lors de la vérification d’un système de fichiers existant) ou mkfs (lors de la création d’un nouveau système de fichiers).
1 J'aime

Je savais qu’il y avait moyen sous Linux … et en plus des outils que je connais. Tsss, quand ça ne veut pas sortir …
En tout cas, merci @PascalHambourg :wink:

Merci pour vos réponses. Voilà le retour de smartctl :

smartctl 6.4 2014-10-07 r4002 [x86_64-linux-3.16.0-4-amd64] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     SAMSUNG SpinPoint M7E (AF)
Device Model:     SAMSUNG HM641JI
Serial Number:    S26XJ9DB727773
LU WWN Device Id: 5 0024e9 205ac198e
Firmware Version: 2AJ10002
User Capacity:    640 135 028 736 bytes [640 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    5400 rpm
Form Factor:      2.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 6
SATA Version is:  SATA 2.6, 3.0 Gb/s
Local Time is:    Wed Jul 20 16:02:00 2016 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00)    Offline data collection activity
                    was never started.
                    Auto Offline Data Collection: Disabled.
Self-test execution status:      (  25)    The self-test routine was aborted by
                    the host.
Total time to complete Offline 
data collection:         ( 9900) seconds.
Offline data collection
capabilities:              (0x5b) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    Offline surface scan supported.
                    Self-test supported.
                    No Conveyance Self-test supported.
                    Selective Self-test supported.
SMART capabilities:            (0x0003)    Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01)    Error logging supported.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:      (   2) minutes.
Extended self-test routine
recommended polling time:      ( 165) minutes.
SCT capabilities:            (0x003f)    SCT Status supported.
                    SCT Error Recovery Control supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   100   051    Pre-fail  Always       -       3985
  2 Throughput_Performance  0x0026   252   252   000    Old_age   Always       -       0
  3 Spin_Up_Time            0x0023   089   088   025    Pre-fail  Always       -       3416
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       867
  5 Reallocated_Sector_Ct   0x0033   252   252   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   252   252   051    Old_age   Always       -       0
  8 Seek_Time_Performance   0x0024   252   252   015    Old_age   Offline      -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       1131
 10 Spin_Retry_Count        0x0032   252   252   051    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       19
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       859
191 G-Sense_Error_Rate      0x0022   100   100   000    Old_age   Always       -       376
192 Power-Off_Retract_Count 0x0022   252   252   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0002   064   052   000    Old_age   Always       -       23 (Min/Max 9/52)
195 Hardware_ECC_Recovered  0x003a   100   100   000    Old_age   Always       -       0
196 Reallocated_Event_Count 0x0032   252   252   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   099   000    Old_age   Always       -       81
198 Offline_Uncorrectable   0x0030   252   252   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0036   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x002a   100   100   000    Old_age   Always       -       140
223 Load_Retry_Count        0x0032   100   100   000    Old_age   Always       -       19
225 Load_Cycle_Count        0x0032   099   099   000    Old_age   Always       -       17352

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Aborted by host               90%      1131         -
# 2  Extended offline    Completed: read failure       90%      1129         42988361
# 3  Short offline       Completed: read failure       90%      1128         43901985

SMART Selective self-test log data structure revision number 0
Note: revision number not 1 implies that no selective self-test has ever been run
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Aborted_by_host [90% left] (0-65535)
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Le test avorté provient d’une fausse manip, merci de ne pas en tenir compte. J’imagine que l’information cruciale est le “read failure” : y a-t-il une conclusion définitive à en tirer ? Y a-t-il d’autres éléments qui donnent une info pertinente ?

Concernant les suggestions de Pascal :

  • l’option -c peut-elle être passée quel que soit le format de la partition (ie : aussi bien sur les partitions windows que linux ?)
  • la localisation précise des secteurs défectueux se fait avec des smartctl selectifs, c’est ça ?

Concernant les log de Windows, je ne suis pas prêt à consacrer du temps pour m’y plonger, mais merci de l’info.

L’information cruciale est la valeur brute de l’attribut n° 197 “Current_Pending_Sector” qui indique 81 secteurs défectueux actuellement illisibles. Il y en a peut-être plus mais qui n’ont pas fait l’objet d’une tentative de lecture donc n’ont pas encore été détectés. L’attribut n° 5 “Reallocated_Sector_Ct” indique qu’aucun secteur défectueux n’a été réalloué.

L’option -c n’est pas disponibles pour tous les systèmes de fichiers, seulement pour ceux comme ext2/3/4 dont les variantes de mkfs et fsck la supportent. Le support de NTFS dans Linux est limité, il n’y a pas de variantes de fsck et mkfs pour ce format. Pour le format FAT, mkfs.vfat alias mkdosfs supporte l’option -c et fsck.vfat alias dosfsck a une option -t qui semble équivalente.

Avec fsck, l’option -c a un autre inconvénient : on ne sait pas quels sont les fichiers qui contenaient (ou étaient contenus dans) des blocs défectueux. Après la mise à l’écart de ces blocs, ces fichiers sont corrompus.

L’option -c fait appel à la commande badblocks pour détecter les blocs défectueux. Cette commande peut être exécutée directement sur un disque ou une partition, voire un simple fichier. Je ne connais pas de moyen pour lister de façon exhaustive les secteurs défectueux avec smartctl. On peut voir les adresses LBA de quelques-uns dans les logs d’erreur, mais c’est tout.

Bonsoir,

Ça ne serait pas plutôt les “Off-line uncorrectable” que tu viens de définir ?

Voilà des précisions au sujet des “Current_Pending_Sector” :
Définition en anglais de quelques attributs SMART

Je pense qu’ils sont pour l’instant considérés comme suspects…

Les deux attributs comptent les secteurs illisibles, mais pas détectés de la même façon (en ligne et hors ligne).

Je pensais :

Qu’un certain nombre de critères que j’ ignore permettait de définir un secteur bon ou mauvais.

Si il était mauvais une fois ou plus, alors il passait en “Current_Pending_Sector”.

Que le disque, à la suite d’autres tests décidait, soit de le réallouer , soit de le passer en secteurs illisibles, de le reconsidérer comme bon, ou de le laisser en “Current_Pending_Sector”.

Non, le seul critère est que la dernière tentative de lecture a échoué.

Merci pour l’interprétation de cette sortie, pour les explications concernant les différents formats de partition et pour le lien vers le guide rapide d’interprétation.

Pour lister les secteurs défectueux de manière exhaustive, je pensais simplement récupérer l’adresse LBA du premier secteur défectueux, puis lancer une recherche du premier secteur défectueux à partir de celui-ci avec un smartctl sélectif et ainsi de suite. Il me semble qu’il suffit d’un script avec une boucle while dont le test porte sur la sortie (*voir à la fin) d’un smartctl -t select n1, n2 /dev/sdax (avec n1 l’adresse du précédent secteur défectueux trouvé (initialisé à 0) et n2 une adresse de fin fixée). Evidemment, à raison de 165 minutes par passage dans la boucle, je ne vais pas mettre en oeuvre ceci. Mais en choisissant une valeur de n2 de la forme n1 + N avec une valeur de N raisonnable, il me semble qu’on devrait pouvoir découper la partition ou le disque en tranches de longueur N, les traiter une par une, et retomber sur un temps d’exécution important peut-être, mais relativement raisonnable.

Un détail : les valeurs de la colonne raw_value ne sont_elles pas en hexadécimal ?

(*) Bon, j’ai regardé la description des sorties de la commande smartctl, et je ne vois pas “l’adresse du premier secteur défectueux”. Mais je peux toujours la récupérer en créant un fichier par smartctl -a puis en lisant dans ce fichier.

Je laisse de côté un instant smartctl, et je reviens à fsck -c. J’en ai un en cours depuis deux heures et demi (il avance à la vitesse d’une tortue anémique, mais il avance). Comment interpréter l’indicateur sur les erreurs, actuellement (656/0/0 erreurs) ?

Je suppose qu’il s’agit de la sortie d’erreur de badblocks : nombres d’erreurs de lecture/écriture/corruption.

Non, je n’ai jamais vu de l’hexadécimal dans les valeurs brutes (ou normalisées) affichées.

Je pense qu’il faut la récupérer dans les logs avec -a ou -l.

Pour conclure ce fil : j’ai dépassé le temps total que je pouvais consacrer à ce disque dur défectueux. La situation était : un fsck -c qui est resté bloqué plusieurs heures sur 82% effectués, et je n’ai pas le temps de tester les outils de réparation à plus bas niveau suggérés par Pascal. Je réinstalle donc sur un disque dur neuf (et je suis en conséquence en train de me battre avec Windows, ce qui est déprimant).

Merci pour toutes vos interventions, mes idées sont plus claires désormais.