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 КиБ. Каждый экстент проходит последовательный конвейер обработки:
- Сжатие данных: Экстент сжимается алгоритмом zstd (настраиваемые уровни от 1 до 22) или lz4, что снижает объемы сетевого трафика и затраты на хранение.
- Шифрование: Сжатый экстент шифруется аутентифицированным алгоритмом XChaCha20-Poly1305. Мастер-ключ шифрования защищен устойчивой к перебору функцией Argon2id, за счет чего данные попадают в облачный провайдер исключительно в защищенном виде.
- Упаковка в сегменты: Обработанные экстенты объединяются в неизменяемые сегменты (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 для предотвращения потери нескоммиченных экстентов.

