|
TARFS 0.1.5
Read-only TAR filesystem for ESP32
|
TARFS хранит файловую систему в виде обычного архива POSIX TAR. Никаких специальных утилит для создания образов не требуется — достаточно стандартной GNU tar, с помощью которой можно создавать, изменять и распаковывать образы TARFS.
На своей хост-машине создайте каталог, который станет корнем файловой системы. Его имя одновременно станет точкой монтирования.
Например: mkdir tarfs или в Windows средствами Проводника Windows
Скопируйте в этот каталог нужные файлы, подкаталоги, символические ссылки, жёсткие ссылки или (в Windows) - directory junctions.
Примечание
Будьте осторожны при создании символических ссылок с длинными именами в UTF-8. В зависимости от локали системы утилита tar может заменить не-ASCII символы на ??? внутри архива. Это ограничение самой программы-архиватора, а не TARFS.
Пример структуры файловой системы:
Выполните команду:
Она создаст архив tarfile.tar из каталога tarfs.
В ESP32 файловая система TARFS хранится в отдельном разделе Flash-памяти.
Для этого необходимо добавить соответствующий раздел в файл partitions.csv, после чего записать TAR-архив в этот раздел с помощью esptool.py. Если вы пользуетесь средой Arduino IDE, то файл partitions.csv должен находиться в каталоге вашего проекта, вместе с исходным кодом:

В настройках же IDE следует указать раскладку флеша - custom

Создайте файл partitions.csv в каталоге вашего скетча. Добавьте в partitions.csv раздел типа data.
Пример для 16MiB флеш, под файловую систему отдано примерно 13 мегабайт:
Поля имеют следующее назначение:
| Поле | Описание |
|---|---|
| Name | Имя раздела. Используется при монтировании файловой системы. |
| Type | Должно быть data. |
| SubType | Любое значение для разделов типа data. Рекомендуется использовать 0xF0. |
| Offset | Адрес раздела во Flash-памяти. |
| Size | Максимальный размер TAR-архива. |
Размер раздела должен быть не меньше размера создаваемого TAR-архива.
А в Linux -
Не забудьте заменить:
Теперь пишите свой скетч: Не забудьте добавить #include "tarfs.h" в исходный код своего .ino файла, а в функции setup() вызовете tarfs_init() и tarfs_mount() так же, как это делается в скетче-примере examples/tarfs/tarfs.ino
Если вы дочитали до этой строчки, значит шансы на успех весьма велики.
Точка монтирования определяется автоматически по содержимому архива, но может быть так же задана вручную. ВНИМАНИЕ: если файловая система окажется повреждена, то автоматическое определение точки монтирования может не работать, поэтому, всегда следует указывать точку монтирования вручную, по крайней мере на "боевом" устройстве.
Для корректного автоопределения точки монтирования всегда создавайте корневой каталог (как описано в шаге 1), а затем размещайте внутри него всё содержимое файловой системы - имя этого каталога и станет точкой монтирования. В случае, если такая логика работы не подъодит, точка монтирования может быть переопределена при вызове функции tarfs_mount().
TARFS поддерживает необязательную проверку целостности файловой системы, полностью сохраняя совместимость со стандартными TAR-архивами.
По умолчанию защищаются только заголовки TAR (метаданные inode). Каждый заголовок содержит стандартную контрольную сумму TAR, благодаря чему TARFS может обнаружить повреждение метаданных во время монтирования без каких-либо собственных расширений формата.
Если требуется более надёжная проверка, можно воспользоваться утилитой tarsum:
Как ее скомпилировать (она компилируется под Linux и Cygwin) Написано в README.md.
Она записывает дополнительный 8-байтный хеш в неиспользуемую область заполнения каждого TAR-заголовка. Хеш вычисляется на основе CRC64/ECMA182 и полностью незаметен для обычных TAR-утилит, поскольку эти байты игнорируются форматом TAR.
При монтировании архива, обработанного tarsum, TARFS автоматически обнаруживает встроенные хеши и проверяет целостность файловой системы. Эту проверку можно отключить, если важнее минимальное время монтирования.
ВАЖНО! Не забудьте раскомментировать #define CONFIG_TARFS_INTEGRITY 1 в src/config.h, после того, как вы прошьете ваш архив с CRC64 во флешку. Если не раскомментировать, то проверка целостности выполнятся не будет.
ВАЖНО! Если включена опция проверки целостности CONFIG_TARFS_INTEGRITY, то Tarfs ожидает файловую систему с контрольными суммами. Отсутствие контрольных сумм будет интерпретировано как битые данные.
В зависимости от платформы и версии tar архив может содержать абсолютные пути или абсолютные адреса символических ссылок.
Например, вместо:
в архив может попасть:
В этом случае TARFS воспримет каталог /home как корень файловой системы вместо tarfs.
Похожая ситуация возможна и в Windows (особенно при использовании Cygwin), где символические ссылки могут выглядеть так:
вместо:
Для решения этой проблемы TARFS предоставляет необязательный параметр монтирования:
Он задаёт префикс пути, который будет отрезан при монтировании файловой системы.
Например,
преобразует
в
Например, в журнале могут появиться сообщения о невозможности нормализации символической ссылки (floating link) с путём вида:
Обычно это означает, что необходимо скорректировать параметр link_rebase, передаваемый в tarfs_mount(). Например, если задать:
то абсолютный префикс пути будет удалён, и внутри архива останутся только корректные относительные пути.