Licence : this bafouille is provided AS IS, no garantee it'll work…
La mésaventure m'est arrivée la semaine dernière, j'ai heureusement pu diagnostiquer et traiter le disque malade dans les temps. Et un ami a eu le même souci ce week-end, hélas un peu tard et bien évidemment, pas au “bon moment”, mais on a pu récupérer les données.

Ce billet est écrit pour les systèmes Unix et compatibles, donc Linux *BSD et Mac OS X y trouveront des informations utiles, et concerne les disques utilisés directement en SLED, les HDD configurés en mode RAID ont des stratégies de récupération très différentes. Les Microsofteux qui veulent essayer (les fous, ils ont sûrement des cliquodrômes très bien faits) devront le faire avec une clé USB linux live. Bonne chance à eux !

Ce qu'il faut savoir

Un disque dur (HDD) est livré avec une capacité brute. Le microcontrôleur du disque se réserve une marge de sécurité (entre 5 et 10% de la capacité annoncée) qui n'est pas accessible au système d'exploitation de votre ordinateur (OS). C'est pour cette raison que vous n'aurez jamais 100% de la capacité de votre HDD, même si cette réserve n'est pas comptée dans le volume vendu.
Si le contrôleur de votre HDD rencontre des secteur défectueux dans la zone publique, il va créer des alias de ces secteurs vers son espace de secours. Il n'est pas rare qu'un disque aie des défauts même neuf, et ceci d'autant plus que nous leur demandons encore plus de densité d'information que jamais. Il fut même une époque où les secteurs défectueux étaient indiqués sur une étiquette collée au boîtier et on devait entrer cette liste manuellement quand on partitionait un disque.


Un disque dur haute-performance de 1990 avec sa liste de secteurs défectueux identifiés à l'usine. Source : Kuhmann.com

À notre époque moderne d'un quotidien de progrès, c'est le microcontrôleur du HDD qui s'en occupe tout seul. Néanmoins, si l'usage de l'espace de secours commence à monter, c'est un signe inquiétant qui montre une dégradation de la surface du disque. Afin d'être informé d'éventuelles défaillances, il existe un standard de dialogue avec le contrôleur du disque appelé S.M.A.R.T. (pour Self-Monitoring, Analysis and Reporting Technology). Ce service donne des informations complémentaires, en générales non remontées à votre OS. Ah oui, ce service est géré par le disque dur, il est totalement indépendant de votre OS.

Dura lex sed Murphy's law

Oui, il est rude, donc j'explique le jeu de mot : la marque de verre Duralex™ vient de la maxime latine dura lex sed lex qui veut dire la loi est dure, mais c'est la loi. Et la Loi de Murphy est celle dite De l'Emmerdement Maximum, ce n'est pas pour rien.

Un défaut n'est jamais souhaitable, mais le pire incident possible arrivera toujours au moment où il ne fallait vraiment pas perdre ses données ou du temps. Choc, usure, craquelure, pelage, n'oubliez pas que les têtes de lecture/enregistrement survolent à une distance microscopique les plateaux qui tournent à plus de 5000 tours par minute ; le moindre choc ou impureté peut écailler la surface magnétique. Nos HDD sont les avant-derniers éléments internes mécaniques de nos ordinateurs (avec les ventilos).

Il vaut mieux prévenir que guérir. Pensez toujours à dupliquer régulièrement vos données “sensibles”, sur un NAS ou sur un service cloud d'archivage (en chiffrant vos envois). Cela s'appelle avoir une stratégie solide de backup et si on applique pas cette discipline suffisamment tôt, c'est qu'on y songera que trop tard.

Ensuite, privilégier une séparation entre votre système et votre répertoire personnel. Sur Linux, c'est facile : / et /home ont toujours été les trois premières partitions créées (la partition swap n'est pas visible dans le filesystem), ce qui permet de réparer l'OS sans impacter les données utilisateur. Perdre la partition de l'OS n'est pas grave. Perdre la partition de vos données personnelles est irrémédiable. À noter que cette séparation des responsabilités était difficilement faisable sous Windows jusqu'à Seven, maintenant, vous n'avez aucune excuse.

Si cela arrive, d'abord…

Reconnaître les signes

