|
TARFS 0.1.5
Read-only TAR filesystem for ESP32
|
TARFS - это read-only файловая система для семейства процессоров ESP32, основанная на формате TAR-архивов. TARFS позволяет использовать обычный .tar файл как файловую систему без распаковки - .tar файл записывается в раздел flash также, как туда записывается файловая система FAT/SPIFFS/LittleFS , созданная при помощи соответсвубщих утилит.
Файлы внутри файловой системы, после монтирования будут доступны через POSIX функции (open()/fopen(), read()/fread(), mmap(), opendir() и т.д.).
TAR - это последовательный архивный формат с простой структурой хранения данных, не использущющий централизованные таблицы размещения или структуры метаданных. Заголовок каждого файла содержит полный путь к нему, благодаря чему каждая запись архива является самодостаточной и может быть обнаружена независимо от остальных:
Повреждение записи каталога или метаданных не влияет на доступ к другим файлам, поскольку иерархия каталогов восстанавливается по полным путям файлов, а не по явным связям между родительскими и дочерними каталогами.
TAR-архивы могут создаваться и обрабатываться стандартными утилитами, что избавляет от необходимости использовать специализированные генераторы образов или утилиты конвертации.
Кроме того, все заголовки TAR выровнены по границе 512 байт, что упрощает анализ поврежденных архивов и позволяет находить записи файлов путем последовательного сканирования образа в поисках корректных заголовков TAR.
Для тестовой файловой системы из 620 файлов и 20 каталогов, общим размером 12 мегабайт результаты тестирования оказались следующими:
| File system | read()¹ | open() | opendir() | readdir() | mount time |
|---|---|---|---|---|---|
| TarFS | **26 MiB/s**¹ | 21..92 µs² | 27..102µs² | 49 µs³ | 66 ms |
| LittleFS | ~2.24 MiB/s | 5740 µs | 3182 µs | 1688 µs | 1600 ms |
¹ Скорость измерялась при чтении файла размером 4 МБ блоками по 1 КБ в плотном цикле.
² Меньшие значения получены при размещении индекса файлов в DRAM. Большие значения - при размещении индекса в PSRAM. При повторном вызове open() для PSRAM скорость становится такой же, как при работе без PSRAM.
³ Время не зависит от того, находится индекс в DRAM или PSRAM: opendir() "прогревает" кэш, поэтому последующие вызовы readdir() работают уже из кеша.
После этого все ваши файлы будут доступны через TARFS.
Запустите утилиту tarsum:
Затем включите проверку целостности, раскомментировав следующую строку в src/config.h:
Если CONFIG_TARFS_INTEGRITY отключен, встроенные контрольные суммы CRC64 будут проигнорированы при монтировании.
Утилита tarsum может быть собрана в Linux и Windows (Cygwin) с помощью команды make, выполненной в каталоге tarsum.
Да, будет.
Tarsum обнаруживает уже существующие записи CRC64 и обновляет их вместо создания дубликатов.
Да.
Откройте архив в текстовом или hex-редакторе и выполните поиск ASCII-строки "C64". TAR-архив, обработанный утилитой tarsum, будет содержать несколько таких сигнатур C64.
Примечание: Сигнатура C64 предназначена только для диагностических целей. TARFS игнорирует её при монтировании и всегда использует встроенное поле CRC64, если включена опция CONFIG_TARFS_INTEGRITY.
На Windows:
На Linux
Замените:
partitions.csv - это описание расположения разделов Flash ESP32.
В нем указано:
ESP-IDF использует этот файл для создания бинарной таблицы разделов. (Espressif Documentation) Пример файла находится в examples/tarfs/partitions.csv
Положите partitions.csv рядом с вашим .ino файлом:
Arduino ESP32 framework автоматически использует этот файл при сборке. (Поддержка пользовательских CSV-разделов основана на механизме таблиц разделов ESP-IDF.) (Espressif Documentation)
Обычно файл находится в корне проекта:
В menuconfig нужно выбрать:
и указать имя файла. (Espressif Documentation)
Нет.
TARFS работает непосредственно с TAR-архивом.
Да.
Создание архива:
Просмотр содержимого:
Извлечение:
Нет.
Отредактируйте файл src/config.h библиотеки tarsf, расскоментируйте строку #define CONFIG_TARFS_LOG 1, пересоберите свой проект. Теперь в терминал будут попадать отладочные сообщения, по которым можно попытаться определить причину неудач
TARFS использует небольшой индекс файлов.
Размер зависит от количества файлов.
Например:
Дополнительная синхронизация не нужна - в файловой системе все уже сделано: C11 Atomics и reference counters.
Да. TARFS написан на стандартном C11, не использует специфичных для GCC расширений языка и компилируется без изменений в окружении Cygwin.
Для портирования TARFS на другую архитектуру необходимо реализовать файл os_<arch>.c. В качестве примеров предоставлены реализации для ESP32 и STM32 — os_esp32.c и os_stm32.c. Реализация для STM32 приведена главным образом для иллюстрации принципа портирования.
Основная функция, которую необходимо реализовать, — tarfs_os_map_tarfile(). Эта функция должна возвращать адрес, по которому располагается TAR-архив. Кроме того, она может выполнять отображение адресного пространства Flash в RAM, как это реализовано в os_esp32.c.
Такая абстракция позволяет TARFS работать с TAR-архивами независимо от того, где физически хранятся исходные данные.