架空的的理想文件系统设计,又名:如果穿越回 1970 年,你该怎么设计文件系统

2016-08-29 19:03:39 +08:00
 schezukNewTos

你有没有遇到过如下的困扰?

这些不是你的错,是文件系统设计的错。

文件系统的设计在不断发展之中,以适应新的硬件带给我们的更多可能性空间。
以 M$为例,从最早把所有文件都存在根目录下的 8-bit FAT,
到初次引入树状目录的 MS-DOS 2 ,到支持硬链接的 NTFS 。
文件组织理念逐渐进步——虽然早在 M$开始做任何操作系统之前这些就已经应用了。

传统的文件系统的思维是,储存文件的最近快照,并用目录树组织它、用文件名描述它。
这种静态僵化思维违反文件变动的本质,缺失重要的必需功能,不得不以外部应用补全。
文件的组织、查找、整理、版本维护、删除恢复,用户要么借助工具,要么掣肘于困难。

自 JFS 起引入了日志, WinFS 引入了标签(虽然成了先烈), APFS 引入了写入时复制。
这些都证明,传统的文件系统的思维,显露出的不灵活不适用的特点已经得到关注了。

让我们回到文件的本质吧:
文件是一段变化的数据,和对这一忒修斯之船的一组可变的描述。
任何设计若轻视文件的变化本质,静态看待其内容和描述,都会迫使用户持续陷入困扰。
(请读者联系亲身体验)。

版本标签概念进入到文件系统中,就像日志和软硬链接一样理所当然。
——虽然肯定有人为链接破坏了文件在目录树下唯一定位的特性而经历过困惑。
——那么这些人还会为不完全路径访问、副本的取消、复制概念的消失而惊讶。

一个理想的文件系统,他应当具有如下的特征:

这个架空的文件系统,其文件组织应当包括一下三个要素:
文件节点(inode),文件特征(meta),文件内容(content)。

文件节点是操作文件的独一凭据,是记录文件存在的根本标识。文件特征记载于此。
它使用链表记录文件的流变过程,链表上的每一个 hash 指向存储在硬盘上的一个版本。

文件内容是文件的数据本体,如文本,图片视频二进制数据, Office 文件,文件包……
写入打开一个文件创建一个新的文件内容,它暂存挂载在文件节点上,当写完则转正。
转正即哈希并提交到文件节点,文件内容按版本单独存放,互相不覆盖,同哈希则 GC 。
不同文件可绑定同一文件内容。需要压缩或者加密的,也在这一层次上进行操作。

文件内容根据可修改 IMMUTABLE 与可随机写入 Random-accessible 分为四类:
可修改、可随机写入:文本和某些二进制文件,行插入不影响有效性,需记录版本。
可修改、不可随机写入:日志文件,流媒体等,文件尾部不断追加,无需记录版本。
不可修改、可随机写入:数据库等等,由对应的应用自行管理写入,无需记录版本。
不可修改、不可随机写入:图像、媒体、文件包等,要么从不修改,要么记录版本。

文件特征全面取代目录树、文件名、文件权属和文件头,记录数据本体以外的信息。
它单独记录在链表上面。同时,创建、每次修改、删除,都同步到文件系统的索引上。
索引筛选取代目录访问,索引不能直接操作,通过操作特征来修改,用于按标签筛选。
文件元数据与文件内容独立,但是文件内容的可修改性、随机写入性、哈希是元数据。

文件的每一条元数据称为一个标签(tag),传统的文件夹代替以按标签筛选。
标签可以代替文件头:文件的每一条媒体信息都作为一条标签存储在文件元数据中。
标签可以代替文件名、扩展名、时间:同时取代了魔术字,文件头的标题、时间等等。
标签可以代替文件权属,文件权属应当同时精确到用户和应用,例: auth:usr1/app1 。
标签可以代替目录树:多数情况下重名文件分属不同用户应用,以文件权属代替。
标签必要的时候可以有多个级别,文件权属是用例之一,标签筛选也可以指定级别。

该文件系统采用与传统不同的一套 API 。随之而来的是完全不同的使用理念。
——尽管迫于历史包袱,可能仅限于理论讨论、思想实验,或作为一层虚拟界面层。
在计算机的早期采用固然好,但当时的硬件性能不足以支持,实在是很遗憾的事。

寻找文件通过提供一个标签字典或字符串,包含文件权属。返回一个文件节点号数组。
因为标签和历史版本消除了存储多个副本的必要,绝大多数情况只会有一个返回值。
万一有多个返回值意味着违背了这一设计哲学,用户可以添加标签区分、或合并副本。

访问文件通过文件节点号。返回记载标签和哈希的版本数组。有一个独特的暂存 API 。
读取文件读取指定哈希对应的文件内容,暂存文件创建一个可以写入的文件内容。
写入文件将暂存区转正,文件标签的修改也在此时保存到该文件节点的链表中。
本地不应当复制。用户 /计算机间可以创建副本,但授权应当改变。备份同理变更标签。
下载被抄送取代,接收方应当妥善接收标签,并作本地化,因为这是文件系统的一部分。


