S.M.A.R.T est un protocole supporté par la plupart des disques durs. Il fournit des indicateurs permettant de contrôler l'état de santé d'un disque dur et de prévenir les pannes physiques. Ce protocole existe depuis les années 90.
Indicateurs pouvant témoigner de la dégradation d'un disque:
$ sudo apt-get install smartmontools
Outil graphique
$ sudo apt-get install gsmartcontrol
Pour vérifier que le disque supporte SMART:
$ sudo smartctl --info /dev/sda
Ci-dessous un exemple de résultat:
=== START OF INFORMATION SECTION === Model Family: Seagate Barracuda 7200.10 Device Model: ST380815AS (...) SMART support is: Available - device has SMART capability. SMART support is: Enabled
Les deux dernières lignes nous intéressent. Elles indiquent que le protocole SMART est supporté et qu'il a déja était activé sur le périphérique. S'il n'est pas activé la commande suivante permet de le faire:
$ sudo smartctl --smart=on --offlineauto=on --saveauto=on /dev/sda
La commande ci dessus active SMART pour le dique /dev/sda
Lorsque le disque est connecté via USB, la commande smart peut retourner un message d type:
/dev/sdb: Unknown USB bridge [0x0480:0xb207 (0x315)] Please specify device type with the -d option. Use smartctl -h to get a usage summary
La plupart des bridges(ponts/convertisseurs) USB ne sont pas directement supportés par l'outil smartctl cependant ils peuvent fournir les données smart via le standard SAT (SCSI/ATA transfer):
smartctl -d sat -i /dev/sdb
Les différents modes disponibles sont listés par l'aide. L'argument -d et sa valeur devront être spécifiés sur chaque commande.
Lorsque le test est en cours, même si l’accès au disque est un peu ralenti, il reste normalement fonctionnel. Selon l'option on peut lancer un test court ou long
sudo smartctl -d sat -t short /dev/sdb
$ sudo smartctl -t long /dev/sda (...) Testing has begun. Please wait 27 minutes for test to complete. Test will complete after Thu Jan 23 14:36:18 2014
La durée d'un test long dépend du périphérique. Ici le résultat nous indique qu'il durera environ 20 min.
Pour consulter le fichier de log résultat de l'autotest
$ sudo smartctl -l selftest /dev/sdX
Pour n'afficher que les erreurs:
$ sudo smartctl -q errorsonly -H -l selftest /dev/sda
Chaque attribut décrit un aspect de l'usure du disque. Pour afficher tous les attributs SMART:
$ sudo smartcl -A /dev/sda
La commande retourne un tableau:
=== START OF READ SMART DATA SECTION === SMART Attributes Data Structure revision number: 10 Vendor Specific SMART Attributes with Thresholds: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x000f 083 083 034 Pre-fail Always - 215590105 3 Spin_Up_Time 0x0003 099 099 000 Pre-fail Always - 0 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 535 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0 7 Seek_Error_Rate 0x000f 066 060 030 Pre-fail Always - 5174061 9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 250 (157 235 0) 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 530 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 187 Reported_Uncorrect 0x0032 001 001 000 Old_age Always - 4297 188 Command_Timeout 0x0032 100 096 000 Old_age Always - 4295032842 189 High_Fly_Writes 0x003a 100 100 000 Old_age Always - 0 190 Airflow_Temperature_Cel 0x0022 070 053 045 Old_age Always - 30 (Min/Max 23/30) 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 10 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 65 193 Load_Cycle_Count 0x0032 097 097 000 Old_age Always - 7114 194 Temperature_Celsius 0x0022 030 047 000 Old_age Always - 30 (0 8 0 0 0) 195 Hardware_ECC_Recovered 0x001a 052 048 000 Old_age Always - 215590105 196 Reallocated_Event_Count 0x000f 100 100 030 Pre-fail Always - 211 (1045 0) 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 6 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 6 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0
Pour chaque attribut, plusieurs valeurs sont disponibles:
Les valeurs
Une valeur proche du seuil pour les attributs peut indiquer une panne électromécanique imminente.
Nom de l'attribut | Rôle |
Raw_Read_Error_Rate | Fréquence d'apparition d'erreurs pendant la lecture de données brutes. Peu indiquer un problème sur la surface ou sur les têtes. |
---|---|
Spin_Up_Time | Temps de mise en rotation du disque. Une augmentation peut annoncer une défaillance du contrôleur ou du matériel. |
Start_Stop_Count | Nombre de cycles arrêt/démarrage de l'axe de rotation |
Reallocated_Sector_Ct | Nombre de secteurs ré-alloués (le contenu a été placé dans une zone spécifique réservé c'est le remapping plus de bads blocks). Un nombre élevé de secteurs ré-alloués augmente les temps I/O. |
Seek_Error_Rate | Fréquence d'erreurs pendant le positionnement de la tête magnétique. Une augmentation indique dégradation du disque et du système mécanique. |
Power_On_Hours | Nombre d'heures de fonctionnement |
Spin_Retry_Count | Nombre d’échecs pour atteindre la vitesse de rotation normale du disque. Augmentation signale problème mécanique. |
Command_Timeout | Nombre d'opérations abandonnées car non réponse du disque. |
Power_Cycle_Count | Nombre de cycles de mise sous tension |
Temperature_Celsius | Température interne du disque en degrés Celsius |
Hardware_ECC_Recovered | Nombre de corrections ECC réalisées |
Current_Pending_Sector | Nombre de secteurs en attente de ré-allocation (remapping vers la zone de réserve). |
Offline_Uncorrectable | Erreurs non corrigibles en lecture/écriture. Une augmentation traduit défaiut de surface ou mécanique. |
UDMA_CRC_Error_Count | Nombre d'erreurs de CRC pendant un accès Ultra DMA, vérifier connectique |
Le système hôte peut envoyer une commande standby au périphérique après un temps d'inactivité des entrées/sorties. Les journaux de tests rapportent alors les messages Aborted by host ou Interrupted (host reset). Ce comportement est fréquent sur les disque derrière des ponts (bridge) usb.
Un simple script tel que celui-ci permet d’éviter l’arrêt du disque en provoquant régulièrement une lecture:
while true; do dd if=/dev/sdX iflag=direct count=1 of=/dev/null sleep 60 done
Pour la gestion de l'alimentation des périphériques usb voir également le wiki alimentation-peripherique.
Sources: