Mais comment donc ? Linux sur mon portable pourrait transformer son disque dur en une ruine fumante en l'espace de quelques mois ? Il se pourrait bien que oui, quoique cela ne soit pas certain...

Les disques durs des portables ont ceci de particulier, par rapport aux disques durs des machines de bureau, qu'ils sont étudiés pour minimiser autant que possible leur consommation d'énergie - pour prolonger l'autonomie de la batterie - et également pour mieux résister aux chocs en fonctionnement.

L'une de leurs fonctions pour ce faire est de pouvoir rétracter leurs têtes de lecture (les parquer) assez rapidement dès que le disque "ne fait rien" depuis quelques instants, permettant de cesser d'alimenter l'actuateur des têtes d'une part, et d'autre part de rendre le disque insensible à un éventuel choc - les têtes n'étant plus sur le disque, qui continue cependant à tourner. Les têtes sont alors rétractées sur une petite "rampe" où elles sont verrouillées en position, ne risquant plus de se crasher sur le disque en cas de choc un peu violent.

Jusqu'ici, ça semble bel et bon.

Sauf que...

Sauf que le parquage des têtes sur la rampe sollicite la mécanique du disque considérablement plus que le simple fonctionnement en lecture-écriture. Cela provoque une usure qui peut se terminer par des choses très désagréables.

Le nombre de fois qu'une tête peut être parquée et déparquée est variable selon le modèle de disque, mais tourne en moyenne autour de 600.000. Après quoi, le mécanisme est théoriquement usé.

600.000, c'est beaucoup si une tête une fois parquée n'est pas déparquée avant plusieurs minutes.

Mais ça devient relativement peu si la tête est parquée et déparquée plusieurs fois par minute, en permanence. Ça peut ruiner un disque dur de portable en l'espace de quelques mois, s'il est utilisé tous les jours...

Or, le parquage automatique des têtes est une tâche gérée directement par le disque dur, dès lors que le mode "économie d'énergie" est activé. Il parque alors ses têtes tout seul au bout de typiquement 5 à 10 secondes sans accès disque.

Or, un système Linux est plein de gentils petits démons qui font des accès disque réguliers, typiquement toutes les 30 secondes, même quand le système ne fait "rien".

Or, les noyaux Linux récents, qui sont malins, s'ils détectent (via l'ACPI) qu'ils tournent sur un portable et que son disque possèdent une fonction d'économie d'énergie, activent automatiquement celle-ci lors du boot. Ben ouais, quoi ?

Résultat ?

Parquer... Déparquer... Parquer... Déparquer... Parquer... Déparquer... Parquer... TZZzzzoiiiinnngg ! Aïe !

Mais comment savoir si c'est en train d'arriver à votre disque en ce moment même ? Pas dur : À l'oreille.

Lors des accès disque ordinaires, un disque dur de portable fait un gratouillis à peine audible. Lors du parquage, il fait un petit "Cloc !"

Allumez votre portable dans une pièce calme, laissez-le 10 minutes que les cronjobs quotidiens puissent être exécutés, et écoutez-le. Entendez-vous le disque dur émettre un léger "Cloc !" 2 ou 3 fois par minute ? Si oui, vous avez le problème.

Vérifions : Installez le package smartmontools :

aptitude install smartmontools

Déterminez (avec la commande "mount" sans paramètre) si votre disque dur s'appelle "hda" ou "sda". Ce sera probalement "hda" pour un disque PATA, ou "sda" pour un disque SATA.

Affichons maintenant les paramètres SMART du disque :

smartctl -A /dev/sda

smartctl version 5.37 [i686-pc-linux-gnu] Copyright (C) 2002-6 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
  1 Raw_Read_Error_Rate     0x000b   100   100   062    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   040    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0007   253   253   033    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       261
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   040    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0012   099   099   000    Old_age   Always       -       461
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       260
191 G-Sense_Error_Rate      0x000a   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       63
193 Load_Cycle_Count        0x0012   093   093   000    Old_age   Always       -       71733
194 Temperature_Celsius     0x0002   203   203   000    Old_age   Always       -       27 (Lifetime Min/Max 18/52)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   253   000    Old_age   Always       -       0
223 Load_Retry_Count        0x000a   100   100   000    Old_age   Always       -       0

