< 返回版块

苦瓜小仔 发表于 2025-12-31 10:21

Tags:日报

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 的所有安全特性“反向实现”,向人们展示了:

  1. 为什么 Rust 的限制是有意义的: 离开这些限制,内存会瞬间变成一片混乱的废墟。
  2. 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 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页