# Virtual Distributed File System

<https://habr.com/ru/companies/first/articles/678818/>

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-8df8a683f0df35b77a0430ab24c7d1bb7e5b2b46%2Fxnqhjup167y6klleamdu3wye1zu.png?alt=media)

В наше время почти у каждого скопилось несколько гигабайт (или терабайт) резервных копий и личных документов. Всё это зачастую хранится в зашифрованном виде на нескольких накопителях и в нескольких облаках.

Создаваемые нами данные — это наше наследие, которое надолго переживёт нас. По идее, личная информация не должна быть никак привязана ни к какому конкретному облаку, провайдеру или компании. Хорошо бы иметь возможность свободной замены облачных сервисов в своём личном наборе. В идеале — составить общую «файловую систему», куда можно в любой момент добавить/удалить Google Drive, Яндекс.Диск, [YouTube Drive](https://habr.com/ru/company/first/blog/676282/) или другие бесплатные файлохостинги. Главное, чтобы данные были размазаны по всему пространству и оставались независимы от конкретного провайдера.

Но зачастую разные облака плохо совместимы друг с другом, ведь это конкурирующие экосистемы. Они не поддерживают единый API, синхронизацию и так далее. К счастью, есть сторонние инструменты для решения этой проблемы.

Давайте рассмотрим ниже некоторые полезные программы, которые помогают управлять архивом данных, распределённому по множеству устройств и облаков:

## Файл-менеджер на распределённой файловой системе

Файл-менеджер [Spacedrive](https://github.com/spacedriveapp/spacedrive) — это опенсорсный кросс-платформенный файл-менеджер на файловой системе VDFS, который ставит задачей объединить в едином интерфейсе файлы из разных сервисов и разных файловых систем, в том числе из разных облаков. Грубо говоря, объединить в одном окошке облачные сервисы, которые официально не умеют друг с другом взаимодействовать, не имеют общих API и др.

Разработка программы ещё не закончена, но обещают выпустить клиенты под Windows, Linux, MacOS, iOS, watchOS и Android. Можно записаться в [список ожидания](https://www.spacedrive.com/), чтобы вас первым оповестили о релизе.

Файл-менеджер будет выглядеть примерно таким образом:

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-528baf515bd6781e0c424d0c7046be161a6dc653%2Fqs1dikaf6cs9ebzhgcmh3xrmjfm.png?alt=media)

## Что такое VDFS

Отдельно нужно сказать пару слов о VDFS (virtual distributed filesystem) — виртуальной распределённой файловой системе, написанной на Rust. Это фундамент, на котором базируется Spacedrive.

VDFS предоставляет единый API для доступа к файлам на всех ваших устройствах (смартфоны, персональные компьютеры, серверы) и облачных дисках. То есть это единый интерфейс, который ведёт виртуальный индекс всех мест хранения файлов, а также синхронизирует БД между клиентами в режиме реального времени. Данная реализация использует архитектуру [CAS](https://en.wikipedia.org/wiki/Content-addressable_storage) (Content-addressable storage, контентно-адресуемое хранилище данных) для уникальной идентификации файлов, сохраняя логические пути файлов относительно мест хранения.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-7a3ab58114c2c6eca4852f2f5c277eb9ff29f67f%2Fuuhqevwrbozc3izy31unmsem4ho.png?alt=media)

Первую реализацию VDFS можно найти в [статье Хаоюана Ли](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2018/EECS-2018-29.pdf) из Калифорнийского университета в Беркли. Там предполагается использовать VDFS в облачных хранилищах, но ничто не помешает перенести концепцию в клиентский софт, что и делается в Spacedrive.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-639294e4950781e57f0d1d82ff1918e1b132beff%2Frk4t6rmljnauycz-hpdxam-u9ai.png?alt=media)

Spacedrive находится в активной разработке, а большинство функций или в статусе «экспериментальная», или ещё не реализованы, а только запланированы.

На данный момент реализовано следующее (в стадии тестирования):

* обнаружение файлов (сканирование всех устройств, дисков и облачных аккаунтов для создания каталога всех файлов с метаданными);
* генерация превью (автоматическое создание маленьких превью для изображений и видео);
* статистика (общий объём, размер индекса, свободное пространство и другое).

В планах на ближайшее время:

* файл-менеджер — просмотр онлайн- и офлайн-хранилищ, файлов с метаданными, базовые функции CRUD (файл-менеджер разрабатывается прямо сейчас, к моменту публикации статьи может быть готов);
* синхронизация в реальном времени (тоже в разработке прямо сейчас);
* фото- и видеоальбомы;
* поиск по файловой системе;
* теги для автоматизации рабочих процессов, массовых операций с группами файлов, организации фотоколлекций;
* расширения (интеграция сторонних сервисов и расширение функциональности Spacedrive).

В более отдалённых планах:

* интеграция облаков — Apple Photos, Google Drive, Dropbox, OneDrive, создание API для добавления других облаков, таких как Яндекс.Диск;
* зашифрованные хранилища, модуль поверх VeraCrypt;
* менеджер ключей;
* установка коэффициента избыточности для файлов, мониторинг состояния устройств и накопителей;
* таймлайн/версионность (просмотр файловой системы за любой момент времени в прошлом);
* кодер аудио- и видеофайлов на базе FFMPEG в разные форматы с поддержкой тегов;
* воркеры (распределение вычислений по нескольким своим устройствам во время кодирования или других ресурсоёмких вычислений);
* бесплатный хостинг Spacedrive Cloud на своём сервере (или платная подписка).

В общем, задача Spacedrive понятна: объединить все облака в едином интерфейсе, удобном для пользователя. Идея красивая.

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

## Шифрование файлов в своём облаке

[Cryptomator](https://cryptomator.org/) — удобная программа для шифрования файлов, которые хранятся на облачном хостинге. В то время как Spacedrive только обещает реализовать модуль шифрования в своём файл-менеджере, здесь всё уже готово и работает.

Можно создать зашифрованное хранилище файлов всего в несколько щелчков мыши:

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-0a5ac865487ed80b588ca265de43ebe967949fab%2Fdzas6evossfeo9cy81k1piepslm.png?alt=media)

Хранилище открывается в файл-менеджере после введения пароля, его можно просматривать и добавлять файлы. А само хранилище легко скопировать на любое облако — это просто папка с `vault.cryptomator` и зашифрованными файлами в формате `*.c9r`.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-880cda5bac329bff30299627f2be43e33e5f5cdb%2Fugtnkg1fzq49ta-aw9ishptsi4a.png?alt=media)

Под Windows для более удобной работы рекомендуется скачать и установить сторонний драйвер [WinFsp](https://winfsp.dev/rel/) (Windows File System Proxy). Это своеобразный аналог FUSE для Unix, который упрощает работу сторонних файловых систем под Windows.

В качестве более простой альтернативы, которая работает из командной строки, можно рекомендовать [gocryptfs](https://github.com/rfjakob/gocryptfs) (Linux), [cppcryptfs](https://github.com/bailey27/cppcryptfs) (Windows) или [DroidFS](https://github.com/hardcore-sushi/DroidFS) (Android). Всё это оверлейные зашифрованные файловые системы, которые прозрачно работают поверх основной ФС, что очень удобно — со стороны они выглядят как обычные папки и обычные файлы, только со странными названиями и нечитаемым содержимым.

В целом, это более простая альтернатива команде [crypt](https://rclone.org/crypt/), которая поддерживается в `rclone`.

## Копия облака в другом облаке

Как дома, так и в других местах, файлы с одного сервера дублируются на другом для надёжности, так и в интернете на каждое облако нужно второе, резервное. Это элементарная безопасность.

Некоторые даже бизнес-модель построили на этой идее. Например, сервис [rsync.net](https://rsync.net/) предлагает облачное хранилище и *удобный бэкап других облаков* с помощью стандартных linux-инструментов типа [borg](https://www.borgbackup.org/), [restic](https://restic.net/), [rclone](https://rclone.org/), [git-annex](https://git-annex.branchable.com/) и др.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-7b0b6776bc0d725b117f86cbf58c40ce9055cd69%2Fhzqdru8wx6ydbpcagequ5jprm7w.png?alt=media)

По сути, *rsync.net* предоставляет клиенту пустую файловую систему UNIX и доступ к ней по SSH. Никаких обвесистых клиентов GUI или API, всё работает настолько просто, насколько просто выглядит. Это удалённая файловая система, доступная из локальной консоли. Дата-центр даже не использует [ни файрволов, ни маршрутизаторов](https://console.dev/qa/rsync-john-kozubik/), потому что в них «нет особой необходимости». Просто стоят серверы FreeBSD, набитые накопителями с файловой системой ZFS — одно огромное файлохранилище.

Вообще, серверы у них сконфигурированы довольно интересно: это в основном корпуса 4U типа JBOD (just a bunch of disks), куда втиснуто от 45 до 60 накопителей SSD в каждый. Массивы накопителей подключаются к управляющим хед-юнитам 2U, в которых установлено 16 SSD, в том числе два загрузочных и 14 для кэшей на чтение (L2ARC) и запись (SLOG). Специфика файловой системы ZFS такова, что требуется много оперативной памяти, поэтому хед-юниты поддерживают до 2 ТБ.

Такое удалённое файлохранилище легко интегрировать в любую файловую систему, примонтировав его как накопитель под Windows, macOS или Linux. Например, назначить [букву диска под Windows](https://www.rsync.net/resources/howto/windows_map.html).

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-aadfb74780f0b99e228c2c958228605d674e977c%2Fzit8d3v0gfo9khmwk7hziffuw-k.png?alt=media)

Это хранилище специально для резервных копий, чтобы сбрасывать туда бэкапы с локальной системы, с продакшна или из облака. В последнем случае мы получаем копию одного облака в другом облаке. Тоже шаг к нашей цели — гибридной архитектуре из нескольких облаков, хотя шаг немного с другой стороны.

В свою очередь, [rclone](https://rclone.org/) — утилита командной строки, которая позволяет управлять файлами практически на любом облачном хостинге. Сейчас поддерживается [более 40 облачных провайдеров](https://rclone.org/#providers), включая хранилище объектов S3, хранилища Yandex Disk, Mail.ru Cloud, Microsoft OneDrive, Dropbox, Google Drive и другие.

В общем, `rclone` в облаке — это эквивалент локальным unix-командам rsync, cp, mv, mount, ls, ncdu, tree, rm и cat. Утилита также позволяет примонтировать облачное хранилище в виде локального диска под Windows, macOS, Linux или FreeBSD.

## Децентрализованная архитектура на основе ячеек

Итак, мы сформулировали парадигму «персонального хранилища», которое состоит из разных облаков, множества личных устройств и накопителей. Все файлы распределяются по носителям/облакам с указанной степенью избыточности, но доступны из единого «окна».

Как видим, постепенно появляются инструменты, которые поддерживают эту парадигму. В неё вписывается модель независимых «персональных подов» с личной информацией — концепция [SOLID](https://solid.mit.edu/) от Тима Бернерса-Ли.

Всё это может работать в децентрализованной системе, где независимые модули осуществляют коммуникацию друг с другом по открытым стандартам и протоколам, поддерживающим связь всех со всеми.

Такая система напоминает ещё одну интересную концепцию из области бизнеса — [децентрализованную архитектуру организации на основе ячеек](https://gitlab.com/johnmkane/tech-recipe-book/-/blob/main/Book/Architect/Cloud%20Storage/Virtual%20Distributed%20File%20System/reference-architecture-cell-based/README.md), Cell-Based Architecture.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-90a93a056c4c811a6fb58d23288b92035e0f51a8%2Fme5onvdk0tkddhawugpufaezfww.png?alt=media)

Это облачная инфраструктура для современных цифровых компаний, созданная по образцу Agile, микросервисов и многоклеточных организмов в биологии.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-52535d18b69083455ec7b2287dc2c84adc018dee%2Fs3betgj8jgrqzwv8m29oylork9o.png?alt=media)

В современных компаниях новая архитектура призвана заменить многоуровневую или сегментированную структуру с отделами и подразделениями.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-ee2ca2f54b1e300600a88ba07fb0c0ed6c264b6a%2Fx35yhb9rgjbyzhrll4rvkdakamo.png?alt=media)

В принципе, это очень красивая концепция. Поскольку мы и сами — многоклеточные существа, то идея с относительно независимыми клетками в рамках единого организма уже доказала свою эффективность. MVP готов. Поэтому можно предположить, что и микросервисы в рамках одного приложения тоже будут отлично работать, и независимые ячейки в рамках организации, и независимые облачные хостинги в одном окошке.
