Show HN:ZeroFS – 一个用于S3的日志结构文件系统
摘要
ZeroFS是一个日志结构文件系统,可将兼容S3的存储桶作为POSIX文件系统通过NFS和9P提供,或作为原始块设备,并具备压缩、加密和本地缓存以加快读取速度。它通过了广泛的POSIX和压力测试套件,包括内核构建和Jepsen故障转移测试。
暂无内容
查看缓存全文
缓存时间: 2026/07/02 14:06
# ZeroFS — 将S3作为主存储
来源: https://www.zerofs.net/
## 为S3打造的日志结构文件系统。
ZeroFS 通过 NFS 和 9P 协议将兼容 S3 的存储桶作为 **POSIX 文件系统** 提供服务,或通过 NBD 作为 **原始块设备**。其引擎采用 **日志结构**:写入以不可变对象形式保存,压缩整理(compaction)回收已删除内容。数据在上传前经过压缩和加密,热读取可在微秒级从本地缓存返回。
或通过 Docker (https://github.com/Barre/ZeroFS#via-docker)·GitHub Actions (https://github.com/Barre/zerofs#github-action)·其他平台 (https://www.zerofs.net/docs/quickstart#installation)
8,662¹
CI 中的 POSIX 套件测试
1.6μs²
随机读取,热缓存
0.83ms³
小型写入平均延迟
16EiB⁴
最大文件系统大小
¹ pjdfstest (https://github.com/Barre/pjdfstest_nfs) 在每次变更时运行。排除了少数 NFS/9P 无法表达的语义情况;排除列表在仓库中公开。
² SQLite 基准测试,ZeroFS 从本地缓存服务的随机读取。直接的 S3 往返为 50–300 毫秒。
³ 通过 NFS 进行文件追加,ZeroFS 基准套件 (https://www.zerofs.net/docs/zerofs-vs-juicefs);数据在 S3 中的静态存储。
⁴ 设计上可寻址:64 位 inode 和大小字段,32 KiB 范围。
01验证
## 测试套件在公共 CI 中运行。
CI 在每次变更时运行 pjdfstest、xfstests、内核构建、stress-ng、ZFS 清洗、Jepsen 的本地文件系统套件以及 Jepsen 故障转移套件。前三项分别在 NFS、9P 和 FUSE 客户端上运行。每张卡片链接到 CI 流水线。
### POSIX 语义 pjdfstest 套件在每次变更时运行,每个协议一次:权限、所有权、链接、重命名行为。排除列表(每个协议少数情况)已发布在仓库中。 pjdfstest 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### xfstests 内核文件系统测试套件在单独的工作流中通过 NFS、9P 和 FUSE 运行。这些是 ext4 和 XFS 自身用于验证的测试。 xfstests 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### ZFS 作为端到端测试 CI 在 ZeroFS 块设备上构建 ZFS 池,将 Linux 内核源码树解压到其中,然后运行完整清洗。清洗报告无校验和错误。 zfs-test 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### 内核构建 CI 在 NFS、9P 和 FUSE 挂载点上使用 `make -j$(nproc)` 编译 Linux 内核。并行编译是压力测试:多个进程同时写入同一个源码树。 kernel-compile 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### stress-ng 文件系统压力测试针对 CI 中的实时挂载点运行:access、chdir、chmod、chown 以及其余文件处理集,同时进行。 stress-ng 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### 基于模型的检查 Jepsen 的本地文件系统套件驱动一个 9P 挂载点,使用随机操作历史,并针对参考文件系统模型检查每个操作。崩溃模式在运行中杀死服务器,并验证恢复后的状态是否与最后一次 fsync 匹配。 jepsen 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### 故障注入下的故障转移 第二个 Jepsen 套件在 MinIO 上运行一个主节点和一个备用节点,然后在工作负载中杀死、重启和暂停主节点。它确认每次确认的写入在故障转移后仍然存在,并且恢复的文件系统保持一致。 jepsen-ha 工作流 → (https://github.com/Barre/ZeroFS/actions/workflows/ci.yml)### 自托管 Rust 工具链在 ZeroFS 自身服务的文件系统上构建 ZeroFS。这是一个录制的会话,而非 CI 任务。 观看录制 → (https://asciinema.org/a/728101)
02协议
## 通过 NFS 和 9P 的文件,通过 NBD 的块设备。
所有三个服务器在同一个用户空间进程中运行,针对同一个存储桶。客户端使用 Linux 中已有的 NFS 和 9P 支持、其他系统自带的 NFS 客户端,或使用 `nbd-client` 用于块设备。
文件 · 无处不在
### NFS
macOS、Linux、Windows 和 BSD 系列通过自身 NFS 支持挂载,客户端无需额外安装。服务器保持在用户空间。
``
# 从任何主流操作系统挂载
mount -t nfs 127.0.0.1:/ /mnt/zerofs
``
文件 · 精确
### 9P
9P 比 NFS 更严格地遵循 POSIX,并且 fsync 仅在数据到达稳定存储后才返回。捆绑的 FUSE 客户端无需 root 即可挂载,并能自动重新连接。
``
# 捆绑的 FUSE 客户端,无需 root
zerofs mount 127.0.0.1:5564 /mnt/zerofs
``
块 · 原始
### NBD
存储在存储桶中的原始块设备可以承载 ext4 文件系统、ZFS 池或虚拟机启动磁盘。新设备在运行时即可被识别,无需重启服务器。
``
# 附加一个块设备
nbd-client 127.0.0.1 10809 /dev/nbd0 -N vol1
``
**运行于**Amazon S3Google Cloud StorageAzure Blob任何兼容 S3 的存储本地磁盘
03地理分布
## 跨三个 S3 区域的 ZFS 镜像。
每个 ZeroFS 实例将一个 S3 区域暴露为块设备。对于 ZFS 而言,它们就是普通磁盘,因此跨大洲的镜像设置方式与任何其他池相同。
global-pool — zsh
$nbd-client 10.0.1.5 10809 /dev/nbd0 -N storage -persist # us-east
$nbd-client 10.0.2.5 10809 /dev/nbd1 -N storage -persist # eu-west
$nbd-client 10.0.3.5 10809 /dev/nbd2 -N storage -persist # ap-southeast
$zpool create global-pool mirror /dev/nbd0 /dev/nbd1 /dev/nbd2
$zpool status global-pool | grep state
state: ONLINE
如果某个区域不可达,池会降级,但**数据仍可从其他两个区域获取**。
04特性
## 存储引擎的九大属性。
04.1
### 始终加密
每个块在上传前均使用 XChaCha20-Poly1305 加密。数据密钥使用 Argon2id 从您的密码派生的密钥进行包装。没有未加密模式。
04.2
### 压缩
数据在加密前使用 zstd 或 lz4 压缩。编解码器可在任意时刻变更而无需迁移,因为现有数据的编解码器会在读取时自动检测。
04.3
### 缓存
可配置的内存和磁盘缓存保存最近使用的块。热读取可在微秒级返回。直接的 S3 往返需要 50 到 300 毫秒。
04.4
### 检查点
命名检查点可捕获文件系统在某个时间点的快照。任何检查点都可以在启动时通过一个标志以只读方式打开。
04.5
### 只读副本
一个实例写入,同时只读实例服务同一个存储桶。副本会自动获取写入者的变更,并在写入时返回 EROFS。
04.6
### TRIM 支持
来自任何文件系统或 zpool 的丢弃操作会释放相应的范围。压缩整理会重新打包有效数据并从 S3 删除已清空的段,从而释放的块不再计费。
04.7
### 不可变段
文件数据被打包成 32 KiB 的范围,放在不可变段对象内,通过独立的元数据索引寻址。没有任何东西在原地重写,因此检查点和只读副本能看到存储桶的一致视图。
04.8
### 诚实的 fsync
成功的 fsync 意味着所有确认的写入在 S3 中都是持久的。如果故障转移可能导致未刷新的写入丢失,下一次 fsync 将返回错误而不是虚假的成功。
04.9
### 高可用性
一个可选的备用节点通过同一个存储桶跟踪主节点,并在主节点故障时自动接管。当两者连接时,备用节点还持有主节点已确认但尚未刷新的写入,因此故障转移会保留它们。
05Web 界面
## 一个配置节即可添加 Web 控制台。
启用 `[servers.webui]` 后,同一个进程将提供控制台:一个通过 WebSocket 运行 9P 的文件管理器、一个通过 gRPC-web 流式传输统计数据的仪表盘,以及一个启动基于该挂载点的 Linux 虚拟机的终端。
**拖放上传**支持文件和整个文件夹,通过 9P 写入存储桶。
06录制
## 四个录制的终端会话。
这些是 asciinema 录制的真实终端会话,以文本而非视频形式呈现。播放时会将空闲暂停缩短至两秒,其余不变。
**Linux 内核在 ZeroFS NBD 卷上的 ZFS 中于 16 秒内完成编译**。
相似文章
F* 文件系统——直接绕过操作系统内核读取SSD的文件搜索
一款名为 ffs 的 CLI 工具,通过直接读取磁盘来搜索文件,绕过操作系统内核的 VFS 层,在处理大型、未缓存目录时相比 ripgrep 等工具具有潜在的速度优势。支持 ext4、btrfs 和 APFS 文件系统。
介绍 Flink 原生 S3 文件系统:专为性能打造,为生产环境设计
Apache Flink 2.3 引入了 flink-s3-fs-native,这是一个新的无 Hadoop 依赖的 S3 文件系统插件,它提供最高两倍速度的检查点、精确一次写入的 Sink,并消除了 Hadoop 依赖和 CVE 分类处理。它已在多家大公司的生产环境中使用。
littlefs的设计
littlefs是一个专为微控制器设计的故障安全文件系统,具有掉电恢复能力、动态磨损均衡以及有限的RAM/ROM。它提供类似POSIX的API,并用C语言编写,以实现较小的内存占用。
Show HN: Z-Jail – 一个130KB的Linux沙箱-C99,具有7层防御且无依赖项
Z-Jail 是一个轻量级Linux沙箱,采用C99编写,拥有七层防御、无外部依赖,且二进制文件极小(约130 KiB),专为CI、CTF和轻量级评估中的安全代码执行而设计。
我们通过删除文件系统使其速度提升了47倍
microsandbox将其缓慢的用户空间FUSE文件系统替换为内核挂载的EROFS磁盘映像,在文件系统操作上实现了几何平均47倍的速度提升,并消除了虚拟机/主机往返瓶颈。