Существует великое множество файловых систем. Это и файловые системы для носителей информации (FAT*, NTFS, ext* и т.д.), и сетевые файловые системы (NFS, CIFS и т.д.), и виртуальные файловые системы, и великое множество других. А появлялась ли у тебя, %habrauser%, потребность в своей, еще несуществующей файловой системе? О том, как ее сделать для ОС Windows на managed-коде (.net), и пойдет речь.
В общем случае, для создания своей файловой системы (далее ФС), необходимо написать драйвер этой ФС и зарегистрировать его в ОС. Т.к. драйвер взаимодействует с ядром ОС, то его создание на managed-коде является делом нетривиальным, а производительность такого драйвера будет на невысоком уровне. В связи с этим, целесообразнее иметь драйвер ФС, написанный на native-коде и некий промежуточный слой между этим драйвером и managed-кодом. Такой драйвер существует в проекте Dokan, равно как и набор классов DokanNet для взаимодействия с этим драйвером в managed-коде. Оба проекта распространяются под лицензией GPLv3.
Dokan — это драйвер, работающий на уровне ядра Windows, с которым могут взаимодействовать любые приложения из userspace-а. Драйвер существует как для 32-ух разрядный систем, так и для 64-ех разрядных. Драйвер не несет в себе реализацию какой-либо ФС, а лишь выступает в роли прокси, пропуская через себя все операции ввода-вывода (IO) из ядра ОС в userspace. Реализация функционала ФС лежит на наших плечах, мы создаем базовые функции ФС, такие как открытие/закрытие файла, чтение из файла, запись в файл и т.д., которые будут вызываться драйвером Dokan при возникновении в системе соответствующих событий. В момент регистрации нашей ФС в драйвере Dokan, мы указываем некоторые параметры работы нашей ФС (кол-во потоков-обработчиков операций ввода/вывода, точка монтирования нашей ФС (Dokan поддерживает монтирование в качестве съемного или сетевого диска и только в корень ФС), автоматическое размонтирование нашей ФС, в случае ошибок в работе, и некоторые другие параметры). После этого в ОС появляется новый диск в корне ФС, с которым любые приложения и сама ОС взаимодействует, как и с обычным диском. Какие операции разрешено производить в данной ФС, зависит только от разработчика этой ФС, то есть от нас.
DokanNet – это обертка над драйвером Dokan. Позволяет разрабатывать свою ФС на managed-коде. DokanNet описывает интерфейс DokanOperations, который необходимо реализовать для регистрации нашей ФС в драйвере Dokan. Автор DokanNet вместе с исходниками самого проекта положил 2 примера работы с данной оберткой:
Коды примеров легко читаемы и позволяют ознакомиться с возможностями, предоставляемые драйвером Dokan.
Реализация интерфейса DokanOperations сводится к реализации следующих функций:
Как мы видим, функционал, предоставляемый драйвером Dokan и оберткой DokanNet очень богат. На базе данного проекта разработана ФС SSHFS. Каждый может разработать ФС, отвечающий своим требованиям. Я же остановился на разработке HttpFS, которая позволит монтировать в систему файлы, находящиеся на удаленных Http-серверах. Но об этом в следующей статье…
В общем случае, для создания своей файловой системы (далее ФС), необходимо написать драйвер этой ФС и зарегистрировать его в ОС. Т.к. драйвер взаимодействует с ядром ОС, то его создание на managed-коде является делом нетривиальным, а производительность такого драйвера будет на невысоком уровне. В связи с этим, целесообразнее иметь драйвер ФС, написанный на native-коде и некий промежуточный слой между этим драйвером и managed-кодом. Такой драйвер существует в проекте Dokan, равно как и набор классов DokanNet для взаимодействия с этим драйвером в managed-коде. Оба проекта распространяются под лицензией GPLv3.
Попробуем разобраться, как это работает
Dokan — это драйвер, работающий на уровне ядра Windows, с которым могут взаимодействовать любые приложения из userspace-а. Драйвер существует как для 32-ух разрядный систем, так и для 64-ех разрядных. Драйвер не несет в себе реализацию какой-либо ФС, а лишь выступает в роли прокси, пропуская через себя все операции ввода-вывода (IO) из ядра ОС в userspace. Реализация функционала ФС лежит на наших плечах, мы создаем базовые функции ФС, такие как открытие/закрытие файла, чтение из файла, запись в файл и т.д., которые будут вызываться драйвером Dokan при возникновении в системе соответствующих событий. В момент регистрации нашей ФС в драйвере Dokan, мы указываем некоторые параметры работы нашей ФС (кол-во потоков-обработчиков операций ввода/вывода, точка монтирования нашей ФС (Dokan поддерживает монтирование в качестве съемного или сетевого диска и только в корень ФС), автоматическое размонтирование нашей ФС, в случае ошибок в работе, и некоторые другие параметры). После этого в ОС появляется новый диск в корне ФС, с которым любые приложения и сама ОС взаимодействует, как и с обычным диском. Какие операции разрешено производить в данной ФС, зависит только от разработчика этой ФС, то есть от нас.
DokanNet – это обертка над драйвером Dokan. Позволяет разрабатывать свою ФС на managed-коде. DokanNet описывает интерфейс DokanOperations, который необходимо реализовать для регистрации нашей ФС в драйвере Dokan. Автор DokanNet вместе с исходниками самого проекта положил 2 примера работы с данной оберткой:
- DokanNetMirror — ФС-зеркало уже существующего каталога
- RegistoryFS — ФС, представляющая структуру системного реестра Windows в директории и файлы
Коды примеров легко читаемы и позволяют ознакомиться с возможностями, предоставляемые драйвером Dokan.
Реализация интерфейса DokanOperations сводится к реализации следующих функций:
- CreateFile — создание файлов/директорий
- OpenDirectory — открытие директории
- CreateDirectory — создание директории
- Cleanup — удаление файла/пустой директории
- CloseFile — закрытие файлового дескриптора
- ReadFile — чтение куска файла указанной длины с указанным смещением
- WriteFile — запись данных в файл с указанным смещением
- FlushFileBuffers — очистка буферов (кэша) файла
- GetFileInformation — получение информации о размере, атрибутах, времени создания/последнего доступа/модификации файла/директории
- FindFiles — получение списка файлов/директорий в указанной директории
- SetFileAttributes — установка атрибутов файла/директории
- SetFileTime — установка времени создания/последнего доступа/модификации файла/директории
- DeleteFile — пометка файла на удаление (удаление проводится в Cleanup)
- DeleteDirectory — пометка директории на удаление (удаление проводится в Cleanup)
- MoveFile — перемещение/переименование файла/директории
- SetEndOfFile — установка размера файла (используется при создании пустого файла определенной длины)
- SetAllocationSize — автор не указал для чего необходима данная фун-ция, на практике передача управления в нее не замечена
- LockFile — блокировка файла в single-доступе
- UnlockFile — снятие блокировки
- GetDiskFreeSpace — получение информации о кол-ве доступного/общего/свободного места в ФС
- Unmount — размонтирование/отключение ФС
Как мы видим, функционал, предоставляемый драйвером Dokan и оберткой DokanNet очень богат. На базе данного проекта разработана ФС SSHFS. Каждый может разработать ФС, отвечающий своим требованиям. Я же остановился на разработке HttpFS, которая позволит монтировать в систему файлы, находящиеся на удаленных Http-серверах. Но об этом в следующей статье…