Vous obtenez une liste de valeurs définissant l'état de santé de votre disque, dont les colonnes sont les suivantes :

  • ID# : Le numéro du paramètre
  • ATTRIBUTE_NAME : La signification technique de ce paramètre
  • FLAG : Un flag hexa. laissez tomber ;-)
  • VALUE : La valeur actuelle de ce paramètre, ramené à une base 100 ou 200 le plus souvent. Il est généralement assez facile de savoir si l'on est sur base 100 ou 200. Plus la valeur est haute, plus c'est bon, plus la valeur est basse, plus c'est mauvais. Typiquement, 100 ou 200, c'est "parfait".
  • WORST : La valeur la plus basse jamais mesurée pour ce paramètre.
  • THRESH : Seuil d'alerte "défaillance imminente". Si la VALUE s'approche de ce seuil ou descend en-dessous, votre disque est à l'agonie.
  • TYPE : Peut être "Pre-fail" : Ce paramètre, s'il descend, est indicatif d'une défaillance imminente. Ou "Old_age" : Ce paramètre descend continuellement avec l'utilisation du disque, c'est un peu comme un compteur kilométrique qui n'indique pas que quelque chose va mal, mais que quelque chose a beaucoup servi...
  • UPDATED : "Always": Ce paramètre est mesuré en permanence. "Offline" : Ce paramètre n'est mesure QUE si l'on lance une "offline data collection".
  • WHEN_FAILED : Le nombre d'heures de vol qu'avait le disque la première fois que ce paramètre a foiré.
  • RAW_VALUE : La valeur brute mesurée (non ramenée à une base particulière). Elle peut être humainement compréhensible (heures de fonctionnement, température, compteur d'évènements...) ou incompréhensible (certaines valeurs de mesure des erreurs).

Et voilà.

Les seules valeurs auxquelles nous nous intéresserons ici sont :

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  9 Power_On_Hours          0x0012   099   099   000    Old_age   Always       -       461
193 Load_Cycle_Count        0x0012   093   093   000    Old_age   Always       -       71733

Ce disque dur a fonctionné 461 heures, et a subi 71733 cycles de parquage des têtes, soit en moyenne 155,6 par heure ou 2,6 par minute. Aïe ! On a un problème. Le disque risque de ne pas vivre vieux à ce rytme.

Relançons la commande "smartctl -A /dev/sda" plusieurs fois toutes les une ou deux minutes, et voyons si la "RAW VALUE" du "Load_Cycle_Count" augmente régulièrement. Il est probable que oui.

Essayons maintenant d'y remédier :

hdparm -B 254 /dev/sda

Relançons la commande encore plusieurs fois. La valeur n'augmente plus ? Très bien, nous avons résolu provisoirement le problème.

Si ça n'a pas marché, essayons :

hdparm -B 255 /dev/sda

Si ça ne marche toujours pas, c'est que le disque n'est pas influençable, et qu'il fait ça de lui-même un point c'est tout. On ne pourra alors rien y faire.

Si on a trouvé la solution, Il faut maintenant demander à notre gentil Linux de passer ce paramètre à chaque démarrage.

Sous Ubuntu, nous éditerons le fichier /etc/hdparm.conf, et à la fin de ce fichier, nous ajouterons le paragraphe :

/dev/sda {
	apm = 254
	keep_settings_over_reset = on
}

Sous Mandriva, par contre, nous copierons le fichier /etc/sysconfig/harddisks sous le nom /etc/sysconfig/harddisksda, puis, ceci fait, nous éditerons ce fichier et ajouterons à la fin la ligne magique :

EXTRA_PARAMS="-B254 -k1"

Puis nous n'aurons plus qu'à rebooter notre machine, et à vérifier comme indiqué plus haut que le problème n'existe plus.

Nous venons de sauver la vie de notre disque dur !

N.B.: Si vous avez l'habitude d'hiberner votre portable sur disque dur, il n'est pas certain qu'au réveil ce paramètre soit automatiquement réappliqué. Il vous faudra vérifier, le scripter au besoin, ou... vivre avec.

(Maintenant, je dis ça comme ça, rien ne me permet d'affirmer que les versions récentes de Winchoze n'ont pas le même problème, hein... Vous avez un portable sous Winchoze ? Tendez l'oreille...)


Une autre chose que nous pouvons faire pour réduire les écritures sur disque inutiles (et que je fais quasi-systématiquement sur tous types de machines) est de cesser d'enregistrer sur disque les timestamps d'accès (même en simple lecture) à tous les fichiers. Ces timestamps génèrent quantité d'écritures et de déplacements de têtes, et, le plus souvent, ne servent à rien.

C'est extrêmement facile. Il vous suffit d'éditer votre fichier /etc/fstab, et, pour tous les points de montage correspondant à votre disque dur, à chaque fois que vous voyez l'option "defaults", remplacez-la simplement par "noatime". Enregistrez, et voilà !