27 个版本

使用旧 Rust 2015

0.9.2 2021年9月7日
0.9.1 2020年1月29日
0.8.8 2019年12月26日
0.8.7 2019年10月12日
0.1.1 2017年5月11日

#356文件系统


被用于 nv

Apache-2.0 许可证

1MB
21K SLoC

Rust 16K SLoC // 0.1% comments C 5K SLoC // 0.2% comments

ZboxFS 标志 ZboxFS

GitHub action Crates.io Crates.io GitHub last commit license GitHub stars

ZboxFS 是一个零细节、注重隐私的内置文件系统。它的目标是帮助应用程序安全、私密、可靠地存储文件。通过将文件和目录封装到加密仓库中,它提供虚拟文件系统和授权应用程序的独家访问。

与其他系统级文件系统(如 ext4XFSBtrfs)不同,后者为多个进程提供共享访问,ZboxFS 是一个与应用程序在同一内存空间运行的文件系统。它每次只提供对一个进程的访问。

通过抽象 IO 访问,ZboxFS 支持多种底层存储层,包括内存、操作系统文件系统、RDBMS 和键值对象存储。

免责声明

ZboxFS 正在积极开发中,我们对其使用造成的数据丢失或泄露不承担责任。请务必备份您的文件,并在自行承担风险的情况下使用!

功能

  • 所有内容都加密 🔒,包括元数据和目录结构,不会向底层存储泄露任何知识
  • 最先进的加密技术:AES-256-GCM(硬件)、XChaCha20-Poly1305、Argon2 密码散列等,由 libsodium 提供
  • 支持多种底层存储,包括内存、操作系统文件系统、RDBMS、键值对象存储等
  • 将文件和目录打包到相同大小的块中,以消除元数据泄露
  • 基于内容的重复数据消除和基于文件的重复数据消除
  • 使用 LZ4 在快速模式下进行数据压缩,可选
  • 通过认证加密原语(AEAD 密码)保证数据完整性
  • 文件内容版本控制
  • 写时复制(COW 🐮)语义
  • ACID 事务操作
  • 使用 Rust 编写 💖

比较

许多操作系统级别的文件系统支持加密,例如 EncFSAPFSZFS。一些磁盘加密工具也提供了虚拟文件系统,例如 TrueCryptLUKSVeraCrypt

此图显示了 ZboxFS 与它们的区别。

Comparison

以下是功能比较列表。

ZboxFS 操作系统级别的文件系统 磁盘加密工具
加密文件内容 ✔️ 部分 ✔️
加密文件元数据 ✔️ 部分 ✔️
加密目录 ✔️ 部分 ✔️
数据完整性 ✔️ 部分 ✖️
进程共享访问 ✖️ ✔️ ✔️
数据去重 ✔️ ✖️ ✖️
压缩 ✔️ 部分 ✖️
内容版本控制 ✔️ ✖️ ✖️
COW语义 ✔️ 部分 ✖️
ACID事务 ✔️ ✖️ ✖️
多种存储类型 ✔️ ✖️ ✖️
API访问 ✔️ 通过VFS 通过VFS
符号链接 ✖️ ✔️ 依赖于内部文件系统
用户和权限 ✖️ ✔️ ✔️
FUSE支持 ✖️ ✔️ ✔️
支持Linux和macOS ✔️ ✔️ ✔️
支持Windows ✔️ 部分 ✔️

支持的存储

ZboxFS支持多种底层存储。默认启用内存存储。所有其他存储可以通过在构建ZboxFS时指定其相应的Cargo功能单独启用。

存储 URI标识符 Cargo功能
内存 "mem://" N/A
操作系统文件系统 "file://" storage-file
SQLite "sqlite://" storage-sqlite
Redis "redis://" storage-redis
Zbox云存储 "zbox://" storage-zbox-native

* 访问 zbox.io 了解更多关于Zbox云存储的信息。

规格

算法和数据结构
认证加密 AES-256-GCM 或 XChaCha20-Poly1305
密码散列 Argon2
密钥派生 BLAKE2B
内容去重 Rabin滚动哈希
文件去重 Merkle树
索引结构 日志结构合并树
压缩 LZ4在快速模式下

限制

限制
数据块大小 8 KiB
最大加密帧大小 128 KiB
超级块大小 8 KiB
最大文件名长度 无限制
目录条目中允许的字符 任何UTF-8字符除了/
最大路径名长度 无限制
最大文件大小 16 EiB
最大存储库大小 16 EiB
最大文件数 无限制

