Smartmontools

De Cliss XXI
Révision datée du 23 novembre 2012 à 20:57 par 90.17.130.234 (discussion) (→‎Le démon smartd)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

Smartmontools permet de dialoguer avec de nombreux disques-dur pour obtenir des informations et statistiques sur leur état, permettant de diagnostiquer un disque-dur en fin de vie notamment.

Commandes de base

Activation des fonctionnalités SMART d'un disque

Activer les fonctionnalités SMART du disque /dev/sda:

# smartctl --smart=on --offlineauto=on --saveauto=on /dev/sda
smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.
SMART Attribute Autosave Enabled.
SMART Automatic Offline Testing Enabled every four hours.

ou, plus facile à retenir:

smartctl -s on -S on -o on /dev/sda

Lecture des attributs SMART d'un disque

Pour lire les valeurs des attributs SMART:

# smartctl -A /dev/hda
smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
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
  3 Spin_Up_Time            0x0027   252   252   063    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   253   253   000    Old_age   Always       -       0
  5 Reallocated_Sector_Ct   0x0033   253   253   063    Pre-fail  Always       -       0
  6 Read_Channel_Margin     0x0001   253   253   100    Pre-fail  Offline      -       0
  7 Seek_Error_Rate         0x000a   253   252   000    Old_age   Always       -       0
  8 Seek_Time_Performance   0x0027   250   245   187    Pre-fail  Always       -       58790
  9 Power_On_Minutes        0x0032   251   251   000    Old_age   Always       -       714h+26m
 10 Spin_Retry_Count        0x002b   252   252   157    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x002b   252   252   223    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   253   253   000    Old_age   Always       -       83
192 Power-Off_Retract_Count 0x0032   253   253   000    Old_age   Always       -       0
193 Load_Cycle_Count        0x0032   253   253   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0032   253   253   000    Old_age   Always       -       31
195 Hardware_ECC_Recovered  0x000a   253   252   000    Old_age   Always       -       4749
196 Reallocated_Event_Count 0x0008   253   253   000    Old_age   Offline      -       0
197 Current_Pending_Sector  0x0008   253   253   000    Old_age   Offline      -       0
198 Offline_Uncorrectable   0x0008   253   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0008   199   199   000    Old_age   Offline      -       0
200 Multi_Zone_Error_Rate   0x000a   253   252   000    Old_age   Always       -       0
201 Soft_Read_Error_Rate    0x000a   253   252   000    Old_age   Always       -       6
202 TA_Increase_Count       0x000a   253   252   000    Old_age   Always       -       0
203 Run_Out_Cancel          0x000b   253   252   180    Pre-fail  Always       -       2
204 Shock_Count_Write_Opern 0x000a   253   252   000    Old_age   Always       -       0
205 Shock_Rate_Write_Opern  0x000a   253   252   000    Old_age   Always       -       0
207 Spin_High_Current       0x002a   252   252   000    Old_age   Always       -       0
208 Spin_Buzz               0x002a   252   252   000    Old_age   Always       -       0
209 Offline_Seek_Performnce 0x0024   186   183   000    Old_age   Offline      -       0
 99 Unknown_Attribute       0x0004   253   253   000    Old_age   Offline      -       0
100 Unknown_Attribute       0x0004   253   253   000    Old_age   Offline      -       0
101 Unknown_Attribute       0x0004   253   253   000    Old_age   Offline      -       0 

Vérifiez la colonne "WHEN_FAILED" essentiellement.

Autre exemple, d'un disque en train de mourir (plein d'erreurs disques), état après un badblocks partiel :

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   001   001   051    Pre-fail  Always   FAILING_NOW 2144
  3 Spin_Up_Time            0x0007   100   091   021    Pre-fail  Always       -       2366
  4 Start_Stop_Count        0x0032   099   099   040    Old_age   Always       -       1152
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   200   200   051    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       1305
 10 Spin_Retry_Count        0x0013   100   100   051    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x0013   100   100   051    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1128
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0012   200   149   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0012   099   099   000    Old_age   Always       -       330
199 UDMA_CRC_Error_Count    0x000a   200   253   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0009   200   174   051    Pre-fail  Offline      -       0

Pour voir plus d'information sur le disque, utilisez l'option -a (qui affiche toutes les informations disponibles concernant le disque) :

smartctl -a /dev/sda

Effectuer des tests du disque

Des tests peuvent être lancés pendant le fonctionnement normal du disque :

smartctl -t short /dev/sda
smartctl -t long /dev/sda

Le test « long » est bien entendu plus complet et plus long que le test « short ». Ils ne perturbent cependant pas le fonctionnement normal du disque.

Pour vérifier les résultats, une fois le test terminé, utilisez la commande suivante pour afficher les logs des tests du disque et découvrir le résultat des tests:

smartctl -l selftest /dev/sda

