Comment prolonger la durée de vie de vos cartes SD sur Raspberry Pi (màj)

raspberry_pi_sd_card_killer

Je le clame haut et fort, le Raspberry Pi est un tueur de cartes SD ! Je l’ai vu de mes propres yeux et de nombreux témoignages l’attestent ! Mais il y a plus grave, mesdames et messieurs les jurés, ce crime abject n’est pas un cas isolé, derrière cette framboise affriandante se cache un véritable tueur en série ! Nous devons stopper cette infamie !

Le drame

Si je mets, aujourd’hui, le Raspberry Pi au banc des accusés, c’est parce que depuis sa sortie j’ai cramé une bonne dizaine de cartes SD, de marques (même les plus réputées) et de tailles différentes. Toutes ont rendu l’âme après quelques mois d’utilisation intensive… Les preuves ne laissent aucune place au doute ; le Raspberry Pi est coupable ! Mais, mais ! Ce n’est pas vraiment de sa faute 🙂

raspbian_logoCar, voyez-vous, Raspbian, la distribution Linux dédiée au Raspberry Pi, est un système d’exploitation qui, comme tous ses homologues, sollicite énormément la carte SD du Pi (qui joue le rôle de disque dur, rappelons le) ; écrivant et lisant sans vergogne des kilo tonnes de données à un rythme immodéré. Or, une carte SD n’est pas du tout (vraiment pas !!!) taillée pour encaisser ces assauts répétés.

sandisk_ultra_micro_sd_16goLe nombre de cycles d’écriture étant limité, les jours de votre carte SD sont comptés dès le moment ou vous la branchez sur un Pi. Secteur par secteur, votre carte SD se consume jusqu’à devenir totalement inutilisable.

Le problème ne vient donc pas directement du Pi, mais plutôt de Raspbian. Le Pi étant disculpé, nous allons voir comment modifier légèrement le fonctionnement de Raspbian pour pallier ce problème de sollicitation abusive de la carte SD.

La solution

