Пользователь
0,0
рейтинг
5 января 2011 в 02:07

Разработка → Создаем свою файловую систему в ОС Windows на .Net из песочницы

.NET*
Существует великое множество файловых систем. Это и файловые системы для носителей информации (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 примера работы с данной оберткой:
  • 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-серверах. Но об этом в следующей статье…
Максим @MaxHero
карма
0,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (60)

  • +6
    Ура, в Винодус будет FUSE. Спустя 5 лет после 2.6.14…
    не хочется холивара, но как-то по проворнее можно подхватывать чужие хорошие идеи
    • 0
      Абсолютно верно. Упоминание про проект Dokan, я как раз увидел в википедии на страничке про FUSE. Ну а начал жить данный проект, как минимум в ноябре 2007 года. Во всяком случае, так утверждают архивы на страничке проекта.
    • 0
      Уже есть, на базе того же Dokan. API совместим. Автор утверждал, что ntfs-3g собирается и работает с минимальными допилками. hg.sharesource.org/fuse4win
      • 0
        Может быть я не в теме, но зачем на Windows нужен ntfs-3g? Лучше бы encfs тестировали.
        • +1
          Демонстрация лёгкости портирования нетривиального драйвера ФС.
          • +1
            Да, цель конечно хорошая, но еще раз повторюсь: лучше бы эти человеко-часы потратили на портирование encfs, obexfs, sshfs еtc — к демонстрации добавилась бы еще и польза.
            • 0
              [irony]В любом обсуждении любого опенсорс-проекта вечно вылетает эта фраза: лучше бы эти усилия потратили на %идея_которая_мне_нравится%[/irony]

              Да нет, какие там человеко-часы, автор просто взял первый попавшийся популярный драйвер под FUSE, попробовал скомпилить, оказалось, надо вставить затычки там и тут, потратил 10 минут, вставил затычки, скомпилил, запустил, и, довольный тем, что у него это получилось и оно работает, вообще забил на идею :) Хорошо хоть сам fuse4win выложил под свободной лицензией :)
              • +1
                [irony]Надо же выразить поддержку любимому проекту ;)[/irony]

                Ну, в таком случае замечательно, жаль что с другими проектами FUSE не так.
      • 0
        ntfs-3g на виндоуз? Предлагаю еще на винду Wine портировать
        • +3
          Вы не поверите! wiki.winehq.org/WineOnWindows
          • +3
            Ухожу в монастырь!
            • 0
              Надеюсь, в женский?
              • –3
                лифтёром работать ( лифчики снимать (.)(.) )
                :)
        • 0
          Есть даже два варианта портирования: вайновский (упомянут выше) и реактосовский, арвинсс (ну, чтобы им самим не надо было user32/gdi32 писать). Монастырь переполнен, возвращайтесь к нам :)
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Интересно! Если на фирме к примеру создать ФС, то таким образом можно защитить все важные документы. Но можно их и потерять, если ФС написана как попало и тогда придется попотеть, чтобы все данные восстановить *если это будет возможно*… или я не прав?
    Спасибо.
    • +1
      А что мешает использовать TrueCrypt? Написание хорошей ФС с криптованием — весьма не тривиальная задача.
    • +1
      А что мешает использовать EFS?
  • 0
    с которым могут взаимодействовать любые приложения из userspace-а

    А как же быть другим приложениям уровня ядра ОС (драйвера и прочее), которым также может понадобиться доступ до ФС? Если я ее уже изменю под свои нужды, то они работать с диском уже не смогут и будут считать диск битым?
    • 0
      А Вы ее дефрагментировать хотите или что?
    • 0
      Доступ к ФС в обход драйвера ФС? По меньшей мере, странно.

      Дефрагментация и форматирование идут через соответствующие API драйвера, правда, Dokan их, как я понимаю, пока не поддерживает. Во всех остальных случаях прямой доступ к диску не нужен (не будем рассматривать крайние точки, такие как программа обслуживания диска victoria и т.п.).

      Или вы имеете в виду обращение к ФС через драйвер? Тогда всё нормально, (драйвер ядра, которому нужно что-то от ФС)->(докан в ядре)->(userspace часть драйвера).
  • +1
    Кстати, Dokan используется в проекте Wuala (аналог Dropbox), что говорит в его пользу.
  • +4
    с таким заголовком его последнее слово вгоняет таки в ужос О_О
  • +1
    А ссылочку на HttpFS можно?
  • 0
    MaxHero, жду твоей следующей статьи!!! Мне как раз очень не хватает подобного функционала. Хочется ходить по http, как по файловой системе. Например, здесь ходить браузером очень не удобно! repo1.maven.org/maven2/
    • +1
      >Хочется ходить по http, как по файловой системе.
      как вы себе это представляете?

      Для каждого конкретного сайта пишется своя FS во FUSE. Или вы хотите FS для тех случаев, когда сервер отдает листинг директории в HTML?
      • 0
        да даже для конкретного сайта — все равно было бы очень юзабельно :-)
        • 0
          для конкретного сайта это уже совсем другой разговор
  • 0
    Кто-нибудь, научите винду читать/писать в XFS.
    • 0
      Я к тому, что это реально проблема: до сих пор нет ни 1 софтины под винду которая умела бы читать данных с разделов формата XFS. Поэтому чтобы что-то забэкапить с харда, на котором стоял линукс с разделом на этой ФС — надо обязательно грузиться в линукс (хотя бы лайвсиди), а из-под винды этого быстро и просто сделать не получится (ну то есть можно, наверное, поставить VM, на ней загрузить линукс и попытаться подцепить нужный раздел через него и им же скопировать данные куда-надо, но это очень долгий и не очень простой процесс).
  • 0
    Простите, а чем вам WebDAV Не угодил?
    • 0
      Насколько я понимаю, http-сервер должен поддерживать WebDAV. В википедии написано, что для http-сервера nginx существует отдельный модуль для поддержки этого протокола. Где гарантии, что на сервере, где лежат необходимые мне данные, включена поддержка данного протокола? Главная цель написания HttpFS — доступ к данным, без их предварительной полной загрузки. Так например при весе архива в 700МБ, для просмотра структуры содержимого этого архива необходимо загрузить менее 1МБ метаданных. Если необходимо разархивировать пару-тройку файлов, то будут загружены только куски архива, которые содержат именно эти файлы. В настоящий момент имеется уже рабочий прототип фс, отлавливаются баги и готовится релиз.
      • 0
        Ну есстественно должен.
        Я просто не совсем верно понял цель вашей фс, поэтому и спросил.
        А так — пишите, будет интересно посмотреть
  • +1
    Ура!
    Реквестирую httpfs (конечно же с partial download) а также {rar|zip}fs.
    А потом может и torrentfs подтянется=)

    • 0
      Как? КААК?
      • 0
        А какие проблемы? Ничего фантастичного тут не должно быть
        • 0
          опишите мне httpfs

          html файлики страниц сайта разложены по папкам? ссылки превращаются в папки? Или как?

          Вы можете создать заточку в FUSE под конкретный сайт, к примеру gmailfs или самодельная fs-как проскакивала с заточкой под вконтакте (или гифку может видели про тотал и вконтакте) но что б все сайты под одну гребенку — это невозможно.

          Максимум — можно заточить это для случаев, когда сервер отдает листинг директории HTML файлом.
          • 0
            первый вариант: монтировать не целую директорию, а отдельные файлы — httpfs.sourceforge.net/

            второй вариант: html файлы рассматривать как директории, где ссылки того же уровня рассматривать как файлы в этой директории (чтобы работал случай «когда сервер отдает листинг директории HTML файлом»), а прочие ссылки рассматривать как символические ссылки, либо отбрасывать. Не-html файлы рассматривать как файлы.
            • 0
              s/файлы в этой директории/файлы или вложенные директории/
              • 0
                Понятно, что основное применение такой FS — не хождение по html сайтам, а подключение директорий, доступ к которым есть по http. (read-only)

                Или запуск чего-либо. Крайне раздражает, когда сначала надо качать какой-то большой инсталлятор или образ DVD (используемые ресурсы: интернет-соединение), потом его устанавливать (используемые ресурсы: HDD, CPU), хотя можно было бы делать это параллельно с использованием {http,torrent}fs.
                • +1
                  На самом деле с запуском исполняемых файлов связана самая большая проблема. При запуске исполняемого файла, система в текущем каталоге создает временные файлы конфигурации. Если сделать фс read-only, то можно забыть о запуске бинарников из данной фс.
                  • +1
                    Ну знаете ли… Для временных файлов есть соответствующие директории, и использовать вместо них текущую — некрасиво, и такие программы выкидывать надо а не запускать =)

                    Как же мы запускаем бинарники из CD-R?
                    Из Program Files, куда пользователю запись запрещена?
                    • 0
                      Уточню: при запуске инсталяторов программ, в текущем каталоге система пытается создать файл *.config (например инсталятор someprogram.exe до запуска хочет создать в текущем каталоге someprogram.exe.config). Проблема ли это конкретного инсталятора или ОС, сказать не могу. При отказе в создании файла, вылетает ошибка «someprogram.exe параметр задан неверно». Почему такого не происходит при установке с CD/DVD: ИМХО в данном случае система видит, что запуск происходит с read-only носителя и помещает временные файлы куда следует.
                • 0
                  What for?

                  Вытягивать нужные данные? есть XPath уже давно, а просто красоты ради — я не понимаю, без заточки под конкретный сайт это очень странное решение
                  • 0
                    Какой XPath? Http — это уже не только html, несмотря на название. И такая фс была бы удобна именно для не HTML контента — больших файлов (.iso, .msi).

                    Работы с html чисто вторична, для листинга директории, из-за того, что в http нет стандартного механизма листинга директорий, так как он вообще говоря не предназначен для передачи директорий и файлов. И топикстартер как я понял листинг делать не собирается.

                    Если ориентироваться на светлое будущее, то со стороны раздающих надо раздавать файлы не по http, а по более подходящему протоколу, от которого требуется:
                    0) запрос метаинформации о файле (размер, etc)
                    1) range-download
                    2) контрольные суммы (в том числе и блочные, чтобы в случае повреждения не перекачивать всё заново)
                    3) листинг директорий

                    На основе эти пунктов будет возможно реализовать нормально и инкрементальное скачивание, и некую fs.

                    Может быть когда-нибудь ftp допилят до этого уровня, но на данный момент http популярнее ftp даже на его родном поле — передаче файлов (Чисто по ощущениям использования интернета, статистику специально не собирал)
                    • 0
                      Вы хотите запилить виртуальную ФС, что б через нее организовать сервисы вроде Dropbox?
                      • 0
                        Я ничего не хочу запилить, я хочу удобным образом получать контент, и, возможно, httpfs будет в этом полезна

                        Из того, что может решить сабж:
                        — запуск инсталлятора/монтирование диска до того, как программа полностью скачалась
                        — воспроизведение фильма, до того, как он полностью скачался
                        — совсем свежий пример из реальной жизни, который меня недавно заставил люто, бешено негодовать: есть набор изображений, скачать его можно только на одном сайте в виде zip-архива. Мне нужна была из этого набора только часть изображений. Причём на начальном этапе — вообще малая часть. Используя существующие технологии, пришлось сначала 8 часов качать архив, получить битый файл, выругаться (вспомнить про отсутствие блочных контрольных сумм в http), скачать архив заново (ещё 8 часов), распаковать, и только потом начать работу с изображениями. Имея httpfs + zipfs я мог бы начать работу с содержимым архива практически сразу.
                        • 0
                          последнее решается плагином к файрфоксу (может и для других браузеров есть такие примочки)

                          Первый два имеют отличную реализацию: netinst и потоковое видео

                          просто я не понимаю вашей концепции, видимо
                    • 0
                      Http — это уже не только html, несмотря на название.

                      Интересная идея. Веб, а он безусловно представлен http, сам по себе это +1 уровень абстракции над железными серверами (Один сайт может лежать на нескольких тачках, например), так же, как и семантическая сеть — +1 уровень абстракции над http.

                      Вязать http к железным серверам (реальным директориям, передаче файлов) не правильно концептуально.

                      Есть gopher, если вам нужен ftp сервер со свистульками.

                      Еще очень сложный вопрос выбора протокола прикладного уровня. А http это обычно TCP (http over UDP это больше академическая задача)

                      Монтировать сетевые ресурсы можно и так.
                      • 0
                        > Вязать http к железным серверам (реальным директориям, передаче файлов) не правильно концептуально.

                        Я не предлагаю вязать его к реальным серверам и директориям.
                        Если сайт распространяет файл, или директорию с файлами (это не обязательно будет файл или директория в файловой системе какого-то железного сервера — это будет файл или директория в файловой системе конечного пользователя), то содержимое этого файла (директории) может находиться на нескольких реальных серверах, точно также как гипертекстовый контент или изображения.

                        Вязать http к передаче файлов действительно неправильно, он для этого не предназначен.
                        Но возьмём пример: пользователю нужно скачать оперу. Он идёт на сайт opera.com/, нажимает ссылку «Скачать», и запускается закачка. Файл отдаётся по http, не по ftp, не по gopher, не с помощью «монтирования сетевого ресурса». И так везде.

                        Отсюда вывод — реалии таковы, что сейчас для доставки контента пользователю используется именно http.
                        Значит нужно либо использовать другой протокол, либо расширять протокол http для более удобной передачи файлов, либо делать костыли типа httpfs, чтобы пользователь мог по существующему протоколу получать контент более удобным способом.
                        • 0
                          >Значит нужно либо использовать другой протокол, либо расширять протокол http для более удобной передачи файлов, либо делать костыли типа httpfs

                          Оперу качать не так долго. Реалии, опять же таковы, что уже можно себе позволить качать по http без страха и с минимальным риском.

                          Многие программы ежат на треккерах так же, как и на оффсайтах.

          • 0
            Полностью с вами согласен. httpfs не представляет структуру файлов какого-то конкретного http-сервера. В настоящий момент работает следующим образом: вы нашли на просторах сети ссылку на какой-либо файл (именно файл, а не html-страничка), после чего драг-дропаете данную ссылку в окно софта. Данный софт делает запрос на http-сервер, где лежит данный файл, узнает, поддерживает ли сервер partial-download, имя и размер файла, после чего добавляет эту информацию в корень смонтированной файловой системы. Вы можете создавать в фс свою структуру каталогов и перемещать эти файлы (по сути ссылки) между каталогами. В момент обращения любого софта к одному из таких файлов, фс сначала проверяет кеш данного файла (т.к. некоторые куски уже могли быть выкачаны из сети), чего нет в кеше — вытягивает из сети.
            • 0
              FlashGet уже не в моде? :)

  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Работаю. Именно в Windows 7 x64. Завелось все с полоборота
  • +1
    Если кому будет интересно, то могу рассказать о ФС вообще, а также пошагово расписать создание ФС с нуля.
    • 0
      Очень интересно, напишите, пожалуйста. С меня небольшой донат за труды.
      • 0
        Ок, попытаюсь что-то вспомнить. Надеюсь, кармы для публикации хватит.
  • 0
    По теме…
    Натолкнулся на замечатьльную подборку ФС для Windows.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.