Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Иллюстрация к статье о файловой системе ZeroFS для S3

ZeroFS: как превратить S3 в POSIX-файловую систему и NBD-диски с шифрованием и сжатием

Открытая логово-структурированная файловая система ZeroFS превращает S3-хранилища в производительные точки монтирования POSIX по NFS и 9P, а также в блочные диски NBD. Технология поддерживает шифрование XChaCha20, сжатие zstd, встроенную сборку мусора, защиту от сплит-брейна и детерминированное тестирование Jepsen.

ZeroFS: как превратить S3 в POSIX-файловую систему и NBD-диски с шифрованием и сжатием

Объектные хранилища стандарта Amazon S3 давно стали основным способом хранения неструктурированных данных в облачной инфраструктуре благодаря масштабируемости и низкой стоимости. Однако стандартные приложения, базами данных, системные утилиты и сборщики проектов рассчитывают на традиционный файловый интерфейс POSIX — со стандартами открытия файлов, быстрой навигацией по каталогам, произвольной перезаписью байтовых диапазонов и точными гарантиями сброса данных на диск (fsync). Простая установка FUSE-надстроек поверх S3 часто приводит к низкой производительности, исчерпанию лимитов API и отсутствии полноценных гарантий целостности при сбоях.

Открытый проект ZeroFS (разрабатываемый разработчиком Barre под лицензией AGPLv3 и коммерческой лицензией) решает эту проблему за счет использования архитектуры логово-структурированной файловой системы (Log-Structured File System). Один процесс в пользовательском пространстве (userspace) преобразует бакет S3, Google Cloud Storage, Azure Blob или MinIO в производительные файловые точки монтирования по протоколам NFS и 9P, а также в виртуальные блочные диски NBD (Network Block Device), пригодные для форматирования в файловые системы ext4 или ZFS.

Архитектура: логово-структурированное хранение и сквозной конвейер

В отличие от традиционных утилит монтирования, которые пытаются отображать каждый файл POSIX напрямую в один S3-объект, ZeroFS полностью изолирует физическое представление данных от логической структуры файлов. Все поступающие данные разрезаются на фиксированные экстенты (extents) размером по 32 КиБ. Каждый экстент проходит последовательный конвейер обработки:

  1. Сжатие данных: Экстент сжимается алгоритмом zstd (настраиваемые уровни от 1 до 22) или lz4, что снижает объемы сетевого трафика и затраты на хранение.
  2. Шифрование: Сжатый экстент шифруется аутентифицированным алгоритмом XChaCha20-Poly1305. Мастер-ключ шифрования защищен устойчивой к перебору функцией Argon2id, за счет чего данные попадают в облачный провайдер исключительно в защищенном виде.
  3. Упаковка в сегменты: Обработанные экстенты объединяются в неизменяемые сегменты (segment objects) размером до 256 МиБ, которые затем загружаются в S3.

Вся служебная информация — индексные дескрипторы файлов (inode), структуры каталогов и 32-байтные указатели на каждый экстент — хранится в логово-структурированном дереве сопоставлений (LSM-tree, Log-Structured Merge-tree) прямо в том же объектном хранилище. Для работы ZeroFS не требуются внешние базы данных или сервисы реляционных метаданных. При удалении файлов указатели на экстенты помечаются мертвыми, а встроенный сборщик мусора (Garbage Collector) раз в 60 секунд перепаковывает сегменты и удаляет освободившиеся S3-объекты.

Протоколы доступа и сравнение способов монтирования

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

Протокол и транспортФормат доступа для клиентаНазначение и сценарииСемантика сброса и критические особенности
NFS (Network File System)Сетевая точка монтирования POSIXСтандартная совместимость с существующими сервисами и контейнерамиОперация fsync на клиентах Linux/macOS может возвращать управление до вызова COMMIT на S3. Не гарантирует полную долговечность без дополнительной настройки.
9P (9P2000.L.Z)Сетевой/Unix-сокет файловый mountВыполнение чувствительных к целостности файловых операцийПодтверждение fsync возвращается клиенту только после физического подтверждения записи в S3. Доступен нативный VFS-модуль ядра Linux.
NBD (Network Block Device)Блочное устройство /dev/nbdXСоздание файловых систем ext4, ZFS или использование сырых дисковПоддерживает команды TRIM/DISCARD, FLUSH и FUA. Изменение структуры тома меняет блоки на уровне сегментов ZeroFS.
Web UI и v86 VMБраузерный файловый менеджер и терминалИнспекция состояния, отладка и оперативное наблюдениеТерминал работает на базе встроенной эмулируемой виртуальной машины v86 по протоколу 9P-over-WebSocket без доступа к внешней сети.

