Содержание
Файловые системы и сеть
В KasperskyOS работа с файловыми системами и сетью выполняется через отдельную системную программу, реализующую виртуальную файловую систему (англ. Virtual File System, VFS).
В составе SDK компонент VFS представлен набором исполняемых файлов, библиотек, файлов формальной спецификации и заголовочных файлов. Подробнее см. раздел "Состав компонента VFS".
Основной сценарий взаимодействия с системной программой VFS происходит следующим образом:
- Прикладная программа соединяется IPC-каналом с системной программой VFS и при сборке компонуется с клиентской библиотекой компонента VFS.
- В прикладном коде POSIX-вызовы для работы с файловыми системами и сетью преобразуются в вызовы функций клиентской библиотеки.
Ввод и вывод в файловые дескрипторы для стандартных потоков ввода-вывода (stdin, stdout и stderr) также преобразуется в обращения к VFS. Если прикладная программа не скомпонована с клиентской библиотекой компонента VFS, то вывод в stdout невозможен. В таком случае возможен только вывод в стандартный поток ошибок (stderr), который в этом случае осуществляется без использования VFS через специальные методы ядра KasperskyOS.
- Клиентская библиотека выполняет IPC-запросы к системной программе VFS.
- Системная программа VFS принимает IPC-запросы и вызывает соответствующие реализации файловых систем (которые, в свою очередь могут выполнять IPC-запросы к драйверам устройств) или сетевые драйверы.
- После обработки запроса, системная программа VFS выполняет ответы на IPC-запросы прикладной программы.
Использование нескольких программ VFS
В решение можно добавить несколько копий системной программы VFS, разделив таким образом информационные потоки разных системных и прикладных программ. Также можно разделить информационные потоки в рамках одной прикладной программы. Подробнее см. "Разделение информационных потоков с помощью VFS-бэкендов".
Включение функциональности VFS в прикладную программу
Функциональность компонента VFS можно полностью включить в прикладную программу, избавляясь при этом от необходимости передавать каждый запрос через IPC. Подробнее см. "Включение функциональности VFS в программу".
При этом использование функциональности VFS по IPC позволяет разработчику решения:
- контролировать вызовы методов для работы с сетью и файловыми системами с помощью политики безопасности решения;
- соединить несколько клиентских программ с одной программой VFS;
- соединить одну клиентскую программу с двумя программами VFS для раздельной работы с сетью и файловыми системами.
Состав компонента VFS
Компонент VFS реализует виртуальную файловую систему. В составе KasperskyOS SDK компонент VFS представлен набором исполняемых файлов, библиотек, файлов формальной спецификации и заголовочных файлов, позволяющих использовать файловые системы и/или сетевой стек.
Библиотеки VFS
CMake-пакет vfs
содержит следующие библиотеки:
vfs_fs
– содержит реализации файловых систем devfs, ramfs и ROMFS, а также позволяет добавить в VFS реализации других файловых систем.vfs_net
– содержит реализацию файловой системы devfs и сетевого стека.vfs_imp
– содержит библиотекиvfs_fs
иvfs_net
.vfs_remote
– клиентская транспортная библиотека, которая преобразует локальные вызовы в IPC-запросы к VFS и принимает IPC-ответы.vfs_server
– серверная транспортная библиотека VFS, которая принимает IPC-запросы, преобразует их в локальные вызовы и отправляет IPC-ответы.vfs_local
– используется для включения функциональности VFS в программу.
Исполняемые файлы VFS
CMake-пакет precompiled_vfs
содержит следующие исполняемые файлы:
VfsRamFs
;VfsSdCardFs
;VfsNet
.
Исполняемые файлы VfsRamFs
и VfsSdCardFs
включают в себя библиотеки vfs_server
, vfs_fs
, vfat
и lwext4
. Исполняемый файл VfsNet
включает в себя библиотеки vfs_server
и vfs_imp
.
Каждый из этих исполняемых файлов имеет собственные значения параметров запуска и переменных окружения по умолчанию.
Файлы формальной спецификации и заголовочные файлы VFS
В директории sysroot-*-kos/include/kl
из состава KasperskyOS SDK находятся следующие файлы VFS:
- файлы формальной спецификации
VfsRamFs.edl
,VfsSdCardFs.edl
,VfsNet.edl
иVfsEntity.edl
и сгенерированные из них заголовочные файлы; - файл формальной спецификации
Vfs.cdl
и сгенерированный из него заголовочный файлVfs.cdl.h
; - файлы формальной спецификации
Vfs*.idl
и сгенерированные из них заголовочные файлы.
API библиотеки libc, поддерживаемый VFS
Функциональность VFS доступна программам через API, предоставляемый библиотекой libc
.
Функции, реализуемые библиотеками vfs_fs
и vfs_net
, приведены в таблицах ниже. Символом *
отмечены функции, которые включаются в библиотеку vfs_fs
опционально (в зависимости от параметров сборки библиотеки).
Функции, реализуемые библиотекой vfs_fs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Функции, реализуемые библиотекой vfs_net
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Если в VFS нет реализации вызванной функции, возвращается код ошибки EIO
.
Создание IPC-канала до VFS
В этом примере процесс Client
использует файловые системы и сетевой стек, а процесс VfsFsnet
обрабатывает IPC-запросы процесса Client
, связанные с использованием файловых систем и сетевого стека. Такой подход используется в тех случаях, когда не требуется разделение информационных потоков, связанных с файловыми системами и сетевым стеком.
Имя IPC-канала должно задаваться макросом _VFS_CONNECTION_ID
, определенным в заголовочном файле sysroot-*-kos/include/vfs/defs.h
из состава KasperskyOS SDK.
Init-описание примера:
init.yaml
Включение функциональности VFS в программу
В этом примере программа Client
включает функциональность программы VFS для работы с сетевым стеком (см. рис. ниже).
Библиотеки компонента VFS в составе программы
Выполняется компиляция файла реализации client.c
и компоновка с библиотеками vfs_local
, vfs_implementation
и dnet_implementation
:
CMakeLists.txt
Если бы программа Client
использовала файловые системы, то нужно было бы выполнить компоновку с библиотеками vfs_local
и vfs_fs
, а также с библиотеками реализации этих файловых систем. Кроме того, нужно было бы добавить в решение драйвер блочного устройства.
Обзор: параметры запуска и переменные окружения VFS
Параметры запуска программы VFS
-l <запись в формате fstab>
Параметр запуска
-l
монтирует заданную файловую систему.-f <путь к файлу fstab>
Параметр
-f
монтирует файловые системы, указанные в файлеfstab
. Если переменная окруженияUNMAP_ROMFS
не определена, то поиск файлаfstab
будет выполнен в ROMFS-образе. Если переменная окруженияUNMAP_ROMFS
определена, то поиск файлаfstab
будет выполнен в файловой системе, заданной через переменную окруженияROOTFS
.
Примеры использования параметров запуска программы VFS
Переменные окружения программы VFS
UNMAP_ROMFS
Если переменная окружения
UNMAP_ROMFS
определена, то ROMFS-образ будет удален из памяти. Это позволяет сэкономить память, а также при использовании параметра запуска-f
дает возможность выполнить поиск файлаfstab
не в ROMFS-образе, а в файловой системе, заданной через переменную окруженияROOTFS
.ROOTFS = <запись в формате fstab>
Переменная окружения
ROOTFS
позволяет монтировать заданную файловую систему в корневую директорию. При использовании параметра запуска-f
комбинация переменных окруженияROOTFS
иUNMAP_ROMFS
дает возможность выполнить поиск файлаfstab
не в ROMFS-образе, а в файловой системе, заданной через переменную окруженияROOTFS
.VFS_CLIENT_MAX_THREADS
Переменная окружения
VFS_CLIENT_MAX_THREADS
позволяет переопределить параметр конфигурирования SDKVFS_CLIENT_MAX_THREADS
._VFS_NETWORK_BACKEND=<имя VFS-бэкенда>:<имя IPC-канала до процесса VFS>
Переменная окружения
_VFS_NETWORK_BACKEND
задает VFS-бэкенд для работы с сетевым стеком. Можно указать имя стандартного VFS-бэкенда:client
(для программы, исполняющейся в контексте клиентского процесса),server
(для программы VFS, исполняющейся в контексте серверного процесса) илиlocal
, а также имя пользовательского VFS-бэкенда. Если используется VFS-бэкендlocal
, то имя IPC-канала не указывается (_VFS_NETWORK_BACKEND=local:
). Может быть указано более одного IPC-канала через запятую._VFS_FILESYSTEM_BACKEND=<имя VFS-бэкенда>:<имя IPC-канала до процесса VFS>
Переменная окружения
_VFS_FILESYSTEM_BACKEND
задает VFS-бэкенд для работы с файловыми системами. Имя VFS-бэкенда и имя IPC-канала до процесса VFS задаются так же, как и в переменной окружения_VFS_NETWORK_BACKEND
.
Значения по умолчания для параметров запуска и переменных окружения VFS
Для исполняемого файла VfsRamFs
:
Для исполняемого файла VfsSdCardFs
:
Для исполняемого файла VfsNet
:
Монтирование файловых систем при запуске VFS
При запуске программы VFS по умолчанию монтируется только файловая система RAMFS в корневую директорию. Если требуется монтировать другие файловые системы, это можно сделать не только с помощью вызова функции mount()
, но и установив параметры запуска и переменные окружения программы VFS.
Файловые системы ROMFS
и squashfs
предназначены только для чтения, поэтому для монтирования этих файловых систем нужно указать параметр ro
.
Использование параметра запуска -l
Одним из способов монтировать файловую систему является установка для программы VFS параметра запуска -l <запись в формате fstab>
.
В этих примерах при запуске программы VFS будут монтированы файловые системы devfs и ROMFS:
init.yaml.(in)
CMakeLists.txt
Использование файла fstab из ROMFS-образа
При сборке решения можно добавить файл fstab
в ROMFS-образ. Этот файл можно использовать для монтирования файловых систем, установив для программы VFS параметр запуска -f <путь к файлу fstab>
.
В этих примерах при запуске программы VFS будут монтированы файловые системы, заданные через файл fstab
, который был добавлен при сборке решения в ROMFS-образ:
init.yaml.(in)
CMakeLists.txt
Использование "внешнего" файла fstab
Если файл fstab
находится не в ROMFS-образе, а в другой файловой системе, то для использования этого файла необходимо установить для программы VFS следующие параметры запуска и переменные окружения:
ROOTFS
. Эта переменная окружения позволяет монтировать в корневую директорию файловую систему, содержащую файлfstab
.UNMAP_ROMFS
. Если эта переменная окружения определена, то поиск файлаfstab
будет выполнен в файловой системе, заданной через переменную окруженияROOTFS
.-f
. Этот параметр запуска используется, чтобы монтировать файловые системы, указанные в файлеfstab
.
В этих примерах при запуске программы VFS в корневую директорию будет монтирована файловая система ext2, в которой должен находиться файл fstab
по пути /etc/fstab
:
init.yaml.(in)
CMakeLists.txt
Разделение информационных потоков с помощью VFS-бэкендов
В этом примере применяется паттерн безопасной разработки, предусматривающий отделение информационных потоков, связанных с использованием файловых систем, от информационных потоков, связанных с использованием сетевого стека.
Процесс Client
использует файловые системы и сетевой стек. Процесс VfsFirst
обеспечивает работу с файловыми системами, а процесс VfsSecond
дает возможность работать с сетевым стеком. Через переменные окружения программ, исполняющихся в контекстах процессов Client
, VfsFirst
и VfsSecond
, заданы VFS-бэкенды, которые обеспечивают раздельное использование файловых систем и сетевого стека. В результате этого IPC-запросы процесса Client
, связанные с использованием файловых систем, обрабатываются процессом VfsFirst
, а IPC-запросы процесса Client
, связанные с использованием сетевого стека, обрабатываются процессом VfsSecond
(см. рис. ниже).
Схема взаимодействия процессов
Init-описание примера:
init.yaml
Создание VFS-бэкенда
В этом примере показано, как создать и использовать собственный VFS-бэкенд.
Процесс Client
использует файловые системы fat32 и ext4. Процесс VfsFirst
обеспечивает работу с файловой системой fat32, а процесс VfsSecond
дает возможность работать с файловой системой ext4. Через переменные окружения программ, исполняющихся в контекстах процессов Client
, VfsFirst
и VfsSecond
, заданы VFS-бэкенды, которые обеспечивают обработку IPC-запросов процесса Client
процессом VfsFirst
или VfsSecond
в зависимости от того, какую файловую систему использует процесс Client
. В результате этого IPC-запросы процесса Client
, связанные с использованием файловой системы fat32, обрабатываются процессом VfsFirst
, а IPC-запросы процесса Client
, связанные с использованием файловой системы ext4, обрабатываются процессом VfsSecond
(см. рис. ниже).
На стороне процесса VfsFirst
файловая система fat32 монтируется в директорию /mnt1
. На стороне процесса VfsSecond
файловая система ext4 монтируется в директорию /mnt2
. Пользовательский VFS-бэкенд custom_client
, используемый на стороне процесса Client
, позволяет отправлять IPC-запросы по IPC-каналу VFS1
или VFS2
в зависимости от того, начинается ли путь к файлу с /mnt1
или нет. При этом пользовательский VFS-бэкенд использует в качестве посредника стандартный VFS-бэкенд client
.
Схема взаимодействия процессов
Исходный код VFS-бэкенда
Этот файл реализации содержит исходный код VFS-бэкенда custom_client
, использующего стандартные VFS-бэкенды client
:
backend.c
Компоновка программы Client
Создание статической библиотеки VFS-бэкенда:
CMakeLists.txt
Компоновка программы Client
со статической библиотеки VFS-бэкенда:
CMakeLists.txt
Установка параметров запуска и переменных окружения программ
Init-описание примера:
init.yaml
Динамическая настройка сетевого стека
Чтобы изменить параметры сетевого стека, заданные по умолчанию, нужно использовать функцию sysctl()
или sysctlbyname()
, объявленные в заголовочном файле sysroot-*-kos/include/sys/sysctl.h
из состава KasperskyOS SDK. Параметры, которые можно изменить, приведены в таблице ниже.
Настраиваемые параметры сетевого стека
Название параметра |
Описание параметра |
---|---|
|
Максимальное время жизни (англ. Time To Live, TTL) отправляемых IP-пакетов. Не влияет на протокол ICMP. |
|
Если имеет значение |
|
Значение MSS (в байтах), которое применяется, если только взаимодействующая сторона не сообщила это значение при открытии TCP-соединения, или не задействован режим "Path MTU Discovery" (RFC 1191). Также это значение MSS передается взаимодействующей стороне при открытии TCP-соединения. |
|
Минимальное значение MSS, в байтах. |
|
Если имеет значение |
|
Число повторных отправок проверочных сообщений (англ. Keep-Alive Probes, KA) без ответа, после выполнения которых TCP-соединение считается закрытым. Если имеет значение |
|
Время неактивности TCP-соединения, по истечении которого начинают отправляться KA. Задается в условных единицах, которые можно перевести в секунды, разделив на значение параметра |
|
Время между повторными отправками KA при отсутствии ответа. Задается в условных единицах, которые можно перевести в секунды, разделив на значение параметра |
|
Размер буфера для принимаемых по протоколу TCP данных, в байтах. |
|
Размер буфера для отправляемых по протоколу TCP данных, в байтах. |
|
Размер буфера для принимаемых по протоколу UDP данных, в байтах. |
|
Размер буфера для отправляемых по протоколу UDP данных, в байтах. |
Пример настройки MSS: