J'ai chez moi deux Raspberry Pi que j'utilise pour de la « production. » Le premier (un Raspberry Pi 1 Model B) me sert à diffuser ma collection musicale sur la chaîne audio de mon salon ; le deuxième (un Raspberry Pi 2 Model B) me sert de lecteur de flux de syndication. Tout deux sont donc actifs 24 heures sur 24 et font pas mal d'IO.
Tout va pour le mieux dans le meilleur des mondes, au détail près que chacun de ces deux systèmes corrompt environ une fois par année sa carte SD et arrête alors de fonctionner. Ce mercredi, c'est le Pi 2 qui a crashé, et bien crashé : je n'arrive même plus à formatter la carte SD ! Heureusement, j'ai toujours moyen d'accéder aux données et peux les sauvegarder (particulièrement la base de données de mon lecteur de flux de syndication).
Du coup, le jeudi s'est passé à acheter du nouveau matériel et sa mise en place : une nouvelle carte SD et une clef USB sur laquelle j'ai décidé de déplacer le système de fichiers root afin de n'avoir plus d'IO sur la carte SD.[] Et vient le moment de récupération de la base de données, et le fun débute...
Un peu de contexte :
- j'utilise PostgreSQL come moteur de base de données sur le Pi ;
- lors des crashs précédents, il me suffisait de récupérer les fichiers de la base dans
/var/lib/postgresql/9.1/main
et de les copier au même endroit sur le nouveau système et tout roule ;
- avant le crash, le Pi tournait avec la version wheezy de Raspbian, qui fournit PostgreSQL en version 9.1 ;
- après le crash, le Pi tourne maintenant avec la version jessie de Raspbian, qui fournit PostgreSQL en version 9.4.
Et c'est à cause de ce changement de version de la base de données que les ennuis ont débuté. En effet, PostgreSQL n'a pas de processus intégré de migration d'une version majeur à une autre... Au moment où je découvre cette « fonctionnalité, » la soirée du jeudi s'est déjà transformée en matinée du vendredi et je décide (sagement) d'arrêter là et d'aller me coucher.
Vendredi après-midi : but, récupérer cette base de données ! Je me dis que si j'arrive à remonter quelque part un PostgreSQL 9.1, je devrais pouvoir relire mes données, les exporter, et les réimporter sur le nouveau système... Facile, non ? Mais le trajet sera semé d'embûches :
- première idée : installer la version 9.1 sur le nouveau Pi
- impossible, Raspbian Jessie ne propose pas cette version de PostgreSQL
- deuxième idée : installer un Ubuntu 12.04 (version LTS qui contient encore la version 9.1 de PostgreSQL) et recharger la base de données dedans
- au démarrage, la base de données me dit que les données sont corrompues
- un petit tour avec l'utilitaire de réparation de données pour espérer réparer les données
- mais là, une nouvelle erreur arrive avec une histoire de différence d'architecture
Conclusion de ces quelques heures d'essais et de recherches Google : si je veux récupérer ces données, il faut vraiment que je le fasse sur un Pi. Mais je n'ai pas envie de recommencer la configuration à zéro sur une de mes machines et faire un downgrade vers wheezy.[] D'autant plus que j'ai de la peine à trouver une image facilement installable de wheezy sur une carte SD.[]
Nouvelle idée : et si j'arrivais à monter une machine virtuelle qui émule un Pi ? Après quelques recherches, je finis par trouver un article chez PCSteps qui me permet d'installer QEMU et d'avoir un Pi avec Raspbian wheezy émulé sur mon PC. Copie des données dans la machine virtuelle, démarrage de PostgreSQL 9.1... (oui, c'est lent avec cette émulation, ça prend donc du temps...) Joie, bonheur, contentement : j'arrive à réaccéder à mes données ! \o/
Dump de la base de données en version 9.1 dans la machine virtuelle, rechargement en version 9.4 sur le Pi... et tout fonctionne à nouveau à merveille ! :-)