Pour moi, cela a commencé par un nombre de plantages anormaux. Depuis trois jours, des programmes crashaient aléatoirement, mais toujours lors d'une opération disque : en surfant avec des navigateurs ou quand j'enregistrais des documents avec Libre Office. Lors de la récupération de ce dernier, il se montrait incapable de me donner la version la plus récente du document de travail.

Il n'y avait donc que deux possibilités : un problème de RAM ou un problème de HDD. J'ai écarté la première avec memtest86+, le test de mémoire proposé dans grub au démarrage de votre PC.

N'ayant plus le 0899 de la Pythie de Delphes (qui est notoirement imprécise), il va falloir plonger ses mains dans le cambouis.
Pour confirmer le diagnostic sur le HDD, vous aurez besoin d'un terminal (eh...) en mode root (ben oui) et de smartctl. Ce petit exécutable est présent dans les systèmes debian/apt dans le paquet smartmontools. Il existe d'excellents guides complets sur les outils S.M.A.R.T., sachant que pas mal d'infos très utiles sont données lors de son usage et via l'option -h.
Pour commencer, on va demander au microcontrôleur s'il est là, s'il peut dialoguer avec nous via SMART et quelles informations il peut nous donner sur ses disques :

# smartctl -a /dev/<device> 

<device> est la notation (la plupart du temps) en trois lettres qui fait référence à votre disque, elle varie suivant les systèmes et les technologies. Si vous ne savez pas, la commande mount sans arguments vous donnera les points d'accès. Par exemple :

/dev/sda1 on / type ext4 (rw,errors=remount-ro)

Indique que votre racine est sur la première partition du disque sda.

Examinons les informations retournées par smartctl -a (les lignes peuvent changer selon les modèles) :

[…]
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   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   142   142   021    Pre-fail  Always       -       3858
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       23
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       104
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       23
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       7
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       15
194 Temperature_Celsius     0x0022   116   110   000    Old_age   Always       -       27
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   100   253   000    Old_age   Offline      -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]
[…]

Vous noterez que les indications sur les valeurs pré et post-critiques sont renseignées par le fabricant et ses valeurs limites sont donc réputées correctes. Mais la présence de deux/trois pre-fail ne doit pas immédiatement vous effrayer. Comme je l'ai écrit plus haut (normalement), les incidents les plus fréquents concernent les opérations en écriture, on va demander au disque de s'observer pendant un certain temps et de noter ses comportements anormaux.

# smartctl -t long /dev/<device>
[…]
=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 7 minutes for test to complete.
Test will complete after Tue Mar  4 11:12:18 2014

Use smartctl -X to abort test.

Je viens de lancer le monitoring vers 7h du matin, le contrôleur aura suffisamment de données pour me donner une information statistiquement fiable après 11h12.
Ces données de monitoring sont enregistrées dans la RAM du contrôleur qui sert principalement à son buffer, pas sur le disque lui-même ; vous n'aurez aucun risque de corruption supplémentaire, tout au plus une réduction très marginale des performances lecture/écriture de votre disque dur, vous pouvez donc copier des fichiers ou travailler pendant les tests SMART. Pour votre info, cette opération est régulièrement faite dans les datacenters sur vos serveurs. Autre avantage : cette opération est résiliante aux resets. Vous pouvez même rebooter sur un autre système d'exploitation durant la période d'observation, ce qui permettra de vérifier ce qui se passe sur d'autres partitions du disque. La seule chose est de ne pas éteindre la machine.

À la fin de la période de monitoring, nous pouvons demander une synthèse sur la santé du disque :

# smartctl -H /dev/<device>
[…]
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Si à la place de PASSED, vous lisez PRE-FAIL,

vous pouvez paniquer.

Quand ton disque dur donne des signes de mollesse

Et quitte à bien faire, le disque dur qui commence à accuser son âge (7 ans) est celui où tu as à la fois ton système / et ton /home.


Cierges et ex-voto à l'Église de Fourvière pour les admins lyonnais. Crédit photo Wikipédia.

D'abord, secouer en marmonnant le grigri d'un marabout très puissant sur les cendres d'un cartouchier SyQuest tout copier sur un NAS ou un service distant de backup (comme Hubic). Une fois fini, éteindre le pc. Ensuite foncer pour acheter un HDD neuf d'une capacité au moins équivalente.