元数据

元数据
存储文件所有者
POSIX文件权限
创建时间戳
最后访问/读取时间戳
最后更改时间戳
访问控制列表
安全 与加密集成
扩展属性

能力

能力
硬链接
符号链接
区分大小写
保留大小写
文件更改日志 通过内容版本控制
文件系统级加密
数据去重
数据校验和 与加密集成
离线增长
在线增长 自动
离线收缩
在线收缩 自动

分配和布局策略

功能
地址分配方案 仅追加,线性地址空间
稀疏文件
透明压缩
扩展
写时复制

存储碎片化

碎片化
内存存储
文件存储 碎片单元大小 < 32 MiB
RDBMS存储
键值存储
Zbox云存储 碎片单元大小 < 128 KiB

如何使用

有关参考文档,请访问 文档

要求

支持的平台

  • 64位基于Debian的Linux,如Ubuntu
  • 64位macOS
  • 64位Windows
  • 64位Android,API级别 >= 21

32位和其他操作系统目前不支持。

用法

将以下依赖项添加到您的 Cargo.toml

[dependencies]
zbox = "0.9.2"

如果您不想自己安装libsodium,只需在依赖项中指定 libsodium-bundled 功能,它将自动下载、验证和构建libsodium。

[dependencies]
zbox = { version = "0.9.2", features = ["libsodium-bundled"] }

示例

extern crate zbox;

use std::io::{Read, Write, Seek, SeekFrom};
use zbox::{init_env, RepoOpener, OpenOptions};

fn main() {
    // initialise zbox environment, called first
    init_env();

    // create and open a repository in current OS directory
    let mut repo = RepoOpener::new()
        .create(true)
        .open("file://./my_repo", "your password")
        .unwrap();

    // create and open a file in repository for writing
    let mut file = OpenOptions::new()
        .create(true)
        .open(&mut repo, "/my_file.txt")
        .unwrap();

    // use std::io::Write trait to write data into it
    file.write_all(b"Hello, World!").unwrap();

    // finish writing to make a permanent content version
    file.finish().unwrap();

    // read file content using std::io::Read trait
    let mut content = String::new();
    file.seek(SeekFrom::Start(0)).unwrap();
    file.read_to_string(&mut content).unwrap();
    assert_eq!(content, "Hello, World!");
}

使用Docker构建

ZboxFS自带Docker支持,这使得构建ZboxFS更加容易。请查看每个仓库以获取更多详细信息。

与libsodium进行静态链接

默认情况下,ZboxFS与libsodium链接时使用动态链接。如果您想更改此行为并使用静态链接,可以启用以下两个环境变量。

在Linux/macOS上,

export SODIUM_LIB_DIR=/path/to/your/libsodium/lib
export SODIUM_STATIC=true

在Windows上,

set SODIUM_LIB_DIR=C:\path\to\your\libsodium\lib
set SODIUM_STATIC=true

然后重新构建代码。

cargo build

性能

性能测试是在配置如下Macbook Pro 2017笔记本电脑上运行的。

配置
处理器名称 Intel Core i7
处理器速度 3.5 GHz
处理器数量 1
总核心数 2
L2缓存(每核心) 256 KB
L3缓存 4 MB
内存 16 GB
操作系统版本 macOS High Sierra 10.13.6

测试结果

读取 写入 TPS
基线(memcpy) 3658.23 MB/s 3658.23 MB/s N/A
基线(文件) 1307.97 MB/s 2206.30 MB/s N/A
内存存储(无压缩) 605.01 MB/s 186.20 MB/s 1783 tx/s
内存存储(压缩) 505.04 MB/s 161.11 MB/s 1180 tx/s
文件存储(无压缩) 445.28 MB/s 177.39 MB/s 313 tx/s
文件存储(压缩) 415.85 MB/s 158.22 MB/s 325 tx/s

要在自己的计算机上运行性能测试,请按照CONTRIBUTING.md中的说明操作。

贡献

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,如Apache-2.0许可证中定义的,应按上述方式许可,无任何附加条款或条件。

请阅读CONTRIBUTING.md以了解我们的行为准则以及向我们提交拉取请求的流程。

社区

许可证

ZboxFS采用Apache 2.0许可证 - 请参阅LICENSE文件以获取详细信息。

依赖项

~4–25MB
~390K SLoC