# Cramfs

cramfs (compressed ROM/RAM File System) est un système de fichiers compressé en lecture seule conçu pour être utilisé avec le noyau Linux. Il a été conçu pour être simple et tenir le moins de place possible. Il est principalement utilisé dans l'informatique embarquée.
Contrairement à une archive compressée dans un système de fichiers conventionnel, il n'y a pas besoin de décompresser l’image avant de pouvoir accéder à son contenu : celle-ci peut être directement montée dans un système Linux.

## Historique

cramfs fut utilisé en tant qu’initrd par le noyau Linux, et donc par extension dans des distributions Linux comme Debian 3.1 ou encore SuSE Linux. Lors de la sortie de Linux 2.5.46, l'initrd (pouvant être au format cramfs) fut mis de côté pour privilégier le format initramfs, c'est-à-dire sous forme d'archive cpio compressée$^,$.
En 2013, les mainteneurs du noyau Linux ont indiqué que cramfs avait été rendu obsolète par SquashFS, mais ce système de fichiers a été réintroduit en 2017 pour les systèmes possédant trop peu de mémoire vive pour pouvoir se permettre d’utiliser SquashFS.

## Fonctionnement

Une image cramfs peut être construite à l’aide des utilitaires mkfs.cramfs (voir util-linux) ou mkcramfs. Elle peut ensuite être montée dans un système Linux par la commande mount -t cramfs. Il est possible de décompresser une image cramfs en espace utilisateur à l’aide d’un programme comme 7-Zip, mais cela n’est pas le but premier de ce format d’image.
Le contenu des fichiers dans une image cramfs sont compressés à l'aide de zlib (voir RFC 1950), page par page, afin de permettre des lectures aléatoires. Les métadonnées des fichiers et dossiers ne sont pas compressées, mais sont représentées de manière succinctes afin d’utiliser moins de place qu’un système de fichiers conventionnel ; cela entraîne certaines limitations.

### Limitations générales

La taille des fichiers est limitée à 16 Mio, tandis que la taille du système de fichiers est limitée à 256 Mio. Il est cependant possible d’arriver à un peu plus de 256 Mio étant donné que le dernier fichier peut dépasser cette limite totale, dans la limite de sa taille maximale de 16 Mio. Cela donne une taille théorique maximale d’un peu moins de 272 Mio.
Il n'y a pas de répertoire . ou .., qui sont normalement des liens physiques vers respectivement le dossier lui-même et son dossier parent. Les liens physiques sont supportés, mais le compteur de liens sera toujours à 1. Cela implique que l’option -noleaf de la commande find n’est pas nécessaire.
La représentation très succincte des métadonnées fait qu’aucune information d’horodatage n’est présente dans une image cramfs, qui prend alors la valeur par défaut de l’epoch. L'identifiant de groupe (GID) est lui tronqué : seuls les 8 bits de poids faibles sont conservés, ce qui peut poser des problèmes de sécurité.

### Limitations du noyau Linux

Une image cramfs ne pourra être lue que si son boutisme correspond à celui du noyau utilisé. Par exemple, une image cramfs big-endian ne pourra pas être montée sur par un noyau Linux s’exécutant sur une architecture little-endian. L’utilitaire cramfsswap permet cependant de convertir une image cramfs d’un boutisme vers l’autre.
Elle ne pourra être également lue que si sa taille de bloc correspond à la taille de page mémoire (en) du noyau Linux utilisé. Sur de nombreuses architectures comme X86, cette taille est fixée à 4 kio, mais elle peut varier.