fluster_rs:看似未来却停留在过去的 FUSE 文件系统
这是一个用 Rust 编写的 FUSE 文件系统,其目的是将 多张软盘(Floppy Disks) 组合成一个逻辑存储池。
- 项目初衷: 作者 DocJade 想要挑战“在软盘上运行并玩通《异星工厂》(Factorio)”。由于单张软盘容量极小(1.44MB),无法装下游戏,因此他写了这个系统。
- 核心功能:
- 多盘横跨(Multi-disk): 将文件系统跨越多张物理软盘,将它们视为一个统一的存储空间。
- 分层缓存(Tiered Caching): 采用三级内存缓存,最大限度减少换盘频率。
- 自动备份与纠错: 考虑到软盘极易损坏,系统每 512 字节块都有 CRC 校验,并会自动将操作备份到本地
/var/fluster以防数据丢失。 - 换盘检测: 系统能自动检测驱动器中的盘片变动并提示用户更换下一张盘。
- 技术栈: 基于 Rust 和 FUSE(用户态文件系统)。
作者展示了《异星工厂》玩家如何将“过度工程化”和“硬核技术”带入现实。它是一个极致的“伪需求”硬核挑战。作者并非为了解决某种生产力问题,而是为了实现“在软盘上通关 Factorio”这一极具极客浪漫主义的目标,从零开发了一套高性能、带缓存和校验的分布式软盘存储解决方案。
仓库:https://github.com/DocJade/fluster_rs
视频:https://www.youtube.com/watch?v=cTPBGZcTRqo
讨论:https://www.reddit.com/r/rust/comments/1pxhffo/least_technically_capable_factorio_player_writes/
dumpster:让 Rust 的垃圾回收更好一些
dumpster 是一个专门为 Rust 设计的带引用计数和循环检测功能(Cycle-tracking)的垃圾回收器(GC)。
核心痛点:循环引用的“心智负担”与“内存泄露”。在标准的 Rust 中,处理具有循环特征的数据结构(如多向图、父子双向引用的树)时,唯一的原生方案是手动管理生命周期:
- 手动拆解: 开发者必须精确判断哪一根路径是“强引用”(
Rc/Arc),哪一根应该是“弱引用”(Weak)。 - 后果: 一旦逻辑出错(例如两个节点互相持有
Rc),内存将永久泄露,且编译器不会报错。 dumpster的价值: 它让开发者可以无脑使用强引用。你不需要思考谁该是Weak,因为它自带循环检测器(Cycle Collector),能自动识别并回收那些互相引用但已与根节点断开的“孤岛”。
例如
- 标准库写法:
Rc<RefCell<T>>+Weak<RefCell<T>> - Dumpster 写法:
Gc<RefCell<T>>+Gc<RefCell<T>>
功能特点:
- 并发循环检测 (Concurrent Cycle Collection):
- 传统的 GC 需要追踪“根”(Roots),但 Rust 的所有权和移动(Move)特性使得在栈上追踪根极其困难。
dumpster采用的是引用计数 + 循环检测算法(类似于经典的有向图周转算法),它不需要全局暂停(Stop-the-world),而是通过增量或后台方式清理孤立的循环引用。
- 代际引用 (Generational References):
- 为了解决并发修改下的数据一致性问题,该版本引入了代际机制。这允许垃圾回收器在识别循环时,能够正确处理那些在清理过程中被新创建或修改的引用,避免了复杂的读写锁(RwLock)带来的性能开销。
- 性能优化:
- 实现了 $O(1)$ 摊销时间 的指针创建与销毁。
- 支持
?Sized类型(动态大小类型),使其能够像普通的 Rust 指针一样处理 trait 对象。
主要特性
- 两种实现:
unsync:线程局部的 GC,性能极高。sync:线程安全的并发 GC,适用于多线程环境。
- 自动派生:通过
#[derive(Collectable)]或#[derive(Trace)]宏,用户可以轻松让自定义类型支持 GC 追踪。 - Drop-in 替换:它的用法与
Rc几乎一致,开发者只需将Rc::new改为Gc::new即可获得自动处理循环引用的能力。
阅读:https://claytonwramsey.com/blog/dumpster2/
仓库:https://github.com/claytonwramsey/dumpster
corroded:违法的 unsafe Rust
这是一个极具讽刺意味和幽默感的开源项目。该项目并非生产工具,而是一个 “粪码”项目(Shitpost Project)。
其核心理念是:既然 Rust 编译器总是以“所有权”和“生命周期”来限制开发者,那么这个库就要亲手拆掉 Rust 所有的安全围栏,让开发者能像写 C 语言甚至更混乱的代码一样“重获自由”。
核心“违法”功能:该项目通过封装大量 unsafe 代码,实现了各种令 Rust 编译器“抓狂”的功能:
null(空指针): 重新引入了“十亿美元错误”。你可以创建一个Null<T>指针并解引用它,体验段错误(Segfault)带来的“自由”。immortalize()(永生生命周期): 彻底无视生命周期检查。它能强行将任何引用转换为'static,即便原数据已经被销毁,指针依然存在(制造典型的悬垂指针)。clone_mut()(违反别名规则): 绕过 Rust 的“可变引用唯一性”规则。它允许你对同一块内存拥有多个可变引用。作者调侃称,如果优化器因为你的操作产生了错误代码,那是“编译器技术不行”(Compiler skill issue)。RacyCell(随心所欲的多线程/Vibes Threading): 强行实现Sync接口,允许不同线程在没有任何同步锁的情况下同时读写同一数据。作者将其命名为“氛围组多线程”,纯靠运气保证一致性。yeet()(暴力转换): 本质上是mem::transmute的无节操版本,可以将任何字节流视为任何类型(比如把函数指针看成数字,或者把浮点数看成整数)。CursedVec(诅咒向量): 一个完全不检查边界的向量。你可以访问索引 1000 处的元素,即便数组长度只有 3,从而读取堆上属于其他人的秘密数据。
总结:corroded 是一个极客式的玩笑。它通过将 Rust 的所有安全特性“反向实现”,向人们展示了:
- 为什么 Rust 的限制是有意义的: 离开这些限制,内存会瞬间变成一片混乱的废墟。
- Rust 的
unsafe能量巨大: 你确实可以用 Rust 写出比 C 还要危险的代码。
使用建议: 除非你想给面试官一个惊喜(或者惊吓),或者想在本地体验一下“手动制造内存漏洞”的快感,否则严禁在任何严肃项目中使用此库。
仓库:https://github.com/buyukakyuz/corroded
讨论:https://www.reddit.com/r/rust/comments/1pz0edr/corroded_so_unsafe_it_should_be_illegal/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论