Raspberry Pi : Prolonger la durée de vie de sa carte SD

raspberry pi 3 carte sd Comme vous le savez certainement déjà, le Raspberry Pi peut être un véritable tueur en série de carte SD. S’il vous est déjà arrivé de voir le monstre à l’œuvre, si vous avez enterré trop de cartes SD pour Raspberry ou si vous ne souhaitez pas que ça vous arrive trop rapidement, cet article est fait pour vous. En effet, je vais vous expliquer une méthode simple et facile à mettre en place afin de prolonger la durée de vie de sa carte SD.

Le Raspberry Pi détruit les cartes SD?

Si vous avez lu mon article sur les accessoires du Raspberry Pi, vous n’êtes pas sans savoir, qu’une carte SD ou une carte micro sd a un nombre d’écritures limité.

Vous pouvez voir ça comme des points de vie. A chaque fois que vous écrivez quelque chose sur votre carte, celle-ci perd des points de vie. Lorsqu’elle arrive à zéro, c’est Game Over : votre carte est officiellement morte et bonne à jeter.

Le souci du Raspberry Pi (ou plutôt de Linux) est qu’il écrit énormément de données, et ce très régulièrement. Il peut mettre fin à une carte SD très rapidement (quelques semaines ou mois) si le système est très sollicité (comme un serveur web par exemple).

On rejette régulièrement la faute sur le Raspberry mais à vrai dire levrai problème vient de Linux.

Linux et les logs : les véritables coupables

Derrière le masque du Raspberry Pi se cache en réalité le véritable assassin : Linux.

Ce qui d’habitude est un vrai plaisir dans Linux devient soudainement le cauchemar des possesseurs de carte Rpi : les logs ou comme on devrait dire en français les fichiers journaux (mais personne ne dit ça).

En effet, une chose que j’adore et qui fait la puissance de Linux, c’est sa capacité à enregistrer tout ce qu’il se passe sur le système dans des fichiers texte qu’on appelle les logs. Ça permet par exemple d’enregistrer les erreurs pour pouvoir les analyser et comprendre les problèmes que l’on rencontre. C’est magique et tellement pratique que lorsqu’on y a pris goût, on a du mal à s’occuper de problèmes dans Windows (dont les logs sont beaucoup moins bavard).

Les logs : beaucoup trop d’écritures pour une carte SD

Le souci des fichiers de logs c’est qu’ils sont écrits plusieurs fois par minute et qu’il n’y a pas qu’un seul fichier de log. Il y a plusieurs logs pour le système et ensuite il y a même des logs pour certains services comme Apache, MySQL, OpenVPN et bien d’autres. Autant vous dire qu’après une bonne journée d’utilisation intensive sur un Raspberry Pi 3 qui fait serveur web, on arrive à un nombre incroyable de lignes écrites sur sa micro sd. Rappelez-vous : les écritures sont les points de vie de votre carte SD : quand on arrive à zéro c’est Game Over.

Je vous invite à aller faire un tour et regarder un peu à quoi ressemble un log. Vous devriez les trouver dans /var/log pour les OS basés sur Debian (Raspbian, Ubuntu Mate, OSMC etc…). Croyez moi, si vous avez l’intention de suivre les articles de ce blog ou de bricoler avec votre Raspberry, vous aller avoir besoin des logs.

Prolonger la durée de vie des cartes SD : les solutions

Bien choisir sa carte SD

En effet, on ne le dira jamais assez : si vous voulez une bonne durée de vie, prenez une bonne carte SD. Je vous renvoie vers mon article sur les accessoires pour Raspberry et qui vous explique comment bien choisir sa carte SD (marque, classe, capacité, etc.).

Enregistrer ses logs en RAM

Pour éviter que les logs ne s’inscrivent sur la carte SD il n’y a que deux solutions : désactiver les logs ou les enregistrer en RAM.

Il est déconseillé de désactiver les logs : si vous avez run problème avec votre OS ou un aute service vous n’aurez aucun moyen de comprendre le problème sans les logs.

Nous allons donc enregistrer nos logs en RAM, ainsi nous n’écrirons pas sur la carte SD mais nous pourrons quand même accéder aux logs. Par contre, enregistrer ses logs en RAM a un gros inconvénient : la RAM est vidée à chaque arrêt du système. Autrement dit, si vous redémarrez votre Rpi, vous perdez l’ensemble de vos logs précédents. Ne vous inquiétez pas, on a pensé à tout et il y a une solution.

Passer de la RAM à la carte SD

La solution est un intermédiaire. On va continuer à écrire nos logs sur notre carte SD mais on va le faire moins souvent grâce à la RAM.

L’idée, est d’écrire les logs en RAM et d’écrire ensuite la totalité des logs d’un seul coup sur la carte SD lorsqu’on éteint notre Pi ou qu’on le redémarre. Ainsi, au lieu de faire un accès chaque fois que l’OS a quelque chose à écrire dans les fichiers de logs, on ne fait qu’un seul accès qui va écrire la totalité des logs depuis le démarrage du système.

