Le test de disques à la disto
Sommaire
- Problématique et besoins
- Panorama des possibilités
- Historique des solutions
- Diskeuz, la testeuz du futurz
- La suite
Problématique et besoins
A la disto, on récupère (souvent) du matériel usé, comme des tours, des laptops, des bizarreries, ou justement, des disques durs.
Ces disques, on veut pouvoir s'en servir pour :
- les donner, à des étudiant.es pour leurs backups par exemple
- nos propres machines, qui ont besoin de stockage (notamment, celles qu'on récupère et qui n'ont pas de disque(s) !)
- et beaucoup d'autres choses :)
Evidemment, pour les utiliser dans des situations à différents degrés de criticité, nous avons différents niveaux d'attentes vis-à-vis de nos disques. En règle générale, un disque dur utilisé pendant 10 ans 90% du temps peut probablement être inutilisable (voire risque de faire perdre des données !).
Il se trouve que tous les disques ne sont pas utilisés de la même façon (tout le monde peut comprendre qu'il y a une différence entre un disque de tour dans un collège, utilisé pour télécharger quelques images de temps en temps, et un disque de serveur très actif qui se fait réécrire plusieurs fois par mois), et que même ils n'ont pas tous la même ancienneté.
Alors, on a eu un besoin d'un protocole (d'abord) et d'une infrastructure (après) pour faciliter les tests et les rendre moins relous. Je détaillerai plus bas les outils qui permettent de tester des disques.
Panorama des possibilités
Mais au fait, comment on fait pour "tester" un disque (dur) ? Je vais utiliser (un peu) de vocabulaire des disques dans la suite de cette section (et dans celle-ci uniquement !). La page wikipedia sur les disques durs est très complète.
S.M.A.R.T - une première idée, sans garanties
Un disque-dur, c'est pas si bête, et son firmware (micrologiciel) peut communiquer à l'ordinateur sur lequel il est branché un grand nombre d'informations. Ce protocole, il s'appelle S.M.A.R.T.. Un disque-dur nous renseignera par exemple, le nombre d'erreurs de lecture/écriture (selon un format propriétaire), le nombre de secteurs réalloués (c'est-à-dire les secteurs détectés comme étant défaillants et qui ont été relocalisés sur l'un des secteurs libres de réserve du disque), ou bien même le nombre d'heures d'activité du disque.
Mieux encore, on peut demander au firmware de réaliser des tests, lui permettant de vérifier son état et de nous informer de façon plus précise dessus.
- Test short : dure environ 2 minutes, vérifie l'état mécanique du disque seulement : franchement, un disque dont le test short fail, c'est poubelle
- Test offline : quasi instantané, permet de mettre à jour les registres S.M.A.R.T., important à faire avant d'aller lire ces registres
- Test conveyance : assez rapide, de l'ordre de la dizaine de minutes, à effectuer après un déplacement des disques (ou à la réception).
- Test long : comme son nom l'indique, il est très long. Ce test permet de vérifier les secteurs du disque et met-à-jour de façon active les registres S.M.A.R.T. : c'est le plus représentatif !
Tout est super, non ? Ben non, le gros problème de S.M.A.R.T. c'est que les valeurs dans les registres obéissent à des logiques propriétaires. Prenons par exemple le registre RawReadErrorRate. Il s'agit d'un taux d'erreurs de lecture à l'échelle du disque.
Déjà, la phrase est floue : un taux d'accord, mais qu'elle est l'unité de temps ? Qu'est-ce qu'on compte, le nombre de secteurs en erreur, le nombre d'octets, le nombre d'erreurs ? En l'état, cette valeur est inutilisable, parce que chaque fabricant de disque peut choisir comment interpréter cette valeur. Il existe à priori une solution: le disque propose des valeurs dites normalisées, ainsi que des indicateurs, des thresholds à comparer à la valeur normalisée pour déterminer si le registre indique un comportement "pre-fail" ou non du disque ("pre-fail", c'est-à-dire que le disque va mourir dans les prochaines 24 heures, selon le contrôleur (et le fabricant)).
Encore une fois, il est difficile de comprendre comment interpréter chaque paramètre, même une fois normalisés, car ils ne sont pas tous aussi importants.
Malgré tout ça, S.M.A.R.T. reste tout de même un assez bon outil; vu que c'est le disque qui se charge de se tester, on n'a pas besoin d'avoir un gros débit entre le disque et la machine qui le teste: une baie USB suffit. En plus la durée des tests, mêmes longs, est généralement faible (quelques heures), ce qui permet de multiplier les tests et d'aller assez vite.
Exemple de sortie de smartctl
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.12.90+deb13.1-amd64] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Hitachi Deskstar 7K2000
Device Model: Hitachi HDS722020ALA330
Serial Number: JJJJJJJJJJJJJJ
LU WWN Device Id: 5 000cca 221da02e8
Firmware Version: JKAOA3EA
User Capacity: 2 000 398 934 016 bytes [2,00 TB]
Sector Size: 512 bytes logical/physical
Rotation Rate: 7200 rpm
Form Factor: 3.5 inches
Device is: In smartctl database 7.3/5528
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s
Local Time is: Thu Aug 13 16:10:16 2026 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART Status not supported: Incomplete response, ATA output registers missing
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.
General SMART Values:
Offline data collection status: (0x80) Offline data collection activity
was never started.
Auto Offline Data Collection: Enabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: (22330) 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: ( 1) minutes.
Extended self-test routine
recommended polling time: ( 372) minutes.
SCT capabilities: (0x003d) 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 0x000b 100 100 016 Pre-fail Always - 0
2 Throughput_Performance 0x0005 132 132 054 Pre-fail Offline - 106
3 Spin_Up_Time 0x0007 116 116 024 Pre-fail Always - 624 (Average 619)
4 Start_Stop_Count 0x0012 100 100 000 Old_age Always - 34
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 121 121 020 Pre-fail Offline - 35
9 Power_On_Hours 0x0012 089 089 000 Old_age Always - 77019
10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 34
192 Power-Off_Retract_Count 0x0032 099 099 000 Old_age Always - 2359
193 Load_Cycle_Count 0x0012 099 099 000 Old_age Always - 2359
194 Temperature_Celsius 0x0002 200 200 000 Old_age Always - 30 (Min/Max 15/61)
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 200 000 Old_age Always - 0
SMART Error Log Version: 0
No Errors Logged
SMART Self-test log structure revision number 1
No self-tests have been logged. [To run self-tests, use: smartctl -t]
SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
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.
The above only provides legacy SMART information - try 'smartctl -x' for more
Il existe pas mal de ressources sur l'Internet sur comment interpréter les résultats S.M.A.R.T., mais c'est compliqué de s'y retrouver. Quelques liens que je trouve pas mal:
- Une question sur StackExchange
- La page de documentation de S.M.A.R.T. de Arch Linux, pour configurer smartd
- La section de la page Wikipedia qui liste les registes (attributs) S.M.A.R.T. avec une description
- Un article de blog qui donne de très bonnes ressources
Badblocks - la solution qui marche à tous les coups
J'en ai rapidement parlé, l'important quand on teste un disque-dur, c'est l'état des secteurs. Badblocks est un outil qui permet de tester l'état du disque en balayant ses secteurs par blocks, c'est-à-dire un découpage logiciel du disque-dur. Un block, ça ne fait pas forcément la taille d'un secteur. Le fonctionnement de badblocks est très simple. Le logiciel va réaliser plusieurs passes, durant lesquelles il écrit un motif (le même, partout) dans chaque bloc. Une fois la première passe d'écriture terminée, badblocks réalise la première passe de lecture, Reading and comparing. L'algorithme est simple : si badblocks lit dans un bloc quelque chose d'autre que le motif qui a été écrit, on ajoute 1 aux nombres de "badblocks", de blocs défectueux. Et rebelotte pour toutes les passes !
C'est super et ça donne une réponse très claire. Si il y a plus de 0 badblocks, le disque est en mauvais état, point final. Le seul souci, c'est que contrairement à S.M.A.R.T., le test se passe cette fois sur le l'ordinateur, et sa vitesse est déterminée par la vitesse de la connexion au disque et celle du disque.
En pratique, badblocks est très, très, très lent sur une baie de disques USB : il faut utiliser un serveur fait pour traiter un grand nombre de disques en parallèle pour que le test soit efficace.
Exemple de sortie de badblocks
Checking for bad blocks in read-write mode
From block 0 to 61047329
Testing with pattern 0xaa: done
Reading and comparing: 25405921done, 7:53:35 elapsed. (0/0/0 errors)
25405949done, 7:53:38 elapsed. (1/0/0 errors)
25406003done, 7:54:04 elapsed. (2/0/0 errors)
25406172done, 7:54:07 elapsed. (3/0/0 errors)
25406227done, 7:54:09 elapsed. (4/0/0 errors)
25450523done, 7:55:01 elapsed. (5/0/0 errors)
25450550done, 7:55:03 elapsed. (6/0/0 errors)
25450577done, 7:55:06 elapsed. (7/0/0 errors)
25450718done, 7:55:10 elapsed. (8/0/0 errors)
25450746done, 7:55:13 elapsed. (9/0/0 errors)
25450773done, 7:55:15 elapsed. (10/0/0 errors)
25450800done, 7:55:18 elapsed. (11/0/0 errors)
25450828done, 7:55:21 elapsed. (12/0/0 errors)
25450914done, 7:55:24 elapsed. (13/0/0 errors)
25450942done, 7:55:27 elapsed. (14/0/0 errors)
25450969done, 7:55:30 elapsed. (15/0/0 errors)
done
Testing with pattern 0x55: done
Reading and comparing: done
Testing with pattern 0xff: done
Reading and comparing: done
Testing with pattern 0x00: done
Reading and comparing: done
Pass completed, 15 bad blocks found. (15/0/0 errors)
Note sur les SSD
Un SSD, c'est vraiment
différent d'un disque-dur, et ça se teste pas pareil. En général, les
infos S.M.A.R.T. ont tout ce qu'il faut (pourcentage d'utilisation du
SSD par exemple), et il ne faut vraiment pas utiliser badblocks dessus
: ça l'use beaucoup ! Comme on en récupère pas beaucoup, cet outil ne
s'en occupe pas du tout (et cet article de blog non plus)
Historique des solutions
Historiquement, on a utilisé un petit PC avec une baie de disques
attachée en USB et réalisé des tests S.M.A.R.T.. Ces tests, on les
suivait à l'aide d'un outil web (pour avoir une interface graphique plus
facile à expliquer que la sortie de smartctl dans un
terminal) nommé Scrutiny
un peu modifié.
Ce système fonctionnait bien, néanmoins Scrutiny est vraiment très peu adapté à notre usage, en plus du caractère non-standard des registres S.M.A.R.T.
Diskeuz, la testeuz du futurz
Contexte
Cet été on a récupéré beaucoup de disques, tellement qu'il fallait s'y mettre sérieusement. En plus, on a finalement décidé que S.M.A.R.T. c'était pas suffisant pour nous, parce qu'on voulait des garanties fortes sur l'état des disques qu'on testait.
On a sorti un gros serveur, avec plein de baies, installé Debian et un logiciel trouvé sur GitHub nommé bht. C'est un simple script qui permet de lancer des tests badblocks, de les suivre, et de collecter des informations S.M.A.R.T. avant et après le test.
Protocole
Comme je l'ai dit dans l'introduction, trouver un logiciel pour les tests c'était le plus facile, la vraie difficultée c'est de trouver un protocole de tests. Notre fonctionnement est le suivant :
- Réception du disque Grâce à notre imprimante à
stickers, on pose sur le disque un sticker avec les informations
suivantes
- Sa capacité
- Sa vitesse de rotation
- Trois mots suffisamment espacés pour pouvoir être entourés : PASS, BADBLOCKS, FAIL
- Le nom du lot (batch) dont le disque fait partie
- Démarrage d'un test On récupère dans la caisse à disques à tester, assez de disques pour remplir la baie de tests, puis on les rentre dans la machine. On lance le test (avec une certaine commande).
- L'attente… Les tests badblocks, c'est long. Sur des disques de 2To, le test prenait jusqu'à 72h à se compléter par disque, avec 12 disques en parallèle
- Déchargement Notre outil nous fournit un fichier
contenant, pour chaque disque, deux informations :
- Son état calculé pour Badblocks : PASS,
BADBLOCKS, ou FAIL
- Une grande partie du travail était de déterminer quand un disque tombe dans chaque catégorie
- 0 badblocks, c'est PASS
- Plus de 0, mais moins de 10, c'est BADBLOCKS
- 10 et au delà : c'est FAIL
- Son état calculé pour smartctl : PASS ou
FAIL
- Là aussi, déterminer les valeurs pivots qui rendent un disque défectueux n'était pas facile, voici ce qui fonctionne pour nous:
- Valeur (normalisée) du RawReadErrorRate inférieure à son threshold : FAIL
- Valeur (normalisée) du MultiZoneErrorRate inférieure à son threshold : FAIL
- Valeur (raw) de OfflineUncorrectable supérieure à 0 : FAIL
- Son état calculé pour Badblocks : PASS,
BADBLOCKS, ou FAIL
- On continue !
Ce protocole est assez simple, mais nous a vraiment beaucoup aidé.es cet été. En plus, définir à l'avance trois catégories d'états (PASS, BADBLOCKS, FAIL ) nous force à choisir une fois le disque testé et les informations S.M.A.R.T. et Badblocks recueillie : pas de place pour mettre un petit mot d'hésitation ou autre.
Pourquoi l'état BADBLOCKS ?
L'état "BADBLOCKS" permet de conserver quelques
disques qui n'ont certes pas de bonnes garanties de santé, mais qui
pourraient toujours être utiles. On ne s'en sert pas uniquement pour
les disques pour lesquels Badblocks renvoie autre chose que 0.
L'outil !
Notre nouvel outil, c'est une configuration NixOs qui s'appelle Diskeuz.
Pourquoi NixOs ?
On a pas toujours une baie de
disque disponible pour tester des disques, du coup, c'est plutôt
pratique de pouvoir installer une testeuse de disque en quelques
minutes sur une machine qu'on a sous la main !
Cette configuration contient pas mal de choses :
- Le programme bht que nous avons modifié
- Par l'ajout de quelques informations S.M.A.R.T.
- Par la suppression du système de mails
- Par l'ajout de quelques commandes pour simplifier son utilisation
- Par l'ajout du calcul automatique de l'état du disque selon S.M.A.R.T(ctl) ou Badblocks
- Un système d'arrêt automatique du système une fois les tests finis, et qui dépose les fichiers contenant les informations de chaque disque sur notre serveur DUFS local
- Une documentation intégrée pour pouvoir l'utiliser rapidement
La suite
Parce qu'on fait toujours les choses sur du matériel un peu shlag,
Diskeuz est loin d'être un produit fini. Déjà, le parti pris de se
concentrer sur badblocks, c'est cool quand on a une grande
baie de disques, mais en temps normal on doit se contenter de la petite
baie USB. Dans ce cas, adapter Diskeuz pour poivoir utiliser uniquement
S.M.A.R.T., ce serait mieux. En plus, bht ne lance pas
de tests S.M.A.R.T. sur les disques (dans sa forme actuelle), donc les
attributs S.M.A.R.T. auxquels nous avons accès ont une pertinence
limitée. Avoir un outil capable de très bien gérer S.M.A.R.T.,
ce serait donc une première piste d'amélioration.
Ensuite, Diskeuz est loin d'être parfaite; notre version de
bht contient des bugs parfois difficiles à diagnostiquer. Au
delà de la question des bugs, même après avoir fait tout notre possible
pour rendre l'outil facile à utiliser, ça reste compliqué de se passer de
la ligne de commande. Une autre piste d'amélioration serait d'ajouter
des règles udev pour
démarrer les tests automatiquement lorsque les disques sont insérés dans
la baie, les autres opérations étant déjà automatisées.
Comme j'en ai aussi déjà parlé, on ne s'est pas du tout intéressé.es aux disques SSD pour l'instant. C'est aussi un manque à combler, parce qu'on peut être emmené.es à en récupérer et pour l'instant on n'a aucun savoir-faire sur ce type de média. C'est moins prioritaire, certes, mais être capables de tester tous types de disques rapidement et surtout en étant confiant.es sur le résultat, c'est vraiment une force pour nous.
Et puis, il reste aussi la question de la validation de notre processus. Pour l'instant, nous n'avons pas pu avoir de retours sur les disques ayant passés nos tests. Peut-être qu'on est trop "sympas" sur les critères, et qu'il faudrait en jeter plus ? Ou au contraire, on a tellement peur d'un mauvais disque qu'on est trop conservatifs sur les résultats (ce qui est moins un problème lorsqu'on récupère beaucoup de disques, évidemment).
L'aventure Diskeuz est bien sûr ouverte à tous.tes :) Que ce soit pour rentrer des disques la baie, aider au code, ou faire des retours sur les disques, toute aide est bienvenue !
PS: On fait quoi des disques "FAIL" ?
Quand on est certain.es qu'un disque est mort, on peut encore en faire des trucs. Par exemple à la disto, on fabrique des patates à facettes :)