F* 文件系统——直接绕过操作系统内核读取SSD的文件搜索
摘要
一款名为 ffs 的 CLI 工具,通过直接读取磁盘来搜索文件,绕过操作系统内核的 VFS 层,在处理大型、未缓存目录时相比 ripgrep 等工具具有潜在的速度优势。支持 ext4、btrfs 和 APFS 文件系统。
查看缓存全文
缓存时间: 2026/06/23 22:46
dmtrKovalenko/ffs 来源:https://github.com/dmtrKovalenko/ffs # FFS - 见鬼的文件系统
这是一个用于搜索文件的命令行工具(类似 grep),但它不通过操作系统内核来读取文件,而是直接读取你的磁盘。它实际上没什么用,但酷得要命。
这仅仅约 1500 行 C 代码,它:
- 仅在读取原始设备节点(例如
/dev/rdisk*)时需要 sudo;搜索镜像文件不需要提权 - 需要在 macOS 主磁盘上运行时关闭 SIP 保护
- 可能会遗漏一些最近写入的文件(需要手动调用
sync) - 在高度动态的文件系统中,当其他系统组件正在写入文件时,可能无法正确搜索目录树
- 仅支持本项目手动实现的文件系统
- 同时,直接从你的磁盘块读取数据
- 绕过 VFS / 带缓存的
read()路径,直接通过pread读取块设备 - 相比于 ripgrep,文件越多,渐进式地更快
- 可以搜索未挂载的卷
- 只解析二进制数据块
- 检测并跳过二进制文件
- 通过 openmp 将负载分散到所有核心上
在 Linux 上支持的文件系统
基本上,在 Linux 上实现任何文件系统都比较容易
Ext4 ./fs/ext4.c
这是最容易支持的文件系统:它是一个原地写入(无写时复制)的日志文件系统,因此大部分时候它是 ffs 的最佳选择。有时你可能会发现 ffs 看不到某些最近的文件更新,这可能是因为内核将最近的更新保存在缓存中,延迟写入磁盘。你可以通过 sync 命令强制同步
Btrfs ./fs/btrfs.c
B-树文件系统要复杂得多,是一种更高效的存储方式,并且带来额外的限制:当文件系统上的任何文件更新时,整个超级块也需要更新。这意味着如果 ffs 读取了超级块(高级 B-树),之后内核更新了树——整个读取就失效了。可以通过 fsfreeze(https://man7.org/linux/man-pages/man8/fsfreeze.8.html)或者创建一个独立的分离卷来绕过
Apfs (MacOS) ./fs/apfs.c
APFS 是苹果实现的专有文件系统,已被逆向工程并在此得到支持,但苹果显著加强了安全策略。你无法在不关闭 SIP 的情况下在主磁盘上运行 ffs
SIP(系统完整性保护)是一项特殊的安全功能,即使是 root 用户也禁止访问主磁盘的超级块。即使使用 sudo 也无法绕过;你必须禁用此功能(如果你使用像 yabai 这样的项目,可能已经禁用了)。有一种方法可以在不接触主磁盘的情况下测试 ffs:你可以直接搜索原始 .dmg 文件,无需任何提权(没错,应用安装程序就是分离的卷)。使用 ffs,你无需挂载任何东西,只需提供卷的原始字节路径以及文件系统类型即可:
ffs "" /path/to/volume.dmg apfs
搜索分离卷
由于 ffs 直接读取字节,你可以用它搜索任何未挂载到文件系统的分离卷。例如,读取 .iso 或 .dmg 文件。
速度
这是最有趣的部分——ffs 无法访问 VFS / 内核文件系统缓存。因此在较小(或已被缓存)的目录上它会较慢,但当缓存耗尽且内核不得不去读取实际的磁盘状态时,它会逐渐变快。为什么?正是为了证明在某个点上内核 VFS 成为一种开销。以下是在 btrfs 挂载驱动上对比 ffs 与 ripgrep 的搜索结果。请注意,ripgrep 使用更先进的 SIMD 匹配器和文件遍历器,而 ffs 只有约 1800 行 C 代码。
[repos — 631k 个文件]
ffs |#### | 5.505s
rg |### | 4.813s
[dev — 1.50M 个文件]
ffs |############ | 18.413s
rg |################# | 25.673s
[home — 3.25M 个文件]
ffs |######################## | 36.205s
rg |##################################################| 74.690s
ripgrep 使用的标志是 -F --no-heading -H -n --no-ignore --hidden --one-file-system --no-messages —— 这样它与 ffs 输出相同的结果。
构建项目
编译项目需要 libzstd(用于 btrfs)、openmp(在 pkg-config 中),然后只需:
make ffs
ffs --help
相似文章
Show HN:ZeroFS – 一个用于S3的日志结构文件系统
ZeroFS是一个日志结构文件系统,可将兼容S3的存储桶作为POSIX文件系统通过NFS和9P提供,或作为原始块设备,并具备压缩、加密和本地缓存以加快读取速度。它通过了广泛的POSIX和压力测试套件,包括内核构建和Jepsen故障转移测试。
dmtrKovalenko/fff
fff 是一个快速、抗拼写错误的文件搜索工具包,采用 frecency 排序并配备面向 AI 代理的 MCP 服务器,提供高效的、具备 Git 感知的文件与内容搜索功能。
ZeroFS 与 Amazon S3 Files 对比
ZeroFS 与 Amazon S3 Files 的技术对比,这两个系统都提供基于对象存储的 POSIX 文件系统。文章重点介绍了存储布局、对象互操作性的差异,以及直接访问 S3 与使用 ZeroFS 的打包、压缩和加密之间的权衡。
FROST:利用基于OPFS的SSD时序进行远程指纹识别 [pdf]
本文介绍了FROST,一种通过利用基于OPFS的SSD存储时序差异来远程指纹识别用户的技术。
我们通过删除文件系统使其速度提升了47倍
microsandbox将其缓慢的用户空间FUSE文件系统替换为内核挂载的EROFS磁盘映像,在文件系统操作上实现了几何平均47倍的速度提升,并消除了虚拟机/主机往返瓶颈。