以上脑洞由 WinFS 、 APFS 、 Git 、 REST 等启发,可以视作无脑黑 Unix FS 和对 M$的吹捧。
作者本人,思虑不周。欢迎批评,谢勿转载。

4791 次点击
所在节点    程序员
44 条回复
lovedebug
2016-08-29 19:06:48 +08:00
我需要一键擦除所有避免数据恢复- -
codingadog
2016-08-29 19:14:37 +08:00
那时候硬盘才多大。。。。保存版本很蛋疼吧
codingadog
2016-08-29 19:15:01 +08:00
@codingadog 不对,那时候有硬盘了吗?
wizardoz
2016-08-29 19:18:29 +08:00
为啥要回到 1970 年?如果你有好的想法,现在不是也可以用全新的方法做出来吗?
schezukNewTos
2016-08-29 19:20:04 +08:00
@lovedebug 这一点并无区别。
@codingadog 那时候大概是磁带机的天下?可是等十年后 unix 成熟,人们习惯目录树文件头等等,就晚了。
schezukNewTos
2016-08-29 19:21:15 +08:00
@wizardoz 习惯惯性太大。
M$失败了,没理由我能成功。
jyf007
2016-08-29 20:00:29 +08:00
plan9 一招嫩死你
mko0okmko0
2016-08-29 20:02:24 +08:00
那时候连 unicode 都没有.所以不管怎样先进.到了多语言时代依然要再一次动荡.
ranran
2016-08-29 20:05:12 +08:00
一切都准备好了 但是踏入回到 1970 年的时空隧道时……

我就见到了一个人 他背对着我和我说 就在这里停下吧 我问为什么 他说你再往前面走 你以为你会穿越时空回到过去 可是你一旦回到了过去 就会产生无数的蝴蝶效应 导致后来人不断的穿越时空回到你所穿越的点 去尝试修复一切 他们所要做的第一件事情就是在你穿越后的一瞬间就将你杀死并毁灭成分子级别的碎片然后带回未来 他们早就计算好了你的出口位置和时间 他们也不会去改变其他事情 因为只要将你“修正”,就不会有任何事情被你改变。如果你逃脱成功,不不不,在你逃脱成功的一瞬间,你所造成的影响会让第二批人瞬间来到此地,他们也是为了修正你的到来对这个世界造成的影响,所以你注定无法成功。

回去吧孩子。

我终于忍不住问出来,那你是谁?你为什么会在这里?难道你一直在这里?

他说 我就是被派来的第一批人 你这次穿越改变了很多事情 人们发现可以穿越回去改变以前所发生的事情 然而谁也没办法只达到自己的目的而不影响其他人的命运。

所以太多人的命运因为你的出现而改变了,而你从这个隧道穿越回过去后,也很快就死去了,这是你第一次穿越,也是人类第一次穿越,但是在我们的历史上,你却是一个罪人,虽然你穿越到过去还没来得及做什么就死去了,可以说你这次回去的任务是失败的,但是你却造成了太大影响。而我们只想纠正错误,因为在你穿越后,有一人穿越到了古代,体内所携带的细菌瞬间造成大片瘟疫,只有极少数人活下来了。我们通过不断的调查终于查到了人类第一次穿越时空的详细始末。所以我在这里等你,不能让你通过,你回去之后,我也会自行湮灭。

因为没有你的穿越事件,我也不会诞生。
zmj1316
2016-08-29 20:17:49 +08:00
那个版本控制怎么看着就像 btrfs 的快照呢...
fds
2016-08-29 20:18:35 +08:00
即使改成你说的这样也还是可能找不到,而且加标签太麻烦,多个路径也很麻烦。最好的办法还是找个秘书帮你管理。未来或许属于人工智能。
msg7086
2016-08-29 20:23:46 +08:00
在一个计算文件大小都需要用 2 的倍数去逼近的低配置机器上去实现这么复杂的系统?

不是人人都有能力设计和推广一个 Lisp 的。
Siril
2016-08-29 20:30:36 +08:00
这不靠谱。当年受限于有限的需求和有限的资源两方面,你做不出真正实用的改变。

不如换个问题:穿越到 2170 年,磁盘技术出现了本质上的变革。 在这样的情况下,如何设计文件系统:

磁盘和内存一样快,或者说磁盘即内存, cpu 直接存取。(忆阻器?);
带宽若干 TB/s ;
u 盘大小的存储设备容量几十 T ,组个 nas 没一 PB 容量没脸见人;

