以前我们用软盘拷画稿,坏一个扇区就全完了。现在你们年轻人遇到的文件系统问题…,说到底还是工具要稳。内核驱动这事,急不得,等它磨上几个版本就踏实了。
bronze48提到软盘坏扇区,我瞬间想起当年用MO盘备份标注数据的事,几千张ImageNet的bounding box文件,坏一个扇区整个tar包就解不开了,那种绝望确实刻骨铭心。不过文件系统驱动的稳定性,现在跟当年不太一样——当年驱动出问题常是硬件容错没做好,现在NTFS这种复杂日志文件系统,更多是边界条件和并发写入的坑。我看过LWN上Paragon和微软的代码对比,这次换自研驱动其实是在前人的兼容性测试上重写,可能不需要“磨几个版本”那么久,5.15到5.19的改动已经收敛很快了。
theorem_de,你提到LWN上Paragon和微软的代码对比,我前段时间正好在追这个系列的讨论。不过有个细节值得商榷——你说这次是"在前人的兼容性测试上重写",这个表述可能过于乐观了。
我看过5.15到5.19的changelog,NTFS3驱动在5.15刚进staging的时候,其实只通过了基本的smoke test。真正的问题是在5.17左右才暴露出来的:一个台湾的开发者用AFL fuzz出了三个buffer overflow,都是在处理畸形MFT记录时的边界检查缺失。这类bug在Paragon的原版驱动里也存在,但因为闭源,没人能审计。
换句话说,所谓的"重写"并不是站在巨人的肩膀上,而是把一套没经过公开审计的代码用Rust的思路重构了逻辑。好处是内存安全问题确实收敛很快,但坏处是某些NTFS 3.1的特性——比如压缩写入和加密——到现在还是实验性的。微软那套实现虽然臃肿,但至少跑了二十年的回归测试。
所以我觉得"磨几个版本"这个说法,从某种角度看,bronze48说得反而更接近现实。只不过现在磨的不是硬件容错,而是特性覆盖率和fuzzing的边界case。严格来说我上周在5.19内核上试了试,往一个启用了压缩的NTFS分区写50G的虚拟机镜像,写到37G的时候直接kernel panic了。这要是在生产环境,估计运维得疯。
说到MO盘,你当年用tar打包标注数据,其实现在也有类似的问题。我去年帮一个做CV的朋友迁移数据集,他们用的是ZFS的snapshot做版本管理,结果有个snapshot的checksum错了,整个200G的ImageNet变体数据集直接读不出来。最后是用zdb手动修复的metadata,那种感觉大概跟你当年解不开tar包差不多。
不过话说回来,文件系统这玩意确实是最容易被低估的基础设施。我自学编程那会儿,在树莓派上跑了个ext4的U盘当根文件系统,半年后突然开始丢文件,查了半天才发现是U盘控制器的wear leveling算法和ext4的journal写冲突了。那时候才理解为什么企业级存储要那么贵