Одной из приятных черт философии Unix, которую унаследовала Linux, является модульная организация файловой системы. И это, на самом деле, очень хорошо, так как в типичной установке ОС могут понадобиться различные файловые системы, вроде ext4, reiserfs, btrfs, или даже сетевые файловые системы — вроде nfs. Кроме того, в Linux существуют и виртуальные файловые системы, вроде /sys и /dev, которые помогают Linux сделать так, чтобы всё в ней выглядело бы как файл. Слабая сторона средств работы с файловыми системами в Linux заключается в том, что для создания механизмов, обеспечивающих работу файловой системы, нужно вносить изменения в ядро, или, как минимум, создавать загружаемые модули. Это, правда, не так уж и сложно, но, всё же, немного сложнее, чем разработка обычных программ. Решить эту проблему призван интерфейс FUSE (Filesystem in USErspace — файловая система в пользовательском пространстве). В частности, речь идёт о модуле файловой системы, который позволяет создавать новые файловые системы путём написания вполне обычного кода.



Мои любимые файловые системы пользовательского пространства


Существует несколько FUSE, которые способны принести тем, кто их применяет, реальную пользу. Вот некоторые из моих любимых:

  • sshfs — монтирует удалённую файловую систему, используя лишь ssh-доступ.
  • rclone — позволяет организовывать доступ ко многим удалённым файловым системам и осуществлять их монтирование.
  • tagsistant — файловая система, основанная на тегах, облегчающая работу с большим количеством файлов.
  • fuse-zip — позволяет монтировать zip-файлы в виде файловых систем.
  • gitfs — позволяет монтировать в виде файловых систем git-репозитории.

Есть и множество других FUSE. Разнообразие подобных файловых систем позволяет использовать их в самых разных сценариях. Например — и для организации локальной работы с файлами, и для привлечения к работе с данными мощностей облачных провайдеров.

А как насчёт Windows?


FUSE в Linux — это весьма полезная штука. А есть ли что-то подобное в Windows? Да, нечто такое есть и в Windows. Называется оно WinFsp и выглядит как интересный механизм для работы с файловыми системами. Правда, прямой совместимости с FUSE у него нет. Но имеются слои совместимости с FUSE (один — для версии 2.8, и ещё один — для версии 3.2), которые упрощают портирование существующего FUSE-кода на WinFsp.

Это — достаточно новый проект такого рода. Но существует ещё один подобный проект — Dokan, авторы которого говорят о наличии интерфейсов к его API для FUSE. Правда, если верить бенчмаркам, выполненным в рамках проекта WinFsp, оказывается, что WinFsp отличается более высокой производительностью.

Итоги


Если имеется какая-нибудь FUSE, которая вам очень нравится, то она, вероятно, является опенсорсной. А если она вам и правда нравится — вы можете попытаться портировать её на Windows. Если вы не используете Windows, но хотите написать собственную FUSE для этой платформы, вышеописанные проекты дадут вам достаточно простые механизмы для переноса ваших трудов на Windows.

Например, у вас может быть некая система для логирования данных. Вы решили, что хотите представить результаты её работы в виде файловой системы. Сделать это не так уж и сложно. Так, например, имеются некоторые структуры данных, которые нужно заполнить, причём, заполнять нужно далеко не все эти структуры. Нужно написать функции, которые будут использоваться в виде инструментов для чтения и записи данных, представляющих директории и файлы. Вот — пример, написанный на C. А вот — C++-обёртка, которая позволит создать файловую систему, написав меньше кода, чем при выборе C. В этом примере имеется всего четыре простых функции. Так что — если вам нужна собственная файловая система пользовательского пространства — вы, что для Linux, что для Windows, вполне можете создать её своими силами.

