Публикуван е новият десетти проект LittleFS 2.10, който развива компактна файлова система за вградени устройства и микроконтролери. Първоначално файловата система е създадена от компанията ARM за операционната система Mbed OS, но впоследствие е отделена в самостоятелен проект. Кодът на файловата система е написан на C и се разпространява под лицензия BSD. Еталонната реализация на LittleFS се предлага под формата на C-библиотека, на базата на която е създаден FUSE модул и обвивки за различни програмни езици.
Характеристики на LittleFS:
- Ниски изисквания към ресурсите и поддръжка на работа в условия на ограничен размер на оперативната памет. В реализацията на LittleFS се използват само статично определени буфери (без динамично разпределение на паметта) и не се използват рекурсивни повиквания, благодарение на което размерът на потребяваната оперативна памет и служебните структури на LittleFS на носителя винаги остава постоянен, независимо от това, какво се записва във файловата система и какъв е размерът на хранилището.
- Средства за изравняване на износа на Flash носители, позволяващи минимизиране на повторното използване на блокове и равномерно разпределение на операциите по почистване на блокове в Flash памет, чийто контролер не предоставя решение на тази задача.
- Много висока устойчивост на повреди — файловата система разглежда случайното прекратяване на работа (изключване на захранването) като нормална ситуация и гарантира, че хранилището на диска остава в целостта си по всяко време. За да се избегне нарушаване на целостта и загуба на данни, се прилага механизъм copy-on-write (COW), при който промените не презаписват информацията, а се запазват на ново място.
- Атомарност на извършваните операции, като изтриване и преименуване, дори в случай на загуба на захранване по време на тяхното изпълнение. Промените по файла се записват на диска само след извикване на sync или close. Несъответствията, причинени от операции, които не могат да бъдат извършени атомарно, се решават от специален обработчик deorphan, който преминава през цялото дърво на файловата система след зареждане.
- Поддръжка на POSIX-подобни функции за работа с файлове и директории.
Съдържанието на файловете в LittleFS е представено с 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("") ще доведе до показване на грешка.
Източник: opennet.ru
