Rasp-SD-Preserver

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Durée de vie limitée des cartes SD

Les cartes SD peuvent être lues un nombre illimité de fois mais ne supportent que 10.000 à 100.000 cycles d'écritures!!!

 

Cela semble énorme, surtout pour un appareil photo... cependant cette limite est atteignable dès lors que l'on utilise un système informatique. En cas d'accès intensif en écriture, une carte peut très bien rendre l'âme au bout de 6 mois (il n'y a malheureusement pas de miracle technologique). Chez MC Hobby, nous avons fait des tests intensifs et poussé des cartes à la défaillance en 5 heures.

De meilleure qualité sera votre carte SD... et plus longtemps elle tiendra. Les cartes de classe 10 ont une meilleure tenue dans temps.

Par contre, dès que cette dernière est utilisée en lecture/écriture (comme sur un Pi), elle rendra l'âme un jour ou l'autre. Pas de miracle, tout se résume à une question de temps.

Il est certes possible de contourner le problème de façon logiciel (ce que font les OS et appareils SD) en répartissant les cycles écritures sur toute la carte, en limitant le nombre d'écriture. Mais si cette échappatoire offre une durée de vie accrue, elle ne permet pas de faire un miracle.

Qu'est ce qui diminue la durée de vie de votre carte SD:

  • L'utilisation de la partition Swap
  • L'utilisation d'un système de fichier journalisé (plus sûr pour stocker des données... mais augmente aussi le nombre de cycle d'écriture pour le stockage d'une même information)
  • L'écriture systématique des Logs sur la carte SD

Voici donc différentes techniques pour rallonger la durée de vie de votre carte SD.

Utiliser un Disque USB

La solution la plus radicale est d'utiliser un disque dur USB sur lequel on transfert la partition RootFs de la carte SD.

 

Après une modification mineure sur la carte SD, cette dernière peut être placée en lecture seule :-)

Plus de problème de cycle d'écriture sur la carte SD.

Dans le cadre de recherche sur l'utilisation de MySql sur Raspberry-Pi, l'article de "Install and run Raspbian from a USB Flash Drive" s'attarde sur l'installation et l'exécution de Raspbian sur un disque Flash externe (parce que la carte SD est vite corrompue pas les opérations d'écriture de MySql). A contrario d'une carte SD, un disque flash dispose de mécanisme permettant de distribuer les écritures sur la mémoire Flash qu'elle utilise.

Désactiver le Swap

Beware, the Swap may kill SD Card!!!

Le Swap, c'est une partition spéciale dans laquelle le système d'exploitation copie des segments de mémoire pour la libérer PUIS l'attribuer à un processus qui en à besoin.

Et bien, dans son article sur Open Silicium, Mr Blaess réalisait un cluster de compilation à base de Raspberry-Pi (que je remercie très chaleureusement dans ce billet) à également détruit ses cartes SD en quelques heures seulement.

La compilation est un processus très gourmand en accès disque mais encore plus en mémoire, tant et si bien que la partition swap était très/trop sollicitée.

Résultat: de très nombreux cycles de lecture/écriture sur le swap... et oui, de la mémoire c'est très volatile et donc sujet à de rapides modifications. Et en conséquence... la mort très rapide de la carte SD.

Désactivez la partition Swap

Préserver la durée de vie de la carte SD est primordial. Il est donc préférable de désactiver la partition Swap. Il vaut mieux ne plus avoir de mémoire que plus de carte SD (et la perte de donnée qui va avec). A moins, bien entendu, d'avoir un vrai disque dur sur lequel déplacer la partition Swap.

sudo apt-get remove dphys-swapfile

Désactiver l'Access Time

Sur les systèmes de fichiers Linux, la date et heure de création, modification et dernier accès sur un fichier est stocké dans le système de fichier.

Cela signifie que le système d'exploitation doit effectuer des opérations d'écritures sur la carte SD pour stocker cette information. Ce n'est pas de chance, nous voulons justement diminuer les opérations d'écriture sur la carte.

Sur les systèmes d'exploitation plus récent, les systèmes de fichiers sont déjà configuré en noatime, si ce n'était pas le cas, il est possible de désactiver l'enregistrement de cette information en éditant le fichier /etc/fstab et en remplacant les occurrences de atime (access time) par noatime (no access time)

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p6  /boot           vfat    defaults          0       2
/dev/mmcblk0p7  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Ram Disk

Certains projets font des lectures de senseurs, lectures destinées au stockage pour être exploité par la suite. C'est le cas de tous les projets Domotiques. Une lecture par minute + stockage = plusieurs écritures par minutes (n'oubliez pas, votre carte SD utilise un système de fichier journalisé).

Dans le cadre du projet Domo de Mr Mommens, il effectuais les écritures périodique sur un RamDisk (système de fichier en mémoire).

Au démarrage, que ce soit avec le traditionnel /etc/init.d ou cela doit être possible avec le nouveau 'system', on crée un petit ramdisk qui sert aux mesures qui se font toutes les secondes, minutes... et de temps en temps on synchronise le contenu sur la carte SD ou via le réseau.

Toutes les écritures périodiques se font donc en mémoire dans le mini ramdisk que l'on monte sur le file system.

    # Create ramdisk 4MB
    mkfs -q /dev/ram1 4096
    [ ! -d /usr/local/domo/ramdisk ] && mkdir /usr/local/domo/ramdisk
    mount /dev/ram1 /usr/local/domo/ramdisk
    [ ! -d /usr/local/domo/ramdisk/log ] && mkdir /usr/local/domo/ramdisk/log
    [ ! -d /usr/local/domo/ramdisk/run ] && mkdir /usr/local/domo/ramdisk/run

A partir de là, on peut imaginer ce que l'on veut.

Désactiver les logs

S'il y a bien une source importante d'opérations d'écriture, ce sont les LOGs du système. A plus forte raison si vous avez installé un serveur Apache (HTTP).

Vous avez toujours la possibilité d'utiliser un RamDisk mais il convient d'être prudent sur la taille du RamDisk et le transfert des logs.

Log Apache

Apache produit son log dans le fichier /var/log/apache2/access.log

Modifier le fichier de configuration /etc/apache2/sites-available/000-default.conf dans lequel nous allons mettre les log d'accès en commentaire.

...
ErrorLog ${APACHE_LOG_DIR}/error.log
### CustomLog ${APACHE_LOG_DIR}/access.log combined

Log CRON

CRON est utilisé pour lancer des tâches récurrentes. CRON maintient également un log... pas forcement pertinent.

Dans le fichier /etc/default/cron

...
EXTRA_OPTS="-L 0"
...

Ne pas oublier de relancer le deamon cron

 service cron restart

Les syslogs

rsyslog (wikipedia.fr) produit également des logs dont on pourrait se passer.

Modifiez le fichier de configuration /etc/rsyslog.conf

et commentez les 4 dernières lignes

#daemon.*;mail.*;\
#       news.err;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       |/dev/xconsole

tmpfs pour les LOGS, Streaming, captures

Si désactiver tous les LOGs est une opération fastidieuse, vous pouvez envisager la création d'un système de fichier temporaire en mémoire tmpfs (doc.ubuntu-fr.org/tmpfs) pour y rediriger la création des logs et fichiers temporaires.

Cette approche sera surtout très intéressantes pour les opérations de streaming et capture d'image (ex: vidéo surveillance) qui crée de nombreux accès en lecture/écriture sur une carte SD alors qu'en maintenir une trace/copie sur la carte SD n'a aucune utilité immédiate.

Ca tombe bien, tmpfs utilise de la RAM et la RAM est capable d'encaisser de nombreux cycles de lecture/écriture.

Les répertoires les plus importants à déplacer sont:

/var/tmp
/var/log
/tmp

Pour déplacer ces répertoires dans la RAM, nous allons éditer le fichier fstab qui s'occupe du montage des systèmes de fichier au démarrage.

Ajoutez 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

Si vous faites un petit serveur d'impression, il serait également utile de déplacer le répertoire spool de CUPS dans tmpfs.

Voyez cet article pour plus d'information raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card qui propose cet configuration

tmpfs   /var/log                tmpfs   size=20M,defaults,noatime,mode=0755 0 0 
tmpfs   /var/cache/apt/archives tmpfs   size=100M,defaults,noexec,nosuid,nodev,mode=0755 0 0
tmpfs   /var/spool/cups         tmpfs   size=100M,defaults,noatime,mode=0755 0 0
tmpfs   /var/spool/cups/tmp     tmpfs   defaults,noatime,mode=0755 0 0

L'on y apprends surtout qu'il est possible de configurer le fonctionnement de tmpfs avec son fichier de configuration /etc/default/tmpfs où il est recommander d'utiliser les options suivantes:

RAMLOCK=yes
RAMSHM=yes
RAMTMP=yes

avec une recommandation des tailles suivantes (toujours dans le fichier de config /etc/defaut/tmpfs

TMPFS_SIZE=10%VM
RUN_SIZE=10M
LOCK_SIZE=5M
SHM_SIZE=10M
TMP_SIZE=25M

Désactiver la journalisation

Une façon de diminuer le nombre de cycle d'écriture est de désactiver la journalisation des opérations. La contrepartie évidente de l'utilisation d'un système non journalisé est que cela peut résulter en perte de donnée lors d'un démontage sauvage du périphérique (eg: perte d'alimentation, blocage kernel, etc).

Il est possible de désactiver la journalisation sur un système de fichier EXT4 (non monté) comme ceci depuis une machine Linux:

Veuillez à remplacer /dev/sdaX par le périphérique correspondant à votre carte SD

tune4fs -O ^has_journal /dev/sdaX
e4fsck –f /dev/sdaX
sudo reboot

source: raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card

Utiliser ZRAM

Si vous avez malgré tout besoin de plus de RAM, il est possible de retarder le moment d'entrer dans les opérations de Swapping sur votre carte SD (ce qui diminuera sa durée de vie).

zRAM (Wikipedia) est une fonctionnalité du noyaux Linux qui offre une sorte de compression de la mémoire Virtuelle. zRAM permet de retarder le paging sur disque (carte SD) en compressant les blocs en RAM. Cette technique semble appropriée pour les PC plus ancien et moins puissant. Pourquoi ne pas l'exploiter sur un Pi.