Для достижения максимальной производительности в репозитории проекта поставляется нативный модуль виртуальной файловой системы (VFS) ядра Linux, расположенный в каталоге kernel/. Он обеспечивает работу протокола 9P2000.L.Z без накладных расходов подсистемы FUSE на архитектурах x86-64 и little-endian arm64, при этом стандартный FUSE-клиент zerofs mount остаётся доступен в качестве универсального резервного варианта.

Отказоустойчивость, лидирование и границы применения

ZeroFS поддерживает режим высокой доступности (High Availability) по схеме Active-Standby (Leader/Standby) над общим бакетом S3. В подключенном режиме (Connected) резервный узел получает дубликаты мутаций до отправки ответа клиенту. Если основной узел выходит из строя, резервный выполняет перехват инициативы (takeover) с использованием эпохи ограждения записей (fencing writer epoch). Это предотвращает ситуацию split-brain, когда два узла пытаются одновременно модифицировать метаданные хранилища.

При использовании хранилищ S3 без нативной поддержки условной записи (conditional put-if-not-exists) ZeroFS позволяет подключить внешнюю субд Redis для управления блокировками ограждения. При этом разработчики подчеркивают: режим HA повышает доступность сервиса монтирования, но не заменяет собой резервное копирование, так как бакет остается единой точкой хранения.

Надежность ZeroFS подтверждена детерминированным стресс-тестированием: система прошла 8 662 POSIX-теста из пакета pjdfstest_nfs, проверки xfstests, прогон полной сборки ядра Linux на смонтированном диске, тестирование ZFS scrub и инжекцию аварийных сбоев с помощью фреймворка Jepsen.

Ограничение по классу хранилищ: ZeroFS предназначена для работы с классами Hot и Standard S3. Категорически не рекомендуется использовать классы с платой за частый доступ (Infrequent Access) или архивные тарифы (Glacier/Archive): частые чтения метаданных и перепаковка экстентов приведут к кратному росту счетов за API-запросы.

Практическое руководство по развертыванию и настройке

Для успешного развертывания и безопасного монтирования ZeroFS воспользуйтесь пошаговой инструкцией.

1. Установка утилиты

В системах Debian/Ubuntu рекомендуется использовать официальный подписанный репозиторий:

sudo apt update && sudo apt install zerofs

Пакет создаст службу zerofs.service и шаблон конфигурации в /etc/zerofs/. Также доступна установка бинарного файла без прав root:

curl -sSfL https://sh.zerofs.net | VERSION=v1.2.5 INSTALL_DIR=$HOME/.local/bin sh

Либо запуск через официально собранный Docker-контейнер:

docker run --rm ghcr.io/barre/zerofs:latest init - > zerofs.toml
2. Подготовка файла конфигурации

Создайте файл zerofs.toml. Все секретные ключи и пароли шифрования должны передаваться исключительно через переменные окружения:

[cache]
dir = "/var/cache/zerofs"
disk_size_gb = 20.0
memory_size_gb = 2.0

[storage]
url = "s3://my-company-bucket/zerofs-data"
encryption_password = "${ZEROFS_PASSWORD}"

[filesystem]
compression = "zstd-3"

[servers.ninep]
addresses = ["127.0.0.1:5564"]

[servers.nbd]
addresses = ["127.0.0.1:10809"]

Перед запуском установите переменные окружения с реквизитами доступа к S3 и паролем шифрования:

export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
export ZEROFS_PASSWORD="UltraSecureEncryptionPassword123!"
3. Запуск и проверка монтирования

Запустите сервис ZeroFS в фоновом режиме или через systemctl:

sudo systemctl enable --now zerofs

Для монтирования файловой системы по протоколу 9P выполните команду:

mkdir -p /mnt/zerofs
zerofs mount 127.0.0.1:5564 /mnt/zerofs

Проверьте успешность создания и записи тестового файла:

echo "ZeroFS Storage Verification" > /mnt/zerofs/test.txt
cat /mnt/zerofs/test.txt
4. Подключение блочного устройства NBD

Для создания виртуального блочного диска размером 10 ГБ подготовьте экспорт и подключите клиент NBD:

truncate -s 10G /mnt/zerofs/.nbd/diska
sudo nbd-client 127.0.0.1 10809 /dev/nbd0 -N diska -persist -timeout 600 -connections 4

Смонтированное устройство /dev/nbd0 можно отформатировать в файловую систему ext4 и использовать как обычный локальный диск:

sudo mkfs.ext4 /dev/nbd0
sudo mkdir -p /mnt/block-disk
sudo mount /dev/nbd0 /mnt/block-disk

Перед отключением сервера или отмонтированием всегда выполняйте корректную отвязку устройства командой sudo nbd-client -d /dev/nbd0 для предотвращения потери нескоммиченных экстентов.