Функции монтирования файловых систем
В KasperskyOS работа с файловыми системами и сетью выполняется через отдельную системную программу, реализующую виртуальную файловую систему (англ. Virtual File System, VFS).
Функция mount()
Функция mount() предназначена для монтирования файловых систем. При использовании этой функции в KasperskyOS важно учитывать следующие особенности её реализации:
- В KasperskyOS запрещено перемонтирование корневой файловой системы. Корневая файловая система всегда должна монтироваться через переменную окружения
ROOTFS, передающуюся программе VFS и содержащую одну строку в форматеfstab. Пример использования переменной окружения ROOTFS см. в разделе "Монтирование файловых систем при запуске VFS". - Для указания типов файловых систем доступно дополнительное значение
autoдля монтирования файловой системы, поддерживающей автоматическое монтирование. - Количество монтируемых файловых систем и поддерживаемых флагов монтирования в KasperskyOS ограничено по сравнению с реализацией функции в библиотеке
libc. - Источник монтирования не может быть директорией.
По умолчанию программе VFS не сопоставляется программа, реализующая блочное устройство. Чтобы связать процесс используемой виртуальной файловой системы с требуемым блочным устройством, необходимо в файле CMakeLists.txt для сборки программы Einit использовать свойство blkdev::entity_REPLACEMENT функции set_target_properties. Возможные значения для свойства blkdev::entity_REPLACEMENT (реализации блочных устройств):
ramdisk::entity– RAM-диск, который считывает из ROMFS файлыramdisk<N>.imgи предоставляет их как файловые системыramdisk<N>, гдеN– целое положительное число.sdcard::entity_hw– драйвер SD-карты (MMC).usb_storage_entity::entity– драйвер USB Mass Storage (для аппаратных платформ).""(пустая строка) – взаимодействие между блочным устройством и виртуальной файловой системой не требуется.
Функция mount() объявлена в заголовочном файле sysroot-*-kos/include/sys/mount.h из состава KasperskyOS SDK:
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
Параметры функции:
sourceИсточник монтирования: устройство или виртуальный объект (dummy). Поддерживаемые форматы:
- <
имя_устройства>[_p<номер_тома>] – полное имя устройства. PARTLABEL=<метка>, гдеметка– метка раздела GPT (Globally Unique Identifier Partition Table).PARTUUID=<uuid>, гдеuuid– GUID раздела GPT.
При монтировании файловых систем, которым не требуется физическое устройство (например, ROMFS, ramfs, devfs), параметр
sourceигнорируется.- <
targetДиректория, в которую будет смонтирована файловая система. Эта директория должна быть создана к моменту вызова функции
mount().filesystemtypeТип файловой системы. Допустимые значения:
romfs– файловая система только для чтения.ramfs– файловая система, работающая в оперативной памяти. Используется по умолчанию для корневой файловой системы.devfs– виртуальная файловая система для управления устройствами. Поддерживаемые устройства:log– аналог/dev/logдля системного журналирования;null– аналог/dev/nullдля перенаправления и игнорирования вывода;urandom– аналог/dev/randomдля генерации псевдослучайных чисел;bpf,npf,tun0/1/2/3– сетевые устройства для работы с сетевыми интерфейсами и фильтрами.
fat12,fat16,fat32,vfat– файловые системы семейства FAT. Одна реализация для всего семейства.ext,ext2,ext3,ext4– файловые системы семейства ext. Одна реализация для всего семейства.ffs– файловая система, используемая в NetBSD.virtiofs– файловая система для совместного доступа гостевой KasperskyOS, запущенной в QEMU и хостовой ОС.auto– автоматическое монтирование первой файловой системы из списка зарегистрированных, которая удовлетворяет условиям: требует наличие устройства и может быть смонтирована в автоматическом режиме (например,fat32,extиffs).
mountflagsФлаги монтирования. Доступные значения:
MS_RDONLY– монтировать файловую систему в режиме только для чтения.MS_STRICTATIME– всегда обновлять время последнего доступа к файлам при изменении их содержимого.MS_SYNCHRONOUS– синхронная запись в файловую систему.
dataДополнительные данные для монтируемых файловых систем. Пустая строка или
NULL, если указание параметра не требуется.Для файловых систем семейства ext допустимы следующие значения:
expand– расширить файловую систему на всё доступное пространство тома, если это разрешено структурой раздела;check– инициировать полное автовосстановление файловой системы при монтировании.
Для файловой системы
virtiofsдопустимы следующие значения:tag=<...>– метка монтируемой файловой системыvirtiofs. Указывается при старте, в параметрах QEMU. Этот параметр является обязательным при монтировании virtiofs
В случае успеха функция возвращает 0, иначе возвращает -1. Если произошла ошибка, переменная errno устанавливается в значение, указывающее на причину ошибки. Возможные значения errno соответствуют стандартным значениям, определённым в библиотеке libc.
Функция umount()
Функция предназначена для размонтирования файловых систем и объявлена в заголовочном файле sysroot-*-kos/include/sys/mount.h из состава KasperskyOS SDK:
int umount(const char *target);
Параметры функции:
targetДиректория, из которой будет размонтирована файловая система.
В случае успеха функция возвращает 0, иначе возвращает -1. Если произошла ошибка, переменная errno устанавливается в значение, указывающее на причину ошибки. Возможные значения errno соответствуют стандартным значениям, определённым в библиотеке libc.
Пример вызова функций:
#include <sys/mount.h>
int main(void)
{
// Создать директорию /c с указанием
// прав доступа для всех пользователей
if (mkdir("/c", S_IRWXU | S_IRWXG | S_IRWXO)) {
fprintf(stderr, "Failed to create dir\n");
return -1;
}
// Смонтировать файловую систему ext2 с блочного устройства mmc0_p0
// в директорию /c с использованием стандартных флагов монтирования
// и без дополнительных данных
if (mount("mmc0_p0", "/c", "ext2", 0, "")) {
fprintf(stderr, "Failed to mount 'ext2'\n");
return -1;
}
// Создать директорию /c/ram с указанием
// прав доступа для всех пользователей
if (mkdir("/c/ram", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
{
printf("Failed to create \"/c/ram\" dir\n");
return EXIT_FAILURE;
}
// Смонтировать файловую систему ramfs в директорию /c/ram
// с использованием стандартных флагов монтирования
// и без дополнительных данных
if (mount("nodev", "/c/ram", "ramfs", 0, "") != 0)
{
printf("Failed to mount ramfs, /c/ram (error %d: \"%s\")\n",
errno,
strerror(errno));
return EXIT_FAILURE;
}
// ...
// Размонтировать файловую систему из директории /c/ram
if (umount("/c/ram")) {
fprintf(stderr, "Failed to umount 'ramfs'\n");
return -1;
}
return 0;
}
Другие способы монтирования файловых систем см. в разделе "Монтирование файловых систем при запуске VFS".