Возникала ли у вас когда-нибудь необходимость в создании собственной файловой системы?

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


  1. alex_shpak
    25.09.2021 19:28
    +1

    Возникала ли у вас когда-нибудь необходимость в создании собственной файловой системы?

    В своё время сделал catfs - файловую систему, представляющую список файлов в виде одного файла (как будто сделали cat * этих файлов).


    1. Hisoka
      25.09.2021 21:05
      +1

      Я вот думаю всё - а не сделать ли обёртку-фс, которая будет закидывать всё в csync2, к примеру. Или всё же с inotify заставить это работать. Помнится я пытался с lsyncd-csync2 всё сделать. Но эта собака как-то умудрялась убивать права доступа на master-master синхронизации, скидывая на root (в момент создания файла csync'ом, чтоль подхватывала и обратно запуливала?)


      1. alex_shpak
        25.09.2021 21:37
        +2

        Да, было бы интересно. Впрочем, с csync я не работал.

        Насчёт inotify - вариант, но не знаю, всем ли подойдёт - насколько я понимаю, там устанавливается отдельный watcher для каждого каталога, и количество таких watcher'ов ограничено (хотя можно и увеличить).


        1. hiewpoint
          27.09.2021 11:28

          Не работает inotify на FUSE вообще.


    1. INSTE
      26.09.2021 08:44
      +1

      Кстати в стандартной библиотеке есть man7.org/linux/man-pages/man3/bsearch.3.html


    1. sim2q
      27.09.2021 00:29
      +1

      Держу в уме - сделать для торрентов что бы не держать для каждой раздачи копию, раздачи (почти всё музыка) могут пересекаться (например - разные версии lable pack), также очень частая ситуация когда один и тот же файл, но с разными заголовками. Начать наверное просто с линков можно, но это скучно:)


      1. mpa4b
        27.09.2021 15:59

        попробуйте утилиту https://github.com/pauldreik/rdfind


        1. sim2q
          28.09.2021 14:04

          глянул в описании, даже собрал - благо было в репозитории - не совсем то.
          в кратце что хотелось бы: каждый уважающий себя пират в перераздаче, лепит в тэгах свой (copyleft) [зло!] меняя или даже добавляя инфо фрейм[ы], тогда как фреймы самого потока не тронуты (речь об mp3,mpeg*,flac и...jpg) также всякие плееры могут добавлять что-то своё. идея проста - сохраняются лишь diff-ы и оригинальный поток (заголовок и сигнальные фреймы), благо сделать это легко, так как точно известно где начало и конец. На фоне дисков в десятки тыр это может и не так актуально. Но вот в целом для траффика - если затащить эту фичу в торренты, будет интересней.
          В новой версии вроде добавили лишь только отдельное кодирование файлов, что недостаточно.


  1. AlexanderS
    26.09.2021 00:57
    +8

    Я опять купился на заголовок. И ведь даже читал!

    «FUSE в Linux… есть ли что-то подобное в Windows?.. Называется оно WinFsp… Правда, прямой совместимости с FUSE у него нет. Но имеются слои совместимости с FUSE (один — для версии 2.8, и ещё один — для версии 3.2), которые упрощают портирование существующего FUSE-кода на WinFsp».


    1. INSTE
      26.09.2021 08:47

      Несмотря на compat layer нельзя не отметить, что большинство fuse-фс или сделаны для работы в posix-среде, или завязаны на специфичные для linux api, или на библиотеки навроде glib, которые в винде еще надо умудриться собрать.


    1. Evengard
      26.09.2021 09:35
      +4

      Я честно говоря был уверен что тут будет рассказано про способ смонтировать fuse-фс через WSL на хост-винду...


      1. kle6ra
        27.09.2021 11:27

        Как минимум вариант для ext форматов есть: Paragon ExtFS for Windows


        1. Evengard
          29.09.2021 22:22

          На самом деле с помощью такой то матери прокинуть fuse файловую систему через
          WSL даже на директорию теоретически возможно, но геморно...


  1. darkdaskin
    27.09.2021 02:45

    Заголовок выглядит так, как будто появилось что-то новое. По факту я уже писал ФС на Dokan более 5 лет назад, а первая версия WinFSP вышла через год после этого. А аналогичные проприетарные библиотеки были и 10 лет назад.
    Я тогда примонтировал зеркало Linux на несколько ТБ по HTTP и расшарил всё это в DC++, чтобы попасть в топ на локальном сервере провайдера и получить скидку на интернет. Писал на C#.


    В последствии нашёл более удобным вариант создания пользовательских ФС на основе WebDAV, их можно примонтировать как диск штатными средствами различных ОС, а также подключаться к ним удалённо. Возможностей меньше, но для большинства применений достаточно.


  1. vit1251
    27.09.2021 14:54

    Прочитал статью и подумал, что в базовой системе от Microsoft начали делать что-то для программистов удобное и полезное, то есть пытаются расположить к себе программистов, но я ошибся. Кстати жти решения Dokan иWinFSP создает сторонние разработчики, а не сама компания Microsoft?


    1. a-tk
      01.10.2021 11:48

      От M$ есть WDK, там всего хватает. Но геморно, да.