
smartctl : le contenu d’un SMART Log d’un disque ayant enregistré des erreurs
La semaine dernière, mon serveur a rencontré un souci de disque. Malheureusement, ce serveur ne dispose pas de RAID et il fallait récupérer les données de ce serveur.
Une fois les erreurs détectées sur un disque par smartd du package smartmontools il ne faut en général pas trop attendre avant de remplacer le disque, surtout sans RAID : le risque de perdre des données augmentant avec le temps qui passe !
Quand on dispose d’assez d’espace disque pour cloner le disque en fin de vie vers un autre serveur, il existe des méthodes assez simples à mettre en œuvre pour faire une copie du disque « bit à bit ». Afin d’avoir une durée d’indisponibilité la plus courte possible, il est préférable que les deux serveurs (celui qui va servir de stockage et celui dont les données doivent être récupérées) disposent d’une connectivité assez conséquente. En effet, le débit maximal théorique de transfert sera de 12,5 Mo/s avec une connectivité de 100 Mbps, et de 125 Mo/s pour du 1 Gbps. Avec les disques de quelques centaines de Gigaoctets, le temps de transfert durera de quelques heures à quelques dizaines d’heures.
Dans la suite de cet article, le serveur disposant d’un disque en fin de vie sera appelé « production », et le serveur recevant la copie des données sera appelé « stockage ».
Copie des données du serveur « production » vers « stockage »
La première étape pour faire une copie de disque « bit à bit » est de placer le serveur « production » sur un système non local (type système rescue, ou live CD). En effet, effectuer une copie « bit à bit » d’un disque où un système risque d’écrire est un bon moyen de disposer d’une copie inutilisable (où comment copier une table de fichiers qui ne corresponds pas aux données du disque).
Si l’accès aux serveurs s’effectue par SSH, il est plus prudent de lancer les commandes suivantes dans un « screen » pour que le transfert ne s’arrête pas en cas de perte de l’accès SSH.
Sur le serveur « stockage », il va falloir se préparer à recevoir les données du serveur « production » :
stockage:~/# nc -l 12345 | dd of=/chemin/vers/image-disque-dur.img.gz
La commande nc va écouter en TCP sur le port 12345, et passer l’ensemble des données reçues à la commande dd qui va les écrire dans le fichier /chemin/vers/image-disque-dur.img.gz
Sur le serveur « production », on va commencer à envoyer les données vers le serveur « stockage » :
production:~/# dd if=/dev/sda conv=noerror,sync | gzip -9 | nc stockage 12345
La commande dd va permettre de lire le disque, en ignorant les éventuelles erreurs de lectures (noerror), et en remplaçant les erreurs de lectures par la valeur NUL(sync). La commande gzip va permettre de compresser les données avant le transfert par le réseau ; le facteur limitant étant souvent le réseau, il est possible de réduire la durée de transfert en compressant les données avant de les envoyer, si la puissance du processeur le permet. Le paramètre « -9 » peut être remplacé par une valeur entre « -1 » et « -9 », plus la valeur étant élevée, plus le taux de compression sera important, mais au détriment de la vitesse de compression. La commande nc va quant à elle transférer les données par le réseau sur le serveur « stockage » sur le port TCP 12345.
Après quelques heures de patience, les deux commandes se termineront, il faut l’espérer, avec une sauvegarde du disque complète disponible sur un espace de stockage fiable !
Restauration des données du serveur « stockage » vers « production »
Une fois les données sauvegardées et bien évidemment, le disque remplacé, il restera à restaurer les données sauvegardées sur le nouveau disque. De la même manière, la restauration sur le serveur « production » ne pourra s’effectuer que sur un système non local.
Si l’accès aux serveurs s’effectue par SSH, il est plus prudent de lancer les commandes suivantes dans un « screen » pour que le transfert ne s’arrête pas en cas de perte de l’accès SSH.
Sur le serveur « production », il va falloir se préparer à recevoir les données du serveur « stockage » :
production:~/# nc -l 12345 | gunzip | dd of=/dev/sda
La commande nc va écouter en TCP sur le port 12345, et passer l’ensemble des données reçues à la commande gunzip pour les décompresser et les envoyer à dd qui va les écrire sur le disque /dev/sda
Sur le serveur « stockage », il faut envoyer les données vers le serveur « production » :
stockage:~/# dd if=/chemin/vers/image-disque-dur.img.gz | nc production 12345
La commande dd va permettre de lire l’image du disque et l’envoyer à la commande nc qui va quant à elle transférer les données par le réseau sur le serveur stockage sur le port TCP 12345. Comme le facteur limitant pour la restauration reste le réseau, autant envoyer la version compressée par le réseau. La décompression d’un flux gzip est plus rapide que la compression, autant ne pas s’en priver.
Après quelques heures, la restauration devrait être terminée. Une fois la restauration des données effectuée, il est prudent d’effectuer une vérification des systèmes de fichiers avant d’effectuer toute autre opération. Si tout va bien de ce côté, le serveur devrait pouvoir être redémarré sur le système local ! En cas d’erreur de lecture irrécupérable, il est probable qu’une partie de vos fichiers ne soient pas lisible, ou incomplet.
Conclusion
Si le disque original n’a trop souffert avant d’avoir été sauvegardé, le serveur pourra redémarrer sans encombre. Dans le cas contraire, il est possible de récupérer une partie des données, avant de réinstaller, si le système ne démarre plus, voire dans le pire des cas, de ne rien pouvoir récupérer.
Cette méthode, bien que fonctionnelle, peut poser quelques soucis. Le transfert des données s’effectue en clair, ce qui au niveau confidentialité reste assez limite. Il est possible d’utiliser SSH pour chiffrer les échanges, au détriment de la vitesse. Pendant la durée du transfert, aucune indication ne sera disponible concernant l’avancement du transfert ; il est possible d’envoyer un signal de type USR1 à dd pour connaitre l’état d’avancement. La commande pv peut aussi être intercalée à n’importe quel endroit du tube pour connaitre l’état d’avancement.
Pour aller plus loin
Il existe bien sûr d’autres méthodes pour arriver au même résultat. Cette méthode à l’avantage de ne pas trop stresser un disque en fin de vie, puisque les accès sont séquentiels et non aléatoire. Dans d’autres circonstances, il aurait été possible d’utiliser la commande rsync pour synchroniser les données sur deux serveurs différents, ou alors de créer une archive Tar à l’aide de la commande tar et la transférer directement par le réseau à l’aide de nc ou ssh.