Файловая система
Поддерживаемые файловые системы
Файловая система 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")