Файловая система

Файловая система

Поддерживаемые файловые системы

Файловая система ROM (ROMFS):

ROMFS — это файловая система, разработанная командой Lua RTOS (Whitecat) с нуля, в которой все данные хранятся вместе с прошивкой Lua RTOS.

Хотя вы можете использовать другие универсальные файловые системы, такие как SPIFFS или LFS (и монтировать их как доступные только для чтения), использование ROMFS имеет следующие преимущества:

  • Нет потерь пространства, так как в ROMFS каждый файл состоит из одного блока данных, размер которого равен размеру содержимого файла.
  • Так как файловая система создается и связывается вместе с прошивкой, ее можно обновить через OTA (Over-The-Air).
  • Маленький объем и минимальное использование оперативной памяти (обычно 1К на открытый файл).
  • Прошивки ESP32, основанные на Lua RTOS и скриптах Lua, развертываются так же, как прошивки, полностью написанные на C.

Файловая система RAM (RAMFS):

RAMFS — это файловая система, разработанная командой Lua RTOS с нуля, в которой все данные хранятся в ОЗУ без сохранения. Это означает, что все данные, хранящиеся в файловой системе, теряются при каждой перезагрузке. Она особенно полезна для хранения файла истории консоли, который содержит команды, введенные программистом в системной консоли. Программист может получить доступ к ранее введенным командам с помощью клавиш вверх и вниз.

-- Mount the RAM FS on /rfs
fs.mount("/rfs","ramfs")

-- Enable history
os.histrory(true)

Файловая система Little (LFS):

LFS — это файловая система, разработанная для работы с ограниченным количеством памяти и для систем, которые могут испытывать случайные сбои питания. Также реализует динамическое выравнивание износа, чтобы продлить срок службы основного хранилища.

Файловая система Spiffs (SPIFFS):

SPIFFS — это файловая система, разработанная для работы на встроенных системах с использованием небольшого количества ОЗУ. Также реализует статическое выравнивание износа, чтобы продлить срок службы основного хранилища.

Файловая система FAT (FAT):

FAT — это устаревшая файловая система, простая и надежная, широко используемая в большом диапазоне устройств.

В Lua RTOS поддерживаемые файловые системы имеют следующие характеристики:

  • Соответствие стандарту POSIX
  • Поддержка многопоточности
  • Поддержка файлов и директорий (даже в случае SPIFFS, где директории эмулируются)

Логическая файловая система и точки монтирования

В Lua RTOS каждая файловая система монтируется в каталог (точку монтирования) внутри логической файловой системы. Точка монтирования физически связана с файловой системой.

При загрузке RTOS автоматически монтирует корневую файловую систему в корневой каталог ("/"), а также пытается подмонтировать файловую систему /romfs (если она есть в сборке) с предустановленными библиотеками и другим ПО.

Вторичные файловые системы могут быть примонтированы позже, в стартовом скрипте или в пользовательском приложении. Типичная конфигурация может выглядеть так:

Точка маонт. Связана с Хранилище Заметка
/ LFS SPI FLASH Root file system
/sd FAT SDCard
/ram RAMFS RAM
/spilfs LFS SPI FLASH Внешняя

Точка монтирования должна быть подкаталогом корневого каталога, поэтому /sd и /ram являются допустимыми точками монтирования, но /other/sd и /other/ram - недопустимы.

Любая примонтированная файловая система может быть размонтирована в любое время. Когда файловая система размонтируется, все ожидающие изменения записываются на носитель данных, а затем освобождаются все используемые ресурсы.

Для монтирования файловой системы используйте функцию Lua fs.mount(target, file system):

  • target (цель): это точка монтирования.

  • file system (файловая система): это файловая система для монтирования в точке монтирования, которая может быть либо romfs, ramfs, lfs, spiffs или fat.

    -- Mount a SD card (FAT file system) on /sd
    fs.mount("sd", "fat")

Пути

В Lua RTOS некоторые системные вызовы имеют параметр в виде одного или нескольких путей. Когда используется один из этих системных вызовов, Lua RTOS начинает процесс разрешения пути. Процесс разрешения пути работает следующим образом:

  • Если путь начинается с символа “/” (абсолютный путь), начальным каталогом для поиска является корневой каталог, который одинаков для всех потоков.

  • Если путь не начинается с символа “/” (относительный путь), начальным каталогом для поиска является текущий рабочий каталог, который также одинаков для всех потоков.

  • Для каждого нефинального компонента пути, где компонент - это подстрока, ограниченная символом ‘/’, выполняется следующее:

    • Если компонент равен “.” (текущий каталог), каталог поиска остается неизменным, и процесс переходит к следующему компоненту.
    • Если компонент равен “..” (предыдущий каталог), каталог поиска устанавливается на предыдущий компонент, и процесс переходит к следующему компоненту.
    • Если компонент не найден, возвращается ошибка ENOENT.
    • Если компонент найден, но не является каталогом, возвращается ошибка ENOTDIR.
    • Если компонент найден и является каталогом, текущий каталог поиска устанавливается на этот каталог, и процесс переходит к следующему компоненту.
    • Если компонент является точкой монтирования, текущий каталог поиска устанавливается на корневой каталог связанной файловой системы.
  • Для финального компонента пути:

    • Если компонент равен “.” (текущий каталог), каталог поиска остается неизменным.
    • Если компонент равен “..” (предыдущий каталог), каталог поиска устанавливается на предыдущий компонент.
    • Если компонент не найден, возвращается ошибка ENOENT.