Dans le cas du test « short », sa progression peut être visualisée avec la commande donnée ci-dessous smartctl -l selftest /dev/sda.

Pour les tests « long » ou « offline », tant qu'il n'est pas terminé, aucune indication n'apparaît dans les logs des tests. Sur certains disques, l'option -c (qui affiche les capacités du disque) permet de visualiser la progression du test. Attention toutefois, sur certains modèles, cette commande annule le test en cours: vous pouvez déterminer si ce sera le cas selon les capacités du disque: s'il affiche la capacité « Suspend Offline collection upon new command », le test ne sera pas stoppé par une autre commande smartctl, mais s'il affiche « Abort Offline collection upon new command », alors le test sera interrompu par la plupart des commandes de smartctl, et il faut donc éviter d'observer la progression du test par l'option -c.

Référez-vous au manuel de smartctl (1) pour plus de détails sur ces tests.

Traitement des mauvais blocs sur le disque

Dans la sortie de la commande smartmontools -A, les attributs SMART importants concernant les mauvais blocs sont :

  • Reallocated_Sector_Ct: les secteurs réalloués au cours de la vie du disque
  • Current_Pending_Sector: les secteurs « instables » à réallouer dès que possible
  • Reallocated_Event_Count: « le nombre total de tentatives de transfert de données entre un secteur réalloué et un secteur de réserve. Les essais fructueux et les échecs sont tous comptés au même titre. » (source: Wikipédia)
  • Offline_Uncorrectable: les secteurs qui ne peuvent pas être corrigés. Indique un défaut sur le disque.

Les disques durs actuels ont apparemment une réserve de blocs non utilisés, qui peuvent remplacer des blocs défectueux. Le remplacement se fait au moment de l'écriture sur le bloc défectueux (pas avant, pour laisser une chance de récupérer les données qui y sont inscrites).

Le Bad block HOWTO discute de ce sujet plus en détail et donne la marche à suivre en cas d'erreur d'écriture sur un bloc du disque.

Il peut cependant y avoir des cas où l'attribut « Current_Pending_Sector » n'est pas nul, mais aucune erreur n'est signalée par la commande smartctl -l error /dev/sda. Ce cas n'est pas très clairement indiqué dans le HOWTO.

Exemple

