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 🙂
Car, 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.
Le 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 !
Merci, c’est une très bonne astuce
😉
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…
Ping : Linux | Pearltrees
Ping : Prolonger la durée de vie de vos cartes ...
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.
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.
🙂
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 !
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 🙂
Ah ok, ça répond à ma question initiale, alors. Je vais plutôt utiliser la méthode de ton article alors 🙂
Bonjour,
Quand est-il du F2FS pour prolonger la durée de vie de SD ?
Boarf… Ça ne change pas grand chose… Cela dit je n’ai pas de retour d’expérience avec ce système de fichier.
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)
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 ?
Est ce que Apache ou Nginx continuent de fonctionner correctement ?
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+
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 🙂
J’ai eu le même soucis, c’est bien Apache avec ses logs qui est problématique avec tmpfs. Il faut à chaque fois recréer le dossier des logs et un fichier vide.
La meilleure façon de faire est de faire un script au démarrage qui démarre avant Apache. http://weits.blogspot.fr/2012/03/laptop-ssd-tmpfs-and-apache.html
Sinon, pour ne pas perdres ses logs, tout en les montant en RAM, il y a « ramlog » > http://korben.info/raspberry-pi-allonger-la-duree-de-vie-de-vos-cartes-sd.html
fonctionne très bien 🙂
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 ? 🙂
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… 😀
Excellent 🙂
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!
Ping : Configuration particulière pour économiser la carte SD
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.
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
Bonjour Nat,
En effet, les cartes SD sont très fragiles ! La première cause de mort de carte SD sur Raspberry Pi vient d’une mauvaise alimentation.
Faites un tour sur cet article pour voir quel matériel choisir : http://www.magdiblog.fr/divers/quels-accessoires-et-composants-acheter-pour-votre-raspberry-pi/
Par curiosité, quelle marque de carte SD utilisez vous ?
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
et visiblement j’ai aussi perdu mon « i »
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.
Ping : Gagner en réactivité avec Zram – c'est pas mon blog
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…)
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
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
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?
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 !)
Ping : montage auto partition chiffrée – TuT0x
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 ??
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….
vous avez trouvé une solution j’ai exactement le meme souci ? 🙁
.
Non, je n’utilise pas ramlog : J’ai monté /var/log en tant que tmpfs
Okey ,merci dommage je rame un peu pour le faire marcher sur mon Pi2
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).
Personnellement avec ramlog sous jessie ça ne marche pas mais j’ai découvert une alternative c’est log2ram qui fonctionne parfaitement
armbian, bonne solution.
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 /)
Que voilà une bonne suggestion, merci !
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!).
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
Y a t’il un moyen de savoir si la carte est à x% de sa durée de vie ?
perso, j’ai opté pour un orange pi pc plus avec une armbian installé sur la mémoire interne (emmc)
comme ça, plus besoin de SD 🙂
Ping : [RPi] Comment ajouter un RAMDisk
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
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.
Ping : Optimiser | Pearltrees
Ping : Et si j’arrêtais de faire n’importe quoi avec mon Raspberry ? – riduidel's wordpress
Ping : Diffusion des flux vidéos de caméra IP en HTTP Live Streaming (HLS) – BinaryWorld
Ping : Ma Pi-Box reprend du service | Le blog de Jean
Ping : Disque | Pearltrees
Etrange vos pb de sd, j’en suis à ma 2eme SD sur rpi1b avec domoticz qui tourne depuis 10ans ! et j’ai changé de SD car elle était un peu juste en taille (4Go), seul astuce de mon coté, avoir mis le /tmp en ram