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.
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 ...
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:
Enregistrer un commentaire