Sur votre carte-mère, brancher les deux disques en même temps, et créer sur le nouveau les mêmes partitions. Je vous recommande de le faire avec un outil de partition graphique, la ligne de commande est assez rude. Notez la référence de votre nouveau HDD, et pour chaque nouvelle partition, la capacité et le numéro de partition de /dev/<device>. Seul le numéro de partition est important, puisque la lettre du disque changera quand vous retirerez l'ancien. Si vous venez de créer la partition /dev/sdb4, comme votre disque défaillant est sûrement le /dev/sda, il est probable qu'à la fin de l'opération, cette partition soit logiquement nommée /dev/sda4.
N'oubliez pas que vous ne pouvez avoir deux fois le même point d'entrée, vous les renommerez plus tard dans /etc/fstab quand vous aurez retiré l'ancien disque.

Une fois les nouvelles partitions montées, commencez à copier de l'un vers l'autre à l'ancienne avec mkdir/cp. Parait qu'on peut le faire avec rsync -avuzb, perso, j'utilise Midnight Commander sans aucune honte, et hop.
Il vaut mieux copier fichier par fichier plutôt que la structure physique de vos partitions ; n'utilisez surtout pas dd : vous risqueriez d'avoir des effets très indésirables si les capacités ou les systèmes de fichiers sont différents ou de corrompre prématurément votre disque tout neuf !

Si vous avez apache et/ou une base de données importantes, il faut sauver /var, voire même idéalement dupliquer ce répertoire dans une partition à part comme pour /home. Éventuellement, copiez le répertoire /etc qui contient des paramétrages de services (apache, base de données, cron,…).

Les ruses de sioux pour sauver sa racine OS

Ne vous concentrez pas trop sur ce chapitre, si vous vous plantez, vous pourrez toujours repartir de zéro et vous perdrez juste du temps à réinstaller les logiciels.

Pour votre partition système /, et si vous voulez tenter un clonage sans réinstaller tout votre OS, les répertoires à copier en priorité sont /bin, /boot, /etc, /lib*, /opt, /root, /sbin, /usr et /var. Inutile de récupérer /tmp, et surtout ne tentez jamais de copier un des répertoires /dev, /proc, /run ou /sys : ce ne sont pas des fichiers standards mais des points de montage matériels ou des points d'accès au kernel. Ignorez les répertoires des points de montages sur l'ancien HDD (ainsi que ses /cdrom, /mnt et /media). La ban-list pour les Mac est susceptible d'être différente.
N'oubliez pas de recréer sur le nouveau HDD les répertoires qui vont servir de pont de montage aux autres partitions.

Une fois les données copiées sur le nouveau HDD, arrêtez le pc, et retirez le HDD malade. Au cas où ça foire, réservez-le sur le côté pour une cuisson ultérieure.

Copier les répertoires vers le nouveau disque et noter les nouveaux identifiants /dev/<device> ne suffira pas. Effectivement, en remplaçant le disque racine, il y a toutes les chances que vous perdrez le secteur de boot, Grub. Ton meilleur outil pour restaurer proprement grub2 est boot-repair, qu'il faudra invoquer depuis une clé linux live. Il y aura de la ligne de commande à taper avant d'invoquer le programme.
Une fois lancé, boot-repair y va bourrin et fait le tour de chaque partition pour voir s'il y trouve un répertoire /root (il m'a même retrouvé une vieille structure Mandrika d'il y a 12 ans), et il va installer grub sur chaque partition possible. Le résultat sera miraculeux : grub sera proprement ré-installé, avec une reconstruction des liens virtuels à la racine vers initrd.img et vmlinuz qui permettent de démarrer votre OS.

HE IS ALIIIIIIIIVE !

Source image : DoctorMarco.com

Une fois l'OS démarré, vous remarquerez que les autres partitions dont /home ne sont plus montées au démarrage et tout ne marche pas encore totalement. L'étape suivante sera d'éditer /etc/fstab avec les UUID de vos nouvelles partitions pour qu'elles soient montées au démarrage du système. Comme indiqué dans les commentaires du fstab, vous connaîtrez les UUID des nouvelles partitions en lançant blkid. N'oubliez pas que les noms logiques des partitions sdXY auront changé puisque la lettre X varie suivant les disques branchés, la commande mount vous donnera le nouveau nom logique de /.

Enfin, il faut redonner à /tmp les bons droits, puisque le bit sticky a été perdu :

# chmod -R a+rwxt /tmp 

Redémarrez et…

Normalement

Ça doit être bon.

Normalement…


Source icono pour le disque fracturé : DarthMac.com