Tmpfs, ramfs, ramdisk et cie

Un article paru dernièrement sur Linux.com (ramlog) m’a interpellé, il s’agissait d’utiliser le logiciel ramlog pour améliorer les performances et surtout la durée de la batterie ainsi que celle des disques flash (par exemple celui de l’eeepc).

Le principe de fonctionnement est relativement simple (mais fallait y penser :)), le script se lance au démarrage, et à la suite de menus vérifications, copie le contenu du répertoire /var/log dans /var/log.hdd, monte un répertoire en mémoire dans /var/log. A l’arrêt du programme, l’opération inverse est effectuée.

Le répertoire /var/log est monté en mémoire en utilisant un ramdisk, je connaissais vaguement le principe, surtout pour l’ancien initrd; pour les noyaux 2.6, c’est initramfs qui est utilisé, lequel utilise ramfs, et enfin celui que j’utilise notamment pour le répertoire /tmp, tmpfs.

Sous Archlinux, les fichiers spéciaux /dev/ram* ne sont pas disponibles par défaut, si vous êtes intéressés par les avoir, il suffit de charger le module brd.

Bref, tout ça, c’est bien beau, mais, quelle est la différence entre ramdisk, ramfs et tmpfs…
Eh bien, en fait, elle n’est pas si anodine que ça.

ramdisk

C’est le premier des trois à être intégré dans le noyau, il permet de simuler un périphérique bloc dans une partie de la mémoire.
Sa configuration (en dehors de son activation) se fait au travers des options du noyau:
CONFIG_BLK_DEV_RAM_COUNT: nombre maximum de ramdisk possible.
CONFIG_BLK_DEV_RAM_SIZE: taille maximum du ramdisk.

Il est nécessaire pour l’utiliser d’y créer un système de fichier avant de le monter:

dd if=/dev/zero of=/dev/ram0 bs=1k count=2048
mke2fs /dev/ram0 2048
mount /dev/ram0 disk

L’inconvénient est que du fait que le ramdisk crée un périphérique bloc en mémoire, le système le gère de la même manière qu’un disque dans le sens ou on aura un endroit dans la ram qui contiendra l’image du périphérique + le cache comme n’importe quel disque dur, ce qui implique plus d’utilisation de la ram que la simple taille du ramdisk. De même la limite en taille et en nombre limite les possibilités.

ramfs

Utilisé notamment pour l’initramfs (successeur du initrd), avec cette implémentation, on passe de la simulation d’un périphérique à celle d’un système de fichier, ce qui a pour avantage entre autre d’utiliser moins de mémoire.
ramfs est intégré par défaut dans tous les noyaux 2.6, l’utilisation est simple:

mount -t ramfs none disk

Vous remarquerez que le répertoire monté n’a pas d’information sur la taille dans la sortie de la commande

df -a

C’est tout simplement parce qu’on ne peut pas définir de taille pour un disque monté en ramfs, ce dernier peut utiliser la totalité de la ram, ceci couplé avec le fait que ce que contient le disque ramfs ne peut être vidé de la ram (dans le swap) constitue l’inconvénient de cette implémentation (la ram peut être saturé en cas de mauvaise utilisation).

tmpfs

Dernier des trois, il rajoute entre autre la gestion du swap et la possibilité de limiter la taille par rapport à ramfs.

Si on ne spécifie pas la taille, elle est égale par défaut à la moitié de la mémoire.

mount -t tmpfs none disk -o size=100m

Les permissions par défaut du répertoire monté sont 1777 (pareil que /tmp), vous pouvez les modifier soit avec la commande mount (avant de le monter avec l’option « mode ») ou tout simplement avec la commande « chmod ».

Utilisation

En fin de compte, je crois qu’il est préférable d’utiliser tmpfs plutôt que les autres au vu des avantages qu’il peut apporter et surtout de la limitation du risque du à une mauvaise utilisation.

Pour ce qui est des exemples, on peut l’utiliser pour à peu près ce qu’on veut, en gardant à l’esprit que de par sa nature, tout ce qui est écrit dans une partition tmpfs est volatile, en cas de crash, tout est perdu.

Commentaires (2)