Опубликован выпуск проекта LittleFS 2.10, развивающего компактную файловую систему для встраиваемых устройств и микроконтроллеров. Изначально файловая система была создана компанией ARM для операционной системы Mbed OS, но затем выделена в отдельный проект. Код ФС написан на языке Си и распространяется под лицензией BSD. Эталонная реализация LittleFS поставляется в виде Си-библиотеки, на базе которой создан FUSE-модуль и обвязки для различных языков программирования.
Особенности LittleFS:
- Низкие требования к ресурсам и поддержка работы в условиях ограниченного размера ОЗУ. В реализации LittleFS применяются только статически определённые буферы (без динамического выделения памяти) и не используются рекурсивные вызовы, благодаря чему размер потребляемой оперативной памяти и служебных структур LittleFS на накопителе всегда остаётся постоянным, независимо от того, что записывается в ФС и какого размера хранилище.
- Средства для выравнивания износа Flash-носителей (wear leveling), позволяющие минимизировать повторное использование блоков и равномерно распределить операции очистки блоков на Flash-памяти, контроллер которой не обеспечивает решение данной задачи.
- Очень высокая устойчивость к сбоям – ФС рассматривает случайное прекращение работы (завершение работы через отключение питания) в качестве штатной ситуации и гарантирует нахождение хранилища на диске в целостном состоянии в любой момент времени. Для исключения нарушения целости и потери данных применяется механизм copy-on-write (COW), при котором изменения не перезаписывают информацию, а сохраняются в новое место.
- Атомарность совершения операций, таких как удаление и переименование, даже в случае пропадания питания во время их выполнения. Изменения файла сбрасываются на диск только после вызова sync или close. Рассогласования, вызванные операциями, которые не могут быть выполнены атомарно, решаются специальным обработчиком deorphan, который проходит по всему дереву ФС после загрузки.
- Поддержка POSIX-подобных функций для работы с файлами и каталогами.
Содержимое файлов представлено COW-списками CTZ, обеспечивающими уровень сложности O(1) при добавлении и O(nlogn) при чтении. Выделение блоков осуществляется через сканирование ФС на предмет использованных блоков в области фиксированного размера, хранимой в виде битового вектора. Для упрощения сканирования все каталоги являются частью связанного списка, охватывающего всю файловую систему. Если при записи блока определяется ошибка, то выделяется новый блок и данные переносятся в него.
Среди изменений в новой версии LittleFS:
- Переработан код разбора файловых путей, что позволило приблизить поведение ФС к POSIX-системам и ожиданиям пользователей в таких ситуациях, как завершение пути слэшем, обработка пустых путей и навигация за границу корня ФС.
- Добавлены два новых примера блочных устройств ramcrc32bd и ramrsbd, в которых реализован механизм коррекции ошибок, совместимый с LittleFS. В текущем виде в самой ФС LittleFS отсутствует поддержка определения и коррекции ошибок, и данные операции выносятся на уровень блочных устройств.
- В функцию lfs_mkdir добавлена поддержка завершающих слэшей, т.е. вызов lfs_mkdir(“a/”) теперь не приводит к выводу ошибки.
- В функциях lfs_stat и lfs_getattr теперь выводится ошибка при использовании завершающих слэшей, если существующий в ФС путь не является каталогом.
- Попытка открытия через функцию lfs_file_open файла с завершающим слешем в имени теперь будет приводить к ошибке LFS_ERR_NOTDIR, если файл не является каталогом в ФС, LFS_ERR_ISDIR, если имя ссылается на каталог в ФС, и LFS_O_CREAT, если файл не существует.
- Попытка обращения за границу корневой ФС, например, lfs_stat(“/../a”), теперь будет приводить к выводу ошибки.
- Указание пустого пути теперь не является синонимом обращения к корневому каталогу, т.е. вызов lfs_stat(“”) теперь приведёт к выводу ошибки.