La méthode est très simple à mettre en oeuvre. Il « suffit » de déporter de la carte SD à la RAM, les répertoires faisant l’objet de nombreuses écritures de la part du système d’exploitation. Ce tour de passe-passe est possible grâce au système de fichier tmpfs (plus d’info sur tmpfs ici : http://doc.ubuntu-fr.org/tmpfs). En gros, il s’agit de créer des « partitions » (notez les guillemets pour les puristes) directement dans la RAM du Pi ; RAM qui elle, est spécialement conçue pour encaisser de nombreux cycles d’écritures 😀

Les répertoires du système Rasbian à « déplacer en RAM » sont essentiellement les répertoires temporaires et les répertoires contenant les logs. Nous allons donc cibler les répertoires systèmes suivant :

/tmp
/var/tmp
/var/log

On pourrait aller chercher d’autres répertoires, mais ces trois là sont les plus critiques.

Alors oui, je ne le précise pas mais cela coule de source, l’ensemble des données présentes dans ces répertoires seront supprimées à chaque reboot du Pi… Ah bah oui ! Donc si vous souhaitez conserver certains fichiers de logs par exemple, pensez à les déplacer avant 🙂

Pour déplacer ces répertoires en RAM, il convient d’éditer le fichier /etc/fstab qui gère les points de montages du système. Ajouter les lignes suivantes :

tmpfs /tmp tmpfs defaults,noatime,nosuid,size=10m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=10m 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=10m 0 0

J’attire votre attention sur le paramètre size de chaque ligne, qui limite le volume maximal de données qui pourront être stockées dans chaque répertoire en RAM. Et comme nos Pi ne sont pas généreusement dotés de ce côté là, il faut y aller avec parcimonie ; 10Mo par répertoire sont suffisants dans la plupart des cas 🙂

Bien entendu, il conviendra de redémarrer le Pi pour que les modifications soient prises en compte 🙂

Voilà pour les répertoires systèmes qui sollicitent le plus la carte SD.

Décliner la solution

Le gros intérêt de cette méthode, c’est que vous pouvez la décliner pour tous les programmes ou opérations qui, d’une part réalisent de nombreuses écritures sur la carte SD et qui d’autre part ne nécessitent pas de conserver des données de manière persistante.

Prenons l’exemple d’un système de vidéo surveillance ou de streaming vidéo. Les images capturées pour être transmises ne nécessitent pas d’être conservées sur la carte SD. Vous pouvez donc créer un sous-répertoire dans le répertoire home de votre utilisateur, pour y stocker temporairement ces fichiers images :

tmpfs /home/pi/images tmpfs defaults,noatime,nosuid,size=50m 0 0

Cas spécifique des fichiers de logs

Dans le cas des fichiers de logs, la méthode tmpfs décrite plus haut présente deux gros inconvénients :

  • Le premier est que vous perdez toute trace des événements système après chaque redémarrage. Si ce n’est pas gênant pour certains projets, ça peut l’être si vous vous servez de votre Pi comme serveur Web par exemple.
  • Le deuxième est que certains softs (typiquement Apache) créent un sous répertoire dans /var/log pour y stocker ses fichiers de logs. Hors avec tmpfs, le répertoire /var/log monté en RAM est vide à chaque démarrage ; ce qui empêchera Apache par exemple de démarrer correctement…

Rappelons que le problème des fichiers de logs est le nombre important d’écriture sur la carte SD. L’idéale serait donc de pouvoir conserver nos fichiers de logs mais d’en limiter le nombre d’écriture. C’est exactement ce que se propose de faire ramlog : Il stock temporairement les logs en RAM, puis vient les écrire par bloc dans les fichiers sur la carte SD de temps en temps 🙂

Merci à Jerry pour l’info 😉

Pour installer ramlog sur nos Pi, rien de plus simple :

wget http://www.tremende.com/ramlog/download/ramlog_2.0.0_all.deb
sudo dpkg -i ramlog_2.0.0_all.deb
sudo reboot

Une fois le Pi redémarré, vérifier que ramlog est bien actif avec la commande suivante :

/etc/init.d/ramlog status

Voici le lien vers le site officiel de ramlog pour plus d’info : http://www.tremende.com/ramlog/

Longue vie aux cartes SD !

54 réflexions au sujet de « Comment prolonger la durée de vie de vos cartes SD sur Raspberry Pi (màj) »

    1. walhall

      Waip, bonne idée…. par contre, après sa mise en place, mes scripts écrits en python et qui doivent se lancer à certaines heures de la journée ne fonctionnaient plus… Je n’ai pas eu le temps d’approfondir le problème en cherchant dans les logs. Une alternative au disque en mémoire vive serait le disque en réseau… à creuser…

      Répondre
  1. Ping : Linux | Pearltrees

  2. Ping : Prolonger la durée de vie de vos cartes ...

  3. palisir

    Merci ! En prospection sur l’utilisation d’un Rpi pour héberger des petits services, cette info tombe à pic.

    Je me demandais également : qu’en est-il de l’installation du système sur un disque dur portable USB ? Les temps d’accès devraient être sensiblement les mêmes et l’encombrement n’est pas énorme le tout bien agencé. Le seul inconvénient que j’y verrait serait la conso sur le long terme.

    Répondre
    1. Olivier Auteur de l’article

      Hello,
      Il est tout à fait possible de déporter l’ensemble du système sur un périphérique USB, en dehors de la partition boot.
      Cependant, je pense que le meilleur compromis est de laisser le système sur la carte SD, mais de gérer toutes les données de ton serveur sur un périphérique USB.
      🙂

      Répondre
      1. palisir

        D’accord. Et une fois le disque branché, si les perfs ne sont pas du tout importantes pour moi, est-ce que tu penses que ça vaut vraiment la peine de garder en plus la SD ?
        Merci, en tous cas !

        Répondre
        1. Olivier Auteur de l’article

          Hello,
          Dans tous les cas tu seras obligé de garder la SD. Le Pi est conçu au niveau hardware pour booter sur la carte SD et rien d’autre. C’est pour ça qu’il vaut mieux stocker uniquement les données sur un périphérique externe et garder le système sur la SD 🙂

          Répondre
          1. palisir

            Ah ok, ça répond à ma question initiale, alors. Je vais plutôt utiliser la méthode de ton article alors 🙂

    1. Olivier Auteur de l’article

      Boarf… Ça ne change pas grand chose… Cela dit je n’ai pas de retour d’expérience avec ce système de fichier.

      Répondre
      1. aupays

        Salut, je uis étonné par ta réponse car F2FS semble avoir été conçu pour les cartes SD et permet d’éviter qu’un secteur défectueux à force d’écriture ne plante toute la carte SD (enfin d’après ce que j’en ai compris)

        Répondre
  4. Michelgard

    Bonjour. Apres cette manip j’ai plus d’accès au site internet hébergé sur mon raspberry !
    Testé sur deux PI.
    Par conte des crons qui lancent des pages php marchent encore.
    Une idée ?

    Répondre
      1. michelgard

        Là tu m’en demandes trop ! 🙂
        J’ai deux raspberry avec sur chaque apache et un port différent (différent du 80).
        L’un pour mon DashScreen et l’autre pour la domotique de la maison et appli tel.
        J’ai fait la manip donnée pour les carte SD à distance et tout avait l’air de fonctionner. Mais hier quand j’ai voulu accédé à mes pages web (a distance) plus rien. Par contre j’ai quelques CRON qui envoie des données sur une base de données (température, position des interrupteurs…) en ouvrant des pages PHP et cela avait continué de fonctionner…
        Voilà ce que je peux dire pour l’instant.
        J’ai enlevé les lignes du fichier et tout est revenu comme avant.
        A+

        Répondre
        1. Olivier Auteur de l’article

          Essai de redémarrer Apache pour voir : /etc/init.d/apache2 restart
          Si il n’est pas content à cause des logs, c’est sans doute parce que le répertoire /var/log/apache2 n’existe pas. Il faudra donc modifier la conf Apache pour qu’il envoi les logs directement dans /var/log 🙂

          Répondre
    1. Olivier Auteur de l’article

      Yop,
      Ah oui, j’avais vu ça, mais je n’ai pas encore testé. Est ce que quelqu’un a un retour d’expérience à partager ? 🙂

      Répondre
      1. Jerry

        Je l’ai depuis quelques temps; cela fonctionne très bien; les logs restent accessibles tout le temps, et sont flushé régulièrement d’un coup.

        Je viens de même de recevoir un mail de fail2ban à l’instant… 😀

        Répondre
  5. Abrolino

    Salut
    Pour ma part j’ai un message d’erreur. Il me manquait lsof.
    Pensez à exécutez : sudo apt-get install lsof, puis sudo apt-get -f install pour corriger les dépendances.
    Si ça peut servir à quelqu’un…
    A plus

    PS : Et si quelqu’un sait à quoi peut bien servir ce composant de listing, je suis preneur!

    Répondre
  6. Ping : Configuration particulière pour économiser la carte SD

  7. stratagem

    Merci pour l’astuce !

    A noter que mysql semble souffrir du même problème qu’apache. Ca fonctionne en recréant le répertoire /var/log/mysql via un script au démarrage.

    Répondre
  8. nat

    bonjour,

    bien embêtée , le doute me taraude , suis-je cruche ,ou mon rpi2 est-il malade?

    depuis 2 semaine que j’ai ma carte pi2 , j’ai grillé 2 cartes micro sd (surchauffe?, cassée en 2)

    la carte raspberry est-elle en cause ou , une fausse manœuvre peut-elle griller une carte?
    il me reste peu de temps pour rendre la carte au vendeur si problème
    avez-vous écho de ce type de problème , je n’ai rien trouvé sur internet

    symptôme installe noobs ok , fonctionnement ok , je l’ai sortie pour la cloner avec ubuntu , remise dans raspberry , ne démarre pas led rouge verte fixe,visiblement cassée (fissure par le milieu et déformée )après extraction.
    du coup je n’ose plus y touché ……. sos
    nat

    Répondre
      1. nat

        bonjour Olivier,

        merci pour votre réponse,
        j’ai grillé une toshiba, une kingston et une pny , et avec 2 alims différentes –
        -sd la toshiba avec une asus 5.2v 1.35a
        – les 2 autres avec un no name 5v 3a

        c’est pourquoi j’ai un doute sur la carte rasbperry ,
        le phénomène semble bien lié avec le fait de ré-introduire un carte précédemment installée et fonctionnelle, mais je ne trouves personne sur internet qui aie eu ce problème.
        j’en perd mon latin.

        avec ce qui m’en reste AVE

        Répondre
          1. Olivier Auteur de l’article

            Préférez les cartes SD de la marque Sandisk et les alims de la marque Aukru.
            L’alimentation sur les Pi est TRES importante.

  9. Ping : Gagner en réactivité avec Zram – c'est pas mon blog

  10. fraoult

    J’ai aussi mis en RAM le répertoire /run (dans lequel se trouve /run/lock) : que les fichiers de PID soient sur la carte, on s’en fout un peu non ? Donc autant le mettre en RAM…

    Pour le problème d’apache, j’ai modifié le script de /etc/init.d pour créer le répertoire /var/log/apache s’il n’existe pas.
    Il serait plus propre de créer un script dédié à part pour recréer tous les répertoires nécessaires (apache, mysql, …) avant le lancement de tout autre processus, mais je ne faisais là qu’un patch bricolé rapide.

    L’idéal serait ensuite de monter tout le reste du système en read-only.
    J’ai découvert le système UFS que je ne connaissais pas et qui semble pas mal pour ça (l’idée étant d’agréger un dossier en RO et un dossier en RW dans le même dossier. Ainsi par exemple les écritures se font dans un répertoire monté en RAM mais la lecture initiale vient bien du dossier sur la SD) mais mes tentatives avec /var /etc et /home en UFS se sont jusqu’à présent soldé par un échec…

    Si quelqu’un a déjà fait et sait faire un modop’ fonctionnel, je suis preneur (l’idée étant de pouvoir utiliser un raspberry en mode kiosk pour pour tout autre tâche où l’alim’ peut être coupée brutalement…)

    Répondre
  11. antoin

    avec ubuntu mate j’ai pu éditer la fstab sans problème.

    par contre avec raspbian
    lorque je veux éditer fstab avec sudo nano /etc/fstab
    j’obtiens:
    proc /proc proc defaults 0 $
    /dev/mmcblk0p6 /boot vfat defaults 0 $
    /dev/mmcblk0p7 / ext4 defaults,noatime 0 $
    # a swapfile is not a swap partition, no line here
    # use dphys-swapfile swap[on|off] for that

    je n’ai pas compris la commande à faire exactement

    Répondre
  12. CactusTribe

    Bonjour, merci pour ces précieuses informations.
    Cependant après cette modification la commande :

    $ sudo find /var -type f -mmin -1

    Donne comme résultat toujours :

    $ /var/log/auth.log
    $ /var/log/messages
    $ /var/log/syslog

    Avec en plus la led de statut d’écriture qui continue de blink, donc il y a toujours écriture non?
    (Même après reboot)
    Est-ce un « bug » qui fait que la led s’allume tout de même?

    Raspbian Jessie
    RaspBerry Pi 3

    Répondre
    1. CactusTribe

      Personne ne peut me dire si c’est normal que la led continue de blink environs 1fois par seconde? D’autres logs serait en cause?

      Répondre
      1. Dominique DAMBRAIN

        Le blinking de la led ne veut pas dire que l’on écrit sur la carte SD, à mon humble avis.
        Cela peut signifier que l’on accède à un filesystem ( tmpfs en RAM ou ext4 sur la carte SD) ou encore que la CPU est sollicitée.
        Normalement, tous les logs sont dans /var/log, donc en RAM, sauf si tu as configuré Apache2 ou autre samba pour écrire ses logs ailleurs (ce qui n’est pas une bonne idée !)

        Répondre
  13. Ping : montage auto partition chiffrée – TuT0x

  14. Dominique DAMBRAIN

    Merci infiniment pour ces infos, clairement exposées….
    J’ai forcé le montage de /tmp , /var/tmp et /var/log en tmpfs, comme indiqué en fstab.

    Toutefois, je viens d’essayer d’installer ramlog sur un Pi2 sous Debian 8.0, et il semble ne pas démarrer au boot :
    août 12 14:03:42 Pi3 ramlog[409]: Starting ramlog-tmpfs 2.0.0: /bin/cp: « …hier
    août 12 14:03:42 Pi3 ramlog[409]: failed!

    Une idée ??

    Répondre
    1. Dominique DAMBRAIN

      Complément d’information : Il semblerait que systemd démarre ramlog APRES que rsyslog ait été lancé : Donc /var/log est occupé, et ramlog ne peut transférer ce tmpfs en ramdisk….

      Répondre
  15. _BenM_

    Remarque au passage : pourquoi ne pas mettre une petite (en taille comme en capacité) clé USB et placer les rep à accès fréquent sur la clé ? Vous allez me dire que c’est pareil puisque c’est le même type de stockage. Mais en mettant juste les rep vraiment utiles (je pense aux logs notamment), ça peut être pas mal, d’autant qu’une clé ça se change facilement et ça ne perturbe pas le système. On pourrait même songé a laisser les logs en RAM mais configurer logrotate pour que tous les jours il mette l’archive sur la clé (ou même la SD/eMMC dans ce cas).

    Répondre
  16. Nic

    Il est très important d’activer Trim pour prolonger la durée de vie de la carte SD du rasperry, faute de quoi le données seront toujours écrites au même endroit (un simple cron fera l’affaire => 00 02 * * * /sbin/fstrim -v /)

    Répondre
      1. yann

        Sauf que les medias extractibles supportant TRIM, c’est rare. Pour ma part, je ne connais que certaines eUSB (cartelettes SSD sur USB destinée au marché de l’embarqué) récentes qui soient compatibles.
        Donc cette suggestion fera au mieux passer des commandes ignorées par le firmware (avec fatalement une petite baisse de perf) du contrôleur de la SD/USB… au pire pourra causer des problèmes (je pense que la plupart ne sont pas testé pour se prendre des listes de LBAs libérés après un erase, ce que fait TRIM. L’action classique d’erase se contentant d’agir en écriture sur les métadonnées du système de fichier… Il y a amha dans ce cadre du potentiel pour trouver des race conditions que le fabricant n’aura pas vu dans ces tests, selon les accès classiques qui pourront s’entremêler!).

        Répondre
  17. yann

    Sinon, pour estimer s’il y a vraiment un pb de trop d’écritures, Ext4 maintient des compteurs d’écriture lifetime (en fait depuis le dernier formatage) et session (depuis le dernier montage) de chaque partition:

    Par exemple:
    cat /sys/fs/ext4/mmcblk0p2/session_write_kbytes
    9191148

    Sur un uptime de 9j, ca fait 1GB par jour pour une SD de 32GB. Si elle est donnée pour 30TBW (Tera Bytes Written, ce qui ferait autour de 1k ré-écritures complètes possibles, valeur classique pour de la flash NAND aux finesses de gravures actuelles ; Il y a 10 ans, pour de la NOR on en était à 100k… mais elles étaient bcp moins grandes!), ca fait une durée de vie potentielle de 30*1024/1=30720 jours, soit 84 ans!

    Mais c’est un système minimal (console seule) faisant tourner de la domotique. J’y mets pas ma collec de films cnahgée régulièrement, avec une interface graphique/applicatif qui log à tout va.

    Mais même dans ce cas, il est possible de limiter les écritures en agissant sur la config de la mémoire virtuelle: Tous les combien on fait des commit (5s par défaut, ce qui regroupe toutes les opérations d’écriture dans cette tranche de temps ; Il est possible de monter plus haut, mais sur perte brutale d’alim on perds plus de modifs récentes!).

    Ca se fait en utilisant une option de montage (commit=30 pour 30s par ex) ou via le sysfs en cours de route (pour tester).

    Les:
    cat /proc/sys/vm/dirty_expire_centisecs
    30s par defaut

    et:
    cat /proc/sys/vm/dirty_writeback_centisecs
    5s, commit, par défaut

    Peuvent être modifiés pour plus bufferiser en ram avant d’écrire vraiment sur le stockage.

    Voir ici les précisions:
    https://www.kernel.org/doc/Documentation/sysctl/vm.txt

    Répondre
  18. Ping : [RPi] Comment ajouter un RAMDisk

  19. Benoit-Pierre DEMAINE

    Le problème est très simple: même quand on achète les cartes haut de gamme comme la Sandisk Extreme pro, ou les High Endurance … et en dépit des garanties à vie de Sandisk, si vous contactez Sandisk, ils vout diront clairement que quand vous insérez leurs cartes dans un rPi, la garantie saute. Les cartes uSD de Sandisk ne sont pas compatibles rPi; elles ne sont pas garanties pour cet usage. C’est pas fait pour.

    Moi aussi ça fait des années que je galère avec des cartes qui fument tous les 6 mois; mais je viens de contacter plusieurs hotlines, et j’ai obtenu partout la même réponse.

    La configuration ordinaire vendue par tous les magasins de rPi est en fait … quasiment illégale, puisque les rPi sont vendus en kit avec des cartes SD dont la garantie exclue l’usage du kit …

    Pour le rPi, il faut utiliser la SD uniquement comme zone d’amorce (et encore même ça, c’est pas garanti par les constructeurs).

    Les solutions:
    – prendre chez Sandisk la carte la plus solide qu’ils ont: High Endurance (mais ça reste hors garanti)
    – opter pour une eMMC avec adapteur (les flash de type MMC sont beaucoup plus solides que celles des SD; les algorythmes de wear levelling sont différents)
    – dans la mesure du possible, si la commande « hdparm -I /dev/sda » répond que le disque supporte le trim, alors, activer le trim au mount (option discard), ou via cron (fstrim -a)
    – bidouiler avec un module eUSB

    Répondre
    1. alysko

      Pas de carte cramée (et c’est pas un High Endurance) : mon Odroid C2 tourne 24/7 depuis plus d’un an grâce à armbian dont j’ai parlé plus haut.

      Répondre

Laisser un commentaire