然而到了这个年代,大家还在用 ntfs10 和 fat512 , 人类需要楼主拯救。。。
Siril
2016-08-29 20:52:49 +08:00
弗诺文奇的 深渊上的火 里面 的那种 archive ,可称之为理想的文件系统了。 不知这个千年内能不能搞出来。。。
lhbc
2016-08-29 20:56:29 +08:00
如果一个文件系统,奔着楼主提的 7 点问题去设计,那这个文件系统真够寒碜的
schezukNewTos
2016-08-29 21:06:44 +08:00
@zmj1316 所有版本可读,只能创建写入。但是与其说是链表,更接近 Git 的树对象。
@fds 不是路径、没有路径。只有筛选条件,可以按照名称筛选、类别筛选、用户权属筛选、图片尺寸筛选……
@msg7086 然后 winfs 就失败了。——最好时机是 PC 刚出现的时候,趁旧观念立足未稳引入有版本文档的概念。
再就是 iphone 刚出现,那时数据库已经优化和成熟,扛得住索引化的文件系统。和应用操作模式一起冲击桌面用户吧。
@Siril 我暂时难以理解一种和硬盘一样快的内存。
msg7086
2016-08-29 21:28:34 +08:00
@schezukNewTos #16
忆阻器,已经发明出来了,内存的速度与硬盘的容量,并且是持久存储。以后不再需要内存了。
另外仔细看了你说的,似乎你很喜欢用标签,然而标签这个概念本身就很模糊。假如我有一百万个文件,用标签过滤完以后还有数千个,这种情况怎么办。何况现在很多系统里文件数量都是亿级别的,最终还是要把标签当目录用。
还有你说的绑定到用户的权限设定,这就把文件系统和操作系统里的用户模块绑定在一起了。典型的问题就是 NTFS 你把数据盘接到另一个系统会导致 ACL 原来绑定的账户失去关联。
最后这句黑 Unix 粉 M$也可以看出你设计上的偏好。 Unix 的精髓是一切东西简单粗暴,比如什么都是文件的概念,比如单一职责的小程序,比如 pipe 和 shell 的活用等等。所以便出现了 7777 文件权限,/+路径的目录结构,等等。而 M$则是相反,更人性化但是也更复杂化,比如 ACL ,好用的时候很好用,重装系统以后你就慢慢重置权限去吧。

其实还是要看使用场景。 macOS 各种东西玩的遛,然而很少有人拿这货当服务器,就是这个道理。
just4test
2016-08-29 21:49:04 +08:00
愚蠢的人类。
老子穿越时空回到 1970 年,就是为了把基于标签的文件系统从历史上抹去。
在我曾经的世界中,文件系统得到了空前的发展。文件系统包含了触发器、定时器、网络同步、加密、签名、读时复制、 FS2FS 、结构化支持等等。全球的文件系统组成了 InterFS ,此后任何文件系统都是 InterFS 的一个缩影——持有密钥的用户可以从任何文件系统中读取任何文件,唯一的区别是读写速度和延迟。
繁荣的文件系统技术也催生了各种应用,比如 FSQL 、 FSML 、面向文件系统编程等等
直到有一天,一个疯狂的天才彻底摧毁了 InterFS 。他找到了哈希函数的漏洞——一些特定的值,在这些值上可以以能承受的代价制造哈希碰撞。这样他就可以在无法察觉的情况下替换某个文件的二进制。他做出了最好 FSQL 编译器实现,其编译结果,也就是哪些程序的二进制,其哈希值都可以制造出碰撞。然后某一天,灾难来临,数不胜数的程序同时叛变,清空了整个 InterFS 。人类的大部分数据毁于一旦(幸好书籍都有纸质版本,知识还保留着),更重要的是,现代计算文明的核心已经不能信任了。
于是人类派我来改正这个错误。我花了一辈子的时间让人类避免这个灾难,现在你竟然想重演他???
schezukNewTos
2016-08-29 22:31:43 +08:00
@msg7086 你居然没看出来我是个潜藏的 M$黑 Unix 粉……
这一套设计正是简单粗暴,只顾设计美不顾用户习惯的,而且文中还狠狠地黑了 M$一遍(自寻)。
此外,同样是打破用户体验, M$不好好推广 WinFS ,却搞什么 Metro ,简直脑子坏掉了。
——你看,我又黑了 M$一遍不是?

忆阻器我知道,我是无法评估抹平硬盘瓶颈后算法和系统设计的变化。

标签无法区分,要么都应该处理,要么都不应该,而应该重新区分。
思路是:如果你不做足够细的区分,意味着你本来就是打算做 forEach 。具体地说:
如果是操作文档,那么用户本来就有机会从中挑选,最后应用访问的是某个 inode 号。
如果是应用操作其专属的配置等等,那么应用设计者应当妥善命名标签以说明之。
并用“用户-应用”式的标签限制为此用户专属,此应用专用。这样也不会混淆。

标签当然是当目录用的,而且比目录还灵活——想想 REST 如何灵活映射资源。
可以写成 http://remote/name:A%20Flower|author:Adam%20Brown|type:jpeg
也可以写成 http://remote/author:Adam%20Brown|name:A%20Flower|size:1280,720
还可以写成 http://remote/sha1-hash:########和 http://remote/inode:####|history:recent

绑的不只是用户,而是用户-应用对——像 Android 把每个应用当作用户一样,这才叫简单粗暴。
作为这个文件系统的用户,数据盘不可以直接接到另一个系统是常识。
当然需要重授权。而且 SELinux 比这个复杂多了不是么,我并不是为了粉 ACL 啊。
还有,复制啊备份啊是要淘汰的概念,拆盘也是。说起来 APFS 连 TimeMachine 都暂不支持。
schezukNewTos
2016-08-29 22:33:26 +08:00
@just4test 对对对对,就是这个!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/302524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX