Prolonger la durée de vie de jeedom !

Jeedom sur raspberry pi
Geek jusqu'au bout des ongles, vous avez automatisé votre maison de la cave au grenier avec l'excellent Jeedom ?
Ce n'est pas moi qui vous jetterai la pierre, j'adore ce logiciel. Cependant, installé sur raspberry il doit faire face à un défaut majeur: la fragilité du support de stockage microSD !



En effet, ces cartes ont à leur sortie d'usine une durée de vie déterminée par le nombre de cycles de lecture et d'écriture. Elles sont optimisées pour éviter d'écrire trop souvent au même endroit et le nombre de cycles est relativement important donc cela convient pour la plupart des utilisations. Jeedom a malheureusement un inconvénient majeur: il historise tous les changements d'état de vos capteurs, physiques ou virtuels, et effectue des écritures permanentes risquant de finir par faire crasher la carte. Vous avez passé suffisamment de temps à configurer votre domotique pour savoir que ce ne serait pas la meilleure nouvelle de la journée.

Pour pallier à ce problème il existe plusieurs solutions :

  • La première que j'ai tenté a été d'utiliser un boot de l'OS via le réseau (c'est nativement possible avec le Raspberry Pi 3b+ que j'utilise). Après plusieurs semaines de tests, il s'avère que cette solution, lourde pour le réseau est de plus relativement instable. On assiste régulièrement à des plantages au reboot ou en fonctionnement.
  • La seconde solution est d'utiliser un disque dur externe. Cette solution a été rapidement écartée pour une question de place. Que ce soit via un boîtier comme le PiDesktop ou via un disque USB simple, l'encombrement n'est pas idéal
  • En troisième solution, on a la fameuse clef usb tant prônée par de nombreux sites sur ce sujet. A un petit détail près, ça ne sert à rien de remplacer une carte microSD par une clef USB, les technologies sont de même nature, ça reste de la mémoire flash avec un nombre de cycles limités !
  • Enfin, et cette liste ne se veut pas exhaustive, il reste la solution que je vais vous exposer ici.
Inutile de préciser qu'en plus de tout ça, il est indispensable de mettre en place une sauvegarde régulière mais Jeedom fait cela nativement très bien (n'oubliez pas de configurer l'exportation de vos sauvegardes vers votre NAS car sinon vous les perdrez en même temps que votre carte SD).

Vive l'Hybride !

Vous allez rapidement comprendre pouquoi. La carte microSD présente l'atout indéniable d'être totalement intégrable dans l'espace physique de n'importe quel boîtier pour Raspberry donc autant tirer parti de cette caractéristique. De plus, les bons modèles offrent un temps de boot très court.
Votre NAS quant à lui est fait pour supporter des cycles de lecture/écriture pendant des années et il est allumé 24/24.

La solution que j'ai adopté a été de repérer les dossiers qui généraient le plus grand nombre d'écritures et de les stocker sur le NAS via un partage NFS. Cela permet de conserver la carte mémoire pour le système tout en ne l'usant pas prématurément avec des écritures constantes.

Configuration

Les dossiers posant problème sont au nombre de 3 :
  • /var/log dans lequel le système écrit tous les logs du système. Je mets de coté ce dossier pour le moment car nous le traiterons différemment.
  • /var/lib/mysql, la base de données de Jeedom
  • /var/www/html, qui contient le code php de Jeedom mais également des logs de certains plugins, des fichiers de cache, etc ...
La procédure est simple, connectez vous via ssh et commencez par arrêter les services apache2 et mysql sur votre Raspberry contenant Jeedom :

sudo service apache2 stop ; sudo service mysql stop

Une fois que c'est fait montez un dossier NFS, que vous aurez préalablement déclaré sur votre NAS, dans le chemin /mnt

sudo mount -t nfs xxx.xxx.xxx.xxx:/volume1/JeedomNFSBDD /mnt

Remplacez xxx.xxx.xxx.xxx par l'IP de votre NAS et /volume1/JeedomNFSBDD par le chemin du dossier sur votre NAS.

Ensuite, copiez le contenu de votre dossier /var/lib/mysql dans /mnt en préservant les droits.

sudo cp -a /var/lib/mysql/* /mnt/

Une fois que c'est fait, il faut démonter le dossier /mnt.

sudo umount /mnt

Créez une entrée dans le fichier /etc/fstab pour que le montage se fasse automatiquement au reboot de votre raspberry :

xxx.xxx.xxx.xxx:/volume1/JeedomNFSBDD  /var/lib/mysql  nfs  defaults  0  0

Et pour terminer, nous allons monter le dossier /var/lib/mysql et remettre les droits d'origine sur ce dernier :

sudo mount /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
sudo chmod u=rwx,g=rx,o=rx /var/lib/mysql


Vous pouvez redémarrer mysql.

sudo service mysql start

Il ne reste plus qu'à faire la même chose avec le dossier /var/www/html.

sudo mount -t nfs xxx.xxx.xxx.xxx:/volume1/JeedomNFSHTML /mnt
sudo cp -a /var/www/html/.??* /var/www/html/* /mnt/
sudo umount /mnt


Ajoutez la ligne suivante au fichier /etc/fstab :
xxx.xxx.xxx.xxx:/volume1/JeedomNFSHTML  /var/www/html  nfs  defaults  0  0

Enfin remettez les droits sur le dossier et redémarrez apache2.

sudo mount /var/www/html
sudo chown www-data:www-data /var/www/html
sudo chmod u=rwx,g=rwx,o=rx /var/www/html

sudo service apache2 start

Vous avez désormais réglé 2 problèmes sur 3.

Quid du dossier /var/log ?

Pour le dossier /var/log nous allons appliquer un traitement radicalement différent. Nous utiliserons Log2Ram ! Comme son nom l'indique, cet outil utilise un peu de RAM pour y stocker les logs. Ensuite, toutes les heures, il synchronisera la carte SD avec les données en mémoire.

Pourquoi ne pas avoir appliqué le même traitement que précédemment à ce dossier ? Tout simplement pour une question de performances. De nombreux accès sont effectués dans ce dossier et à chaque fois il s'agit de petites quantités d'informations (bien plus petites qu'une taille de bloc). De plus, de nombreux logiciels n'écrivent pas en asynchrone dans les logs et attendent donc que l'écriture soit réalisée pour poursuivre leur exécution, il faut donc de la performance.

La solution proposée présente un défaut dont il faut avoir conscience : si votre Raspberry plante 59 minutes après la dernière synchronisation, vous n'aurez pas les logs de la dernière heure. Pour moi, ça n'est pas un gros problème mais si cela l'est pour vous, vous pouvez sacrifier un peu de performance contre plus de sécurité en faisant comme pour les deux précédant dossiers. Vous pouvez aussi modifier le délai d'exécution de la tâche CRON qui synchronise le dossier pour réduire le temps par défaut.

Installation de Log2Ram

L'installation se fait très rapidement grâce à un script.

curl -Lo log2ram.tar.gz https://github.com/azlux/log2ram/archive/master.tar.gz
tar xvfz log2ram.tar.gz
cd log2ram-master
chmod +x install.sh && sudo ./install.sh
cd .. rm -rf log2ram-master


Par défaut Log2Ram utilise 40Mo en RAM. C'est relativement peu et ça convient très bien, cependant il peut arriver que vous ayez trop de logs pour qu'ils puissent être contenus dans ces 40Mo. Pour cela je vous conseille d'adapter la rotation de vos logs en modifiant /etc/logrotate.d/rsyslog. Il suffit de remplacer le mot weekly par daily et de conserver 7 rotations (rotate 7). Vous pouvez en conserver plus si vous voulez mais personnellement 7 jours de logs me suffisent.
Appliquez ensuite cette nouvelle configuration à vos logs (cela vous permettra de démarrer dans de bonnes conditions avec de petits fichiers de log) :

sudo logrotate -f /etc/logrotate.d/rsyslog

Personnellement j'ai également fait une sauvegarde de tous les fichiers .gz des rotations de log précédantes et je les ai supprimés du répertoire pour partir sur un dossier assaini. Libre à vous de le faire ou non. Pour supprimer tous les fichiers .gz du dossier /var/log et tous ses sous-dossiers, vous pouvez faire :

cd /var/log
sudo find -name "*.gz" -exec rm {} \;


Enfin lancez le service :

service log2ram start

Pour finir :

Je vous conseille de redémarrer votre raspberry et de vous assurer que les systèmes de fichier /var/log, /var/lib/mysql et /var/www/html sont bien montés (via un simple df -h par exemple).

J'espère que cet article vous aura été utile et si c'est le cas, n'hésitez pas à me le dire ou à le partager.

Aucun commentaire:

Publier un commentaire