Raspberry Pi / Linux : écrire dans la RAM

Dans un de mes scripts récents, je dois rendre accessibles certaines variables en dehors du script qui les génère. De plus, ces variables sont à vérifier / modifier relativement souvent (toutes les secondes).

Outre les questions de performance liées à l’écriture/lecture d’un grand nombre de données sur le disque, cela provoque également l’usure prématurée de la carte SD du Raspberry Pi, qui est utilisée comme disque dur.

L’astuce est donc d’écrire ces valeurs dans un fichier, mais en RAM (plus exactement, dans une zone de mémoire partagée). Pour rappel, la RAM est la mémoire vive de la machine, celle qui se vide à chaque reboot. Donc attention : les fichiers stockés en RAM seront effacés à chaque redémarrage ! Mais l’accès est bien plus rapide qu’avec un disque dur et on évite d’user la carte SD du Pi.

Trouver une zone de mémoire partagée

Pour vérifier quels points de montage sont en fait des montages RAM sur votre machine, lancez la commande

mount

dans mon cas, la commande renvoit ceci :

/dev/root on / type ext4 (rw,noatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=240424k,nr_inodes=60106,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=49740k,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=99460k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=ascii,shortname=mixed,errors=remount-ro)

Dans cette liste :

  • les points de montage de type tmpfs sont des points de montage temporaires
  • les points de montage dont le nom contient « shm » (shared memory) sont des points de montage de mémoire partagée.

Dans mon cas, je peux donc écrire mes données dans /run/shm, ces données seront en fait sauvegardées en mémoire partagée, jusqu’à extinction de la machine.

Utiliser la mémoire partagée

Vous pouvez donc utiliser votre dossier mémoire partagée pour écrire tout ce que vous voulez, sans faire intervenir le disque dur. Par exemple :

cp -af test.txt /run/shm/

Et voila, votre fichier est stocké en RAM :

raspberrypi:/# ls -la /dev/shm/
total 316
drwxrwxrwt 18 root root    380 2008-11-27 16:06 .
drwxr-xr-x 12 root root   3780 2008-11-27 15:33 ..
-rw-r--r--  1 root root 311636 2003-04-02 20:00 test.txt

Redimensionner la zone de mémoire partagée

Par défaut la taille de la mémoire partagée est de la moitié de la mémoire système. Vous pouvez vérifier cette taille avec la commande

df -h /run/shm

(remplacez bien « /run/shm » par votre propre dossier mémoire partagée, trouvé juste avant)

Donc en résumé, si vous avez 512MB de RAM, vous aurez 256MB de mémoire partagée accessible.

Si vous voulez ajuster la quantité de mémoire partagée disponible, vous pouvez redimensionner votre point de montage. Par exemple :

mount -o remount,size=128M /run/shm

va changer la taille de la mémoire partagée et la réduire à 128MO.

Attention : plus vous augmentez la taille de la mémoire partagée, et moins il y aura de mémoire disponible pour le système. Si vous l’augmentez trop, des résultats assez inattendus peuvent apparaitre…

Exemple pratique

Imaginons que vous voulez stocker les fichiers mis en cache par un site web dans la mémoire partagée, pour économiser votre disque dur, par exemple.

  • Le site en question est www.example.com/
  • On veut que le cache créé par ce site soit stocké en mémoire partagée, dans /var/www/www.example.com/cache

On commence par créer le dossier cache :

mkdir -p /var/www/www.example.com/cache

Si besoin, vous pouvez changer les permissions du dossier comme ceci :

chown user:group /var/www/www.example.com/cache

(remplacez les valeurs user et group par l’utilisateur et le groupe qui devront avoir accès à ce dossier)

Maintenant, on monte notre dossier en tant que zone à mémoire partagée, avec une taille de 100MB et des permission 755 :

mount -t tmpfs -o size=100M,mode=0755 tmpfs /var/www/www.example.com/cache

On vérifie avec « mount » :

tmpfs on /var/www/www.example.com/cache type tmpfs (rw,size=100M,mode=0755)

C’est tout, le cache de www.example.com est maintenant stocké en mémoire partagée, et sera donc effacé au reboot.

Monter la zone de mémoire partagée au reboot

Si vous voulez avoir votre zone de mémoire partagée disponible à chaque reboot, modifiez le fichier « /etc/fstab » :

nano /etc/fstab

et rajoutez ceci au fichier :

[...]
tmpfs /var/www/www.example.com/cache tmpfs size=100M,mode=0755 0 0
[...]

About Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

4 thoughts on “Raspberry Pi / Linux : écrire dans la RAM

  1. Fred
    05/11/2013 at 11 h 29 min

    Moi qui me demandais comment faire pour stocker en temps réel les données téléinfo qui arrivent de mon compteur EDF sans flinguer ma carte SD, tu viens de me donner la réponse 🙂

    1. 05/11/2013 at 16 h 35 min

      Oooh ! un compteur EDF, ça a l’air bien intéressant ça !
      Si tu as envie de partager ton projet, on le met à la une sur HWL !

  2. DALIL
    27/03/2014 at 11 h 12 min

    Merci beaucoup pour ces explications très utiles. Bon travail, continue …

Laisser un commentaire