Qu’est ce qu’un ramdrive?

Un ramdrive est un espace de stockage qui utilise la RAM (mémoire vive) au lieu du disque dur, SSD, mémoire flash ou autre moyen habituel de stockage. La RAM est plus rapide que tous ces supports, mais en cas de coupure de courant ou si on éteint l’ordinateur, les données sont perdues. Donc, à quoi ça sert, un stockage qui oublie à chaque reboot?

Pourquoi utiliser un ramdrive?

La réponse évidente, c’est la vitesse : si vous avez besoin d’accès ultrarapides, ça peut être une solution. Une seconde réponse intéressera les utilisateurs de raspberry pis : éviter d’user la carte SD du système. La mémoire flash s’use à chaque écriture (c’est simplifié, mais c’est l’idée). Un SSD aura des techniques pour répartir l’usure équitablement et donc ça ne rentrera pas réellement en compte. Mais pour une carte SD, il n’y a pas ces algorithmes avancés. Donc quand on écrit tout le temps au même endroit, on finira par “user” la carte, et elle aura des secteurs défectueux. C’est ici qu’intervient le ramdrive. Pour de nombreux projets à base de Raspberry pi, nous utilisons des capteurs, et nous souhaitons stocker les valeurs des capteurs. Du coup, si à chaque mesure on écrit sur la carte SD, elle lâchera bien vite, d’autant plus vite qu’on écrit souvent, par exemple chaque seconde. Dans ce contexte, je vous propose de créer un ramdrive pour pouvoir écrire dessus en continu, sans se soucier de l’usure, et de copier de temps en temps les données vers la carte SD. En stockant les mesures chaque seconde sur le ramdrive, puis en copiant les données toutes les heures, on écrira 3600 fois moins souvent sur la carte SD!

Voyons maintenant comment réaliser cela.

Comment créer un ramdrive

Les instructions suivantes sont valables sous linux, pas que sous raspbian. Le tutoriel est orienté vers les Raspberry pi, mais ça reste valable pour tous les systèmes Linux (et sans doute énormément d’Unix, et donc, oui, sous MacOS ça devrait aussi fonctionner 🙂 ).

Créer temporairement le ramdrive

Tout d’abord, il faut créer un répertoire qui servira de point de montage. C’est à dire que c’est l’endroit sur le système de fichier ou sera situé le ramdrive. Généralement, sous Linux, les disques sont montés dans le dossier /mnt. Puisque c’est un ramdrive, nous irons dans /mnt/ramdrive.

Pour créer ce répertoire, on utilisera la commande mkdir, en sudo, car l’utilisateur par défaut ne possède pas les droits :

sudo mkdir /mnt/ramdrive

Ce répertoire ayant été créé par root, il faut changer le propriétaire pour que l’utilisateur pi puisse écrire dedans, avec la commande chown :

sudo chown pi /mnt/ramdrive

Ici, nous donnons la propriété du répertoire /mnt/ramdrive à l’utilisateur pi. Ce n’est pas nécessaire pour le fonctionnement du ramdrive à proprement parler, mais si je souhaite qu’un programme lancé en tant qu’utilisateur (pi) puisse écrire dans ce répertoire, c’est une solution. Une autre serait de faire un chmod.

Il faut maintenant monter le ramdrive, en utilisant la commande mount :

sudo mount -t tmpfs -o size=8m tmpfs /mnt/ramdrive

Ici, je monte un système de fichier de type tmpfs, d’une taille de 8Mio dans le répertoire /mnt/ramdrive. Vous pouvez bien sur ajuster ces paramètres à votre convenance. La taille du système de fichier est importante, car la ram du Raspberry pi (ou de l’ordinateur utilisé) n’est pas infinie, et une valeur trop importante aura un impact sur les performances de la machine.

Créer le ramdrive de façon persistante (il sera recréé automatiquement au démarrage)

Si l’on souhaite profiter systématiquement de la présence du ramdrive au démarrage du système, sans avoir à lancer de commande supplémentaire, il suffit de modifier le fichier fstab de façon appropriée, pour que le ramdrive soit automatiquement monté au démarrage. Les données non sauvegardées seront toujours perdues, mais le ramdrive sera créé à chaque fois.

Pour cela, nous devons modifier le fichier fstab, par exemple avec vi ou nano, pour y ajouter la ligne suivante :

tmpfs /mnt/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=8M 0 0

Ainsi, à chaque démarrage, nous aurons accès à notre ramdrive.

On pourra alors écrire sur le ramdrive sans problème, sans usure du système, et sans avoir à le créer au préalable.

Conclusions et ressources

En pratique, c’est quelque chose de simple à faire, et qui peut s’avérer utile. Toutefois, il convient de bien prendre en compte le fait que le contenu du ramdrive est perdu à chaque redémarrage du système. Il faut donc sauvegarder périodiquement les données que l’on souhaite conserver sur la mémoire persistante.

Je m’en sers pour mon projet Rlieh, un contrôleur d’aquarium automatisé. Celui ci mesure la température de plusieurs cuves, et la température de l’air, chaque seconde. Je peux donc faire des statistiques détaillées, mais je ne sauvegarde pas tout cela en continu. Chaque seconde, j’écris sur le ramdrive avec le programme qui récupère les données des capteurs, de sorte que d’autres programmes puissent s’en servir. Ainsi, il est facile de rendre les données accessibles pour un  serveur web, ou n’importe quel programme. Je n’archive qu’une partie des données (la température varie relativement peu, et change lentement, donc quelques mesures par heure suffisent; cependant je peux faire toutes sortes de statistiques sur les données completes tant qu’elles sont en mémoire, avant de les vider après X jours.), et donc je minimise encore l’usure de la carte.

Pour la gestion de l’écriture de sauvegarde, il est possible de faire un cron, ou encore de créer un demon unix qui se chargera de cette tâche, comme nous l’avons détaillé dans ce précédent tutoriel sur le wiki.

On peut également créer un partage samba pour pouvoir accéder au ramdrive depuis le réseau, comme détaillé dans notre tutoriel sur ce sujet.

Ce n’est qu’un exemple d’application parmi d’autres, mais c’est une corde à avoir à son arc!

Pour aller plus loin, vous pouvez consulter cet article en anglais sur le même sujet, ou encore celui ci qui explique la différence entre les systèmes tmpfs et ramfs (wikipedia FR : tmpfs, ramfs)

Réseaux sociaux