Show HN:ZeroFS – 一个用于S3的日志结构文件系统

Hacker News Top 工具

摘要

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 秒内完成编译**。

相似文章

littlefs的设计

Lobsters Hottest

littlefs是一个专为微控制器设计的故障安全文件系统,具有掉电恢复能力、动态磨损均衡以及有限的RAM/ROM。它提供类似POSIX的API,并用C语言编写,以实现较小的内存占用。

我们通过删除文件系统使其速度提升了47倍

Hacker News Top

microsandbox将其缓慢的用户空间FUSE文件系统替换为内核挂载的EROFS磁盘映像,在文件系统操作上实现了几何平均47倍的速度提升,并消除了虚拟机/主机往返瓶颈。