Cette méthode n’est cependant pas parfaite, elle a un défaut assez important que nous ne pourrons pas résoudre : si votre Raspberry se coupe sans prévenir, rien ne sera écrit sur la carte SD et on perdra les logs en RAM. En effet, les logs ne sont copiés qu’en cas d’arrêt propre du Raspberry Pi. Par exemple, en cas de Kernel Panic, ne comptez pas sur les logs pour vous aider.

C’est pourquoi je vous conseille de ne passer les logs en RAM qu’une fois que votre Raspberry est bien configuré et que vous avez fini tous vos tests.

Log2RAM : la solution logicielle

J’ai testé trois solutions différentes : RamLog, FS2Ram et log2Ram. Les deux premières solutions n’ont rien donné malgré plusieurs heures de travail.

C’est alors que je suis tombé par hasard sur le git de Log2Ram et que j’ai été séduit par sa simplicité et son efficacité.

Pour installer log2Ram il suffit de lancer ces quelques commandes :

git clone https://github.com/azlux/log2ram.git

cd log2ram

chmod +x install.sh

sudo ./install.sh

Vous pouvez alors redémarrer votre Raspberry Pi et tester que Log2Ram a bien démarré.
Pour cela, regardez si votre /var/log est bien monté en tmpfs :

df -h

EDIT : A une époque il était nécéssaire de préciser à Log2Ram les services avant lesquels il doit démarrer. Depuis une mise à jour Log2Ram devrait démarrer avant le syslog et il ne devrait plus y avoir de problème (encore merci à Azlux pour cette nouvelle).

Si certains services refusent tout de même de démarrer, vous pouvez vous reporter au texte barré ci-dessous qui énonce la méthode avant cette mise à jour.

Il est possible que certains services refusent de démarrer après l’installation de Log2Ram (dans mon cas Apache). Cela est dû à un problème à la suite de la création du point de montage sur /var/log. En effet, pour qu’il n’y ait pas de soucis d’écriture des logs, Log2Ram doit avoir démarré avant les services qui vont écrire leur log sur /var/log (rsyslog, apache2, nginx etc…).

EDIT : Pour cela il suffit d’éditer le fichier « /etc/systemd/system/log2ram.service » à la ligne « Before=syslog.target mysql.service fail2ban.service nginx.service rsyslog.service » et d’y ajouter le service qui pose problème. (Merci à Azlux pour cette méthode)

Par exemple pour Apache, la ligne devient :

Before=syslog.target mysql.service fail2ban.service nginx.service rsyslog.service apache2.service«

Pour régler le problème, il vous suffit de supprimer et recréer les dossiers et les fichiers de logs du service et de le redémarrer. Par exemple pour Apache :

sudo rm -rf /var/log/apache2

sudo mkdir /var/log/apache2

sudo touch /var/log/apache2/error.log

sudo service apache2 restart

Voilà, normalement, vos logs sont maintenant déportés sur la RAM et les accès à votre carte SD ont fortement été réduits.

Mieux vaut prévenir que guérir

Il est important de noter que cette méthode va prolonger la durée de vie de sa carte SD mais elle ne fait pas de miracles. Le défaut des mémoires flash subsiste et un jour ou l’autre votre carte SD finira par rendre l’âme et ce même en réduisant au maximum l’écriture sur la carte.

Je vous conseille donc de faire un back-up régulier de votre carte SD.

Dans un prochain article je vous expliquerais comment sauvegarder votre système périodiquement et automatiquement via un montage NFS.

En attendant, si la disponibilité de votre Rpi est critique (hébergement web par exemple), vous pouvez toujours mettre votre OS sur un autre support comme un disque magnétique(HDD) ou un SSD qui sont tous les deux taillés pour ce genre de choses.

Voilà, j’espère que cet article vous aura été utile et je vous invite à laisser des commentaires 😉

 

5 commentaires

  1. Bonjour,
    Tu peux vérifier dans le fichier « /etc/systemd/system/log2ram.service » la ligne :
    Before=syslog.target mysql.service fail2ban.service nginx.service rsyslog.service

    J’ai nginx sur ma machine (d’ou le nginx.service), mais si tu as apache, tu peut ajouter à la liste « apache2.service » pour forcer log2ram à démarrer avant qu’apache2 ne monte son point d’écriture pour ses log.

    PS: tu fait du bon boulot avec ce site.
    Azlux

    1. Bonjour Azlux,

      Tout d’abord merci pour ton commentaire, en plus d’être constructif c’est aussi le premier commentaire du blog 😉

      J’ai modifié le script log2ram.service pour y ajouter les services qui ont besoin de logs et ça marche à merveille, sans compter que c’est beaucoup plus propre que ma méthode. Je vais donc m’empresser d’éditer l’article pour y ajouter cette note.

      Merci pour ton PS, ça fait plaisir d’avoir un retour positif 🙂

      David

  2. Bonne Maj log2ram : plus besoin de spécifier les services mnt. Il démarre avant le syslog et enregistrer tout au reboot (y avait un bug la dessus)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *