5 个版本
使用旧版 Rust 2015
0.2.2 | 2017 年 8 月 1 日 |
---|---|
0.2.1 | 2017 年 8 月 1 日 |
0.1.2 | 2017 年 5 月 24 日 |
0.1.1 | 2017 年 5 月 24 日 |
0.1.0 | 2017 年 5 月 6 日 |
#34 在 #redox 中
91KB
1.5K SLoC
TFS 已被 RedoxFS 替换,不再维护,TFS 的多数功能已集成到 RedoxFS 中
TFS:下一代文件系统
TFS 是一个模块化、快速且功能丰富的下一代文件系统,采用现代技术实现高性能、高空间效率和高度可扩展性。
TFS 的创建是为了满足 Redox OS 对现代文件系统的需求,作为对 ZFS 的替代,因为其单体设计导致实现缓慢。
TFS 受 ZFS 灵感的启发,但同时也旨在模块化和易于实现。
TFS 与 terminalcloud 的同名文件系统无关。
虽然许多组件已完善,但 TFS 本身尚未准备好使用。
设计目标
TFS 的设计考虑以下目标
- 并发
TFS 具有非常少的锁,并力求尽可能适合多线程系统。它使用多个真正的并发结构来管理数据,并通过核心数量进行线性扩展。 这也许是 TFS 最重要的特性。
- 异步
TFS 是异步的:操作可以独立进行;对磁盘的读写不需要阻塞。
- 全盘压缩
TFS 是第一个通过我们称之为 RACC(随机访问簇压缩)的方案实现完整全盘压缩的文件系统。这意味着每个簇都进行压缩,只会对性能产生轻微影响。估计您将获得 60-120% 的更多可用空间。
- 修订历史
TFS 存储每个文件的修订历史记录,而不增加额外的开销。这意味着您可以将任何文件回滚到早期版本,自动备份系统,而无需从复制中产生额外开销。
- 数据完整性
TFS 与 ZFS 一样,存储文件的完整校验和(不仅仅是元数据),而且是在父块上完成的。这意味着在读取时几乎可以检测到所有数据损坏。
- 写时复制语义
类似于 Btrfs 和 ZFS,TFS 使用 CoW(写时复制)语义,这意味着永远不会直接覆盖任何簇,而是将其复制并写入新簇。
- O(1) 递归复制
与其他文件系统类似,TFS 可以以常数时间进行递归复制,但有一个独特的特点:即使在它被修改后,TFS 也不会复制。如何实现?它单独维护文件的各个段,这样只需复制更新的段。
- 保证原子性
系统永远不会进入不一致的状态(除非硬件故障),这意味着意外断电永远不会损坏系统。
- 改进的缓存
TFS 在缓存磁盘以提高磁盘访问速度方面投入了大量精力。它使用机器学习来学习模式并预测未来的使用情况,以减少缓存未命中次数。TFS 还压缩内存中的缓存,减少所需的内存量。
- 更好的文件监控
CoW非常适合高性能、可扩展的文件监控,但遗憾的是,只有少数文件系统采用这种方式。TFS就是其中之一。
- 所有内存安全
TFS仅使用用Rust编写的组件。因此,只有在标记为unsafe的代码中才可能发生内存不安全,而这些代码会被额外仔细检查。
- 全面测试
TFS旨在实现全面的测试。这通过立即揭示大量错误类别,为正确性提供了相对强大的保证。
- SSD友好
TFS通过重新定位已死扇区来避免SSD的写入限制。
- 改进的垃圾收集
TFS使用Bloom过滤器进行高效且快速的垃圾收集。TFS允许文件系统垃圾收集器在后台运行,而不会阻塞文件系统的其余部分。
常见问题解答(FAQ)
为什么使用SPECK作为默认加密算法?
- SPECK是一种相对较新的加密算法,但已经经历了大量的(无效的)密码分析,因此相对安全。它具有非常好的性能和简单的实现。可移植性是TFS设计的重要部分,真正没有侧信道攻击的可移植AES实现比许多人想象的要困难(尤其是,大多数可移植实现中存在SubBytes的问题)。SPECK没有这个问题,因此可以以最小的努力安全地实现可移植性。
TFS与ZFS有多相似?
- 实际上并不相似。它们有很多基本想法,但除此之外,它们基本上是无关的。但ZFS的设计对TFS产生了很大影响。
是TFS只用于Redox吗?
- 不是,它从未打算只用于Redox。
整个磁盘压缩是如何工作的?
- 据我所知,整个磁盘压缩是TFS独有的。它是通过将尽可能多的“页面”(虚拟数据块)收集到“簇”(分配单元)中实现的。通过这样做,可以通过简单地解压缩相应的簇来读取页面。
为什么ZMicro这么慢?它会影响TFS的性能吗?
- ZMicro之所以这么慢,是因为它是在位级别上工作的,以极好的压缩比牺牲了性能。这种极慢的性能通过减少写入次数得到了补偿。实际上,超过50%的ZMicro分配只写一个扇区,而相比之下,写3个扇区。其次,无论你的磁盘有多快,它都不会达到ZMicro的性能,因为磁盘操作本质上就是慢的,从长远来看,压缩的性能并不重要。
可扩展哈希或B+树?
- 都不是。TFS使用树和哈希表的组合:嵌套哈希表,这是一种哈希树的形式。其想法是,而不是重新分配,可以在桶中创建一个新的子表。
设计资源
我写过一些关于TFS设计的文章。
- SeaHash: 解释 - 这描述了为TFS设计的默认校验和算法。
- 关于随机访问压缩 - 这篇文章描述了用于随机访问压缩的算法。
- 三元作为预测残差码 - 该技术的应用与创建良好的自适应(无头)熵压缩器相关。
- LZ4是如何工作的 - 这描述了LZ4压缩算法的工作原理。
- 嵌套哈希表中的冲突解决 - 这描述了我们用于目录结构的嵌套哈希表方法。
- 原子哈希表 - 这描述了并发、内存中的哈希表/键值存储。
规范
完整的规范可以在 specification.tex
中找到,要渲染它需要安装 texlive
或其他带有XeTeX的发行版,并运行
xelatex --shell-escape specification.tex
然后打开名为 specification.pdf
的文件
依赖
~0.5–1.2MB
~20K SLoC