La version 2.10 du projet LittleFS a été publiée, développant un système de fichiers compact pour les appareils intégrés et les microcontrôleurs. Initialement, le système de fichiers a été créé par la société ARM pour le système d'exploitation Mbed OS, mais a ensuite été séparé en un projet distinct. Le code du FS est écrit en langage C et est distribué sous licence BSD. La mise en œuvre de référence de LittleFS est fournie sous la forme d'une bibliothèque C, sur laquelle un module FUSE et des liaisons pour divers langages de programmation ont été créés.
Caractéristiques de LittleFS :
- Exigences en ressources faibles et prise en charge du fonctionnement dans des conditions de taille limitée de RAM. Dans la mise en œuvre de LittleFS, seuls des tampons statiquement définis sont utilisés (sans allocation dynamique de mémoire) et les appels récursifs ne sont pas utilisés, ce qui permet de maintenir la taille de la mémoire vive consommée et des structures de service de LittleFS sur le stockage toujours constante, indépendamment de ce qui est enregistré dans le FS et de la taille du stockage.
- Mécanismes d'égalisation de l'usure des supports Flash (wear leveling), permettant de minimiser la réutilisation des blocs et de répartir uniformément les opérations de nettoyage des blocs sur la mémoire Flash, dont le contrôleur ne fournit pas de solution à cette tâche.
- Une très haute résilience aux pannes — le FS considère une interruption aléatoire du fonctionnement (arrêt par coupure de courant) comme une situation normale et garantit que le stockage sur disque est dans un état intact à tout moment. Pour éviter la corruption et la perte de données, un mécanisme de copy-on-write (COW) est utilisé, où les modifications ne réécrivent pas les informations, mais sont enregistrées à un nouvel emplacement.
- Atomicité des opérations telles que la suppression et le renommage, même en cas de coupure de courant pendant leur exécution. Les modifications de fichier ne sont écrites sur le disque qu'après l'appel de sync ou close. Les désaccords causés par des opérations qui ne peuvent pas être effectuées de manière atomique sont résolus par un gestionnaire spécial de dé-orphanage, qui passe par tout l'arbre FS après le chargement.
- Prise en charge des fonctions de type POSIX pour le travail avec des fichiers et des répertoires.
Le contenu des fichiers dans LittleFS est présenté sous forme de listes COW CTZ, assurant un niveau de complexité O(1) lors de l'ajout et O(nlogn) lors de la lecture. L'allocation des blocs se fait par le balayage du système de fichiers à la recherche des blocs utilisés dans une région de taille fixe, stockée sous forme de vecteur de bits. Pour simplifier le scan, tous les répertoires font partie d'une liste chaînée englobant l'ensemble du système de fichiers. En cas d'erreur lors de l'écriture d'un bloc, un nouveau bloc est alloué et les données sont transférées dans celui-ci.
Parmi les changements dans la nouvelle version de LittleFS :
- Le code de parsing des chemins de fichiers a été remodelé, ce qui a permis de rapprocher le comportement du système de fichiers des systèmes POSIX et des attentes des utilisateurs dans des situations telles que la terminaison d'un chemin par un slash, le traitement des chemins vides et la navigation en dehors de la racine du système de fichiers.
- Deux nouveaux exemples de périphériques de blocs ramcrc32bd et ramrsbd ont été ajoutés, mettant en œuvre un mécanisme de correction d'erreurs compatible avec LittleFS. Actuellement, LittleFS ne supporte pas la détection et la correction des erreurs, et ces opérations sont transférées au niveau des périphériques de blocs.
- La fonction lfs_mkdir a été mise à jour pour prendre en charge les slashes de terminaison, c'est-à-dire qu'un appel à lfs_mkdir("a/") ne produit plus d'erreur.
- Dans les fonctions lfs_stat et lfs_getattr, une erreur est maintenant renvoyée lors de l'utilisation de slashes de terminaison si le chemin existant dans le système de fichiers n'est pas un répertoire.
- Une tentative d'ouverture d'un fichier avec un slash de terminaison dans le nom via la fonction lfs_file_open entraînera maintenant l'erreur LFS_ERR_NOTDIR si le fichier n'est pas un répertoire dans le système de fichiers, LFS_ERR_ISDIR si le nom pointe vers un répertoire dans le système de fichiers, et LFS_O_CREAT si le fichier n'existe pas.
- Tenter de dépasser la racine du système de fichiers, par exemple lfs_stat("/../a"), entraînera désormais une erreur.
- Indiquer un chemin vide n'est plus synonyme d'accès à la racine, c'est-à-dire que l'appel à lfs_stat("") produira une erreur.
Source : opennet.ru
