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
1MB
21K SLoC
ZboxFS
ZboxFS 是一个零细节、注重隐私的内置文件系统。它的目标是帮助应用程序安全、私密、可靠地存储文件。通过将文件和目录封装到加密仓库中,它提供虚拟文件系统和授权应用程序的独家访问。
与其他系统级文件系统(如 ext4、XFS 和 Btrfs)不同,后者为多个进程提供共享访问,ZboxFS 是一个与应用程序在同一内存空间运行的文件系统。它每次只提供对一个进程的访问。
通过抽象 IO 访问,ZboxFS 支持多种底层存储层,包括内存、操作系统文件系统、RDBMS 和键值对象存储。
免责声明
ZboxFS 正在积极开发中,我们对其使用造成的数据丢失或泄露不承担责任。请务必备份您的文件,并在自行承担风险的情况下使用!
功能
- 所有内容都加密 🔒,包括元数据和目录结构,不会向底层存储泄露任何知识
- 最先进的加密技术:AES-256-GCM(硬件)、XChaCha20-Poly1305、Argon2 密码散列等,由 libsodium 提供
- 支持多种底层存储,包括内存、操作系统文件系统、RDBMS、键值对象存储等
- 将文件和目录打包到相同大小的块中,以消除元数据泄露
- 基于内容的重复数据消除和基于文件的重复数据消除
- 使用 LZ4 在快速模式下进行数据压缩,可选
- 通过认证加密原语(AEAD 密码)保证数据完整性
- 文件内容版本控制
- 写时复制(COW 🐮)语义
- ACID 事务操作
- 使用 Rust 编写 💖
比较
许多操作系统级别的文件系统支持加密,例如 EncFS、APFS 和 ZFS。一些磁盘加密工具也提供了虚拟文件系统,例如 TrueCrypt、LUKS 和 VeraCrypt。
此图显示了 ZboxFS 与它们的区别。
以下是功能比较列表。
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更加容易。请查看每个仓库以获取更多详细信息。
-
zboxfs/base Linux上构建ZboxFS的基础镜像
-
zboxfs/wasm 用于构建WebAssembly绑定的Docker镜像
-
zboxfs/nodejs 用于构建Node.js绑定的Docker镜像
-
zboxfs/android 用于构建Android Java绑定的Docker镜像
与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