Функции монтирования файловых систем
Функция mount()
Функция mount() предназначена для монтирования файловых систем. При использовании этой функции в KasperskyOS важно учитывать следующие особенности её реализации:
- В KasperskyOS запрещено перемонтирование корневой файловой системы, если IPC-запрос на перемонтирование поступает от прикладной программы, а не от системной программы, реализующей виртуальную файловую систему. Этот запрос будет отклонен с ошибкой
EACCESв IPC-ответе. - Для указания типов файловых систем доступно дополнительное значение
autoдля монтирования файловой системы, поддерживающей автоматическое монтирование. - Количество монтируемых файловых систем и поддерживаемых флагов монтирования в KasperskyOS ограничено по сравнению с реализацией функции в библиотеке
libc. - Источник монтирования не может быть директорией.
В KasperskyOS работа с файловыми системами и сетью выполняется через отдельную системную программу, реализующую виртуальную файловую систему (англ. Virtual File System, VFS). По умолчанию программе 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– драйвер SD-карты (MMC).ata_ENTITY– драйвер AHCI (ATA).""(пустая строка) – взаимодействие между блочным устройством и виртуальной файловой системой не требуется.
Функция 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.auto– автоматические монтирование первой файловой системы из списка зарегистрированных, которая удовлетворяет условиям: требует наличие устройства и может быть смонтирована в автоматическом режиме (например,fat32,extиffs).
mountflagsФлаги монтирования. Доступные значения:
MS_RDONLY– монтировать файловую систему в режиме только для чтения.MS_STRICTATIME– всегда обновлять время последнего доступа к файлам при изменении их содержимого.MS_SYNCHRONOUS– синхронная запись в файловую систему.
dataДополнительные данные для монтируемых файловых систем. Пустая строка или
NULL, если указание параметра не требуется. Для файловых систем семейства ext допустимы следующие значения:expand– расширить файловую систему на всё доступное пространство тома, если это разрешено структурой раздела;check– инициировать полное автовосстановление файловой системы при монтировании.
В случае успеха функция возвращает 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 с блочного устройства Ahci0Port0,0
// в директорию /c с использованием стандартных флагов монтирования
// и без дополнительных данных
if (mount("Ahci0Port0,0", "/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".