Функция mount()
Функция mount() предназначена для монтирования файловых систем. При использовании этой функции в KasperskyOS важно учитывать следующие особенности её реализации:
EACCES в IPC-ответе.auto для монтирования файловой системы, поддерживающей автоматическое монтирование.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".
В начало