Функции просмотра

os.partitions()

Перечислить доступные на устройстве разделы.

Аргументы: нет

Возвращает: доступные разделы, типы разделов, названия, закодированные состояния, начальные адреса и длины в байтах.

/ > os.partitions()
TYPE:SUB	 ADDRESS	  LENGTH	ENC	LABEL
0x00:0x10	  655360	 1769472	N	ota_0 < boot < running
0x00:0x11	 2424832	 1769472	N	ota_1
0x01:0x02	   36864	   24576	N	nvs
0x01:0x40	   61440	  524288	N	storage
0x01:0x01	  585728	    4096	N	phy_init
0x01:0x00	  589824	    8192	N	otadata
/ > 

Функции форматирования

os.format(filesystem)

Отформатировать файловую систему. Поскольку в процессе форматирования все данные удаляются, функция запрашивает подтверждение.

Аргументы:

  • file system (файловая система): строка, идентифицирующая файловую систему. Может быть spiffs, spilfs или fat.

Возвращает: ничего или исключение.

/ > os.format("fat")
All data in fat will be deleted. Continue? [y/n]: y
Formatting...
Initializing FAT area: 4% completed

File and directory management functions

os.cat(filename)

Показать содержимое текстового файла на экране.

Аргументы:

  • filename: путь к файлу для отображения. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего или ошибку.

os.cd(path)

Изменить текущую рабочую директорию.

Аргументы:

path: путь к директории. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего.

/> os.cd("/examples")
/examples >

os.edit(file)

Редактирует файл.

Аргументы:

  • file: путь к файлу. Может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего.

/> os.edit("autorun.lua")

os.ls([path])

Список содержимого пути. Ограниченная поддержка шаблонов (wildcards).

Аргументы:

  • path: путь к директории. Этот аргумент необязателен, и если он не предоставлен, отображается содержимое текущей директории. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего.

/> os.ls("/")
d              -        tmp
d              -        www
d              -        conf
d              -        log
d              -        lib
f             27        test1.lua
f            956        autorun.lua
f           1871        lcd.lua
/examples/lua > os.ls("/*.lua")
f	    2407	                        	config.lua
f	    1034	                        	autorun.lua
f	    2446	                        	system.lua
f	    1105	                        	settings.lua
/examples/lua > 

Содержимое директории отображается на экране в столбцах (разделенных табуляцией):

  • первый столбец: тип записи (d = директория / f = файл)
  • второй столбец: размер записи в байтах
  • третий столбец: название записи

os.mkdir(path)

Создать директорию.

Аргументы:

  • путь к директории. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: true, если операция выполнена успешно.

-- Make a new directory named test into the current working directory

os.mkdir("test")
true

os.more(filename)

Показать содержимое текстового файла по одному экрану за раз. Содержимое отображается постранично, один экран за раз.

Аргументы:

  • filename: путь к файлу для отображения. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего или ошибку.

os.pwd()

Получить текущую рабочую директорию.

Аргументы: нет

Возвращает: текущую директорию

/examples > os.pwd()
/examples

os.remove(path)

Удалить файл или директорию. Ограниченная поддержка шаблонов (wildcards).

Аргументы:

  • path: путь к файлу или директории для удаления. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего или ошибку.

/examples/lua > os.remove("*.bak")
/examples/lua > 

os.rename(old path, new path)

Переименовать файл или директорию.

Аргументы:

  • old path (старый путь): путь к файлу или директории, который нужно переименовать. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.
  • new path (новый путь): новый путь к файлу или директории. Путь может быть абсолютным или относительным по отношению к текущей рабочей директории.

Возвращает: ничего или ошибку.

os.cp(source path,destination path)

Копировать файл.

Аргументы:

  • source path (путь источника): путь исходного файла.
  • destination path (путь назначения): путь назначения файла.

Возвращает: ничего.

-- Copy autorun.lua into autorun.old
os.cp("/autorun.lua","/autorun.old")