Notre exemple (tiré d'un cas réel) est un peu spécial car l'attribut Current_Pending_Sector n'est pas nul, mais aucune erreur n'est indiquée dans les logs du disque:

La commande suivante affiche (entre autre) la valeur de Current_Pending_Sector:

# smartctl -A /dev/sda
...
 5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
...
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       3
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       3
...

Ces informations peuvent être renvoyés par mail par smartd (voir la description de smartd plus bas dans ce document) sous la forme suivante :

The following warning/error was logged by the smartd daemon:
Device: /dev/sda, 3 Currently unreadable (pending) sectors
For details see host's SYSLOG (default: /var/log/syslog).

Et /var/log/syslog indique des lignes du type:

Device: /dev/sda, 3 Currently unreadable (pending) sectors
Device: /dev/sda, 3 Offline uncorrectable sectors

Mais, toujours dans notre cas, aucune erreur n'est remontée par SMART:

# smartctl -l error /dev/sda
smartctl version 5.38 [i686-pc-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/ 
=== START OF READ SMART DATA SECTION ===  
SMART Error Log Version: 1
No Errors Logged

Si, sur votre machine, SMART indique des erreurs, suivez simplement la procédure donnée par badblocks howto pour en forcer la réallocation après avoir déterminé les fichiers concernés.

Dans le cas contraire, comme ici, sans erreur indiquant les blocs affectés, on ne peut pas déterminer où se trouve l'erreur. Dans ce cas, une solution est forcer la réallocation des blocs en remplissant la partition, puisque la réallocation a lieu lors de l'écriture dans le bloc. Pour ce faire, effectuer les commandes suivantes sur chacune des partitions de la machine (remplacez /partition par le point de montage de la partition que vous voulez remplir):

dd if=/dev/zero of=/partition/FILL bs=4k
rm -f $p/FILL

Ici, la commande dd remplit un fichier plein de zéros qui va saturer l'espace libre de la partition (et devrait provoquer l'écriture dans les blocs instables). Elle s'arrêtera quand la partition sera pleine, et la commande rm qui suit supprimera immédiatement ce gros fichier pour ne pas perturber trop longtemps le fonctionnement de la machine.

Relancez ensuite la commande « smartctl -A /dev/sda », et l'attribut « Current_Pending_Sector » devrait être revenu à 0:

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
[...]
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
[...]
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
[...]

(Ici, Reallocated_Sector_Ct est toujours à 0, indiquant qu'aucun bloc n'a été réalloué. Dans ce cas, j'imagine que les blocs indiqués instables n'ont finalement pas posé de problème à l'écriture et n'ont pas dû être réalloués)

Autre exemple de valeurs d'attributs sur un disque de 2 ans (regarder la colonne RAW_VALUE), après un badblocs lecture/écriture complet (les blocs défectueux ont tous été réalloués):

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
[...]
  5 Reallocated_Sector_Ct   0x0033   192   192   140    Pre-fail  Always       -       62
[...]
196 Reallocated_Event_Count 0x0032   182   182   000    Old_age   Always       -       18
197 Current_Pending_Sector  0x0012   200   199   000    Old_age   Always       -       0

Le démon smartd

Pensez à activer le démon smartd, celui-ci vous préviendra en cas de problème détecté (courriel envoyé à root).

Sous Debian, dans /etc/default/smartmontools, décommenter la ligne:

#start_smartd=yes

Si votre système GNU/Linux est un peu ancien que vous avez des disques non IDE (disques SATA, vous devrez peut-être rajouter -d ata dans le fichier /etc/smartd.conf (c'est inutile sur les systèmes plus récents, a priori depuis Debian Lenny):

DEVICESCAN -d ata -m root -M exec /usr/share/smartmontools/smartd-runner

ou

/dev/sda -d ata -m root -M exec /usr/share/smartmontools/smartd-runner

Exemple:

This email was generated by the smartd daemon running on:

   host name: bob
  DNS domain: centre.local
  NIS domain: (none)

The following warning/error was logged by the smartd daemon:

Device: /dev/hda, ATA error count increased from 10 to 11

For details see host's SYSLOG (default: /var/log/messages).

You can also use the smartctl utility for further investigation.
No additional email messages about this problem will be sent.

Dans le syslog:

Nov  7 01:27:20 bob kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Nov  7 01:27:20 bob kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=10997362, high=0, low=10997362, sector=10997359
Nov  7 01:27:20 bob kernel: ide: failed opcode was: unknown
Nov  7 01:27:20 bob kernel: end_request: I/O error, dev hda, sector 10997359
Nov  7 01:28:20 bob smartd[3499]: Device: /dev/hda, SMART Prefailure Attribute: 1 Raw_Read_Error_Rate changed from 200 to 195
Nov  7 01:28:20 bob smartd[3499]: Device: /dev/hda, SMART Usage Attribute: 194 Temperature_Celsius changed from 99 to 97
Nov  7 01:28:20 bob smartd[3499]: Device: /dev/hda, ATA error count increased from 10 to 11
Nov  7 01:28:20 bob smartd[3499]: Sending warning via /usr/share/smartmontools/smartd-runner to root ...
Nov  7 01:28:21 bob smartd[3499]: Warning via /usr/share/smartmontools/smartd-runner to root: successful

Cependant j'ai aussi eu, mais sans notification cette fois:

Nov  7 09:58:20 bob smartd[3499]: Device: /dev/hda, SMART Prefailure Attribute: 1 Raw_Read_Error_Rate changed from 193 to 185
Nov  7 09:58:20 bob smartd[3499]: Device: /dev/hda, SMART Usage Attribute: 194 Temperature_Celsius changed from 96 to 95
Nov  7 09:58:20 bob smartd[3499]: Device: /dev/hda, ATA error count increased from 11 to 13

Donc je ne sais pas dans quels cas la notification courriel est envoyée :/

Autres exemples, sur le second disque:

email:

Device: /dev/hdb, 1 Currently unreadable (pending) sectors

syslog:

Nov 12 01:28:20 bob smartd[3499]: Device: /dev/hda, SMART Usage Attribute: 194 Temperature_Celsius changed from 97 to 95
Nov 12 01:28:20 bob smartd[3499]: Device: /dev/hdb, 1 Currently unreadable (pending) sectors
Nov 12 01:28:20 bob smartd[3499]: Sending warning via /usr/share/smartmontools/smartd-runner to root ...
Nov 12 01:28:21 bob smartd[3499]: Warning via /usr/share/smartmontools/smartd-runner to root: successful
Nov 12 01:28:21 bob smartd[3499]: Device: /dev/hdb, SMART Prefailure Attribute: 7 Seek_Error_Rate changed from 100 to 200
Nov 12 01:28:21 bob smartd[3499]: Device: /dev/hdb, SMART Usage Attribute: 194 Temperature_Celsius changed from 101 to 100

email:

Device: /dev/hdb, 1 Offline uncorrectable sectors

syslog:

Nov 12 07:58:19 bob smartd[3499]: Device: /dev/hdb, 1 Currently unreadable (pending) sectors
Nov 12 07:58:19 bob smartd[3499]: Device: /dev/hdb, 1 Offline uncorrectable sectors
Nov 12 07:58:19 bob smartd[3499]: Sending warning via /usr/share/smartmontools/smartd-runner to root ...
Nov 12 07:58:19 bob smartd[3499]: Warning via /usr/share/smartmontools/smartd-runner to root: successful

smartctl:

197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0012   200   200   000    Old_age   Always       -       1

Liens