绝对文件系统设计
巴特勒·兰普森和罗伯特·斯普鲁尔1979年的SOSP论文”单用户机器的开放操作系统“”(PDF;也HTML格式)描述了Alto上的操作系统,Alto是施乐PARC于20世纪70年代末和80年代初建造的开创性个人网络工作站。许多Alto功能成为现代计算环境的日常方面,但Alto的健壮文件系统却没有流行起来。
Alto文件系统设计用于承受磁盘或编程错误。如果某组磁盘块丢失,Alto文件系统只会丢失这些扇区中包含的数据。如果丢失了文件中的数据块,则只会丢失该数据块。如果丢失了目录中的块,则会丢失该文件的名称,但不会丢失文件本身。
本文第3节给出了详细信息。基本技术是,每个磁盘块都包含一个小标题,给出相关文件的id号和版本,以及文件中块的偏移量和块中的数据量(文件中的最后一个块可能包含的数据量小于一个块)。Lampon和Sproull将此信息称为绝对的:这是问题区块的唯一真实点。磁盘清除器(如Unix的fsck公司)可以扫描整个文件系统,读取块标签以重建任何文件的内容。
当然,扫描整个文件系统以查找块内容的速度非常慢。块标签还包含指向文件中上一个和下一个块的指针,以便读取文件时可以紧跟块指针(文件系统布局算法安排了大部分时间文件将按顺序排列,以便遵循这些指针在磁盘查找方面不会太昂贵)。这些指针被称为提示,因为它们的存在只是为了性能,而不是为了正确性。如果提示不正确,那么当使用它们时,这个事实就会变得清楚(指向块的标签与预期不符),可以调用清除器来修复文件系统。
将此方案与现代Unix文件系统(例如BSD FFS或Linux Ext2/3)中的inode进行对比。如果丢失包含1GB文件索引节点的512字节磁盘块,则无法访问整个文件。再多的清理也无济于事,因为组成文件的块列表只包含在inode中,而块本身没有用它们所属的文件进行标记。这比Alto文件系统要差得多。当然,如果丢失包含文件系统超级块的512字节磁盘块,情况会更糟:那么您就丢失了整个文件系统。由于超级块非常重要,文件系统通常会维护分散在磁盘上的超级块的备份副本。伊诺德(Inodes)几乎同样重要,但却没有得到如此仔细的保护。
为什么现代文件系统不像Alto那样使用标签?
磁盘几何结构可能会起到一定作用:很难协调(比如)32字节标签和(比如)4096字节数据块。您将标签放在数据块中,将实际数据大小减少到4064字节。您可以将标签放在块之前的扇区中,32字节的标签占用512字节。或者您可以编写一个标签扇区,其中每16个数据块包含16个标签。第三种可能是最好的选择,但它们都有点麻烦。(但您会丢失更少的数据!)
另一个原因是历史原因:最初的Unix文件系统没有任何这样的机制,FFS和Ext2/3与最初的Unix文件系统差别不大。
另一个原因可能是哲学上的:您应该用备份来处理磁盘故障,而不是巧妙的文件系统技巧。这是最没有用处的论点:谁不想让文件系统不那么频繁地进行备份?
另一个原因可能是实用的:也许磁盘现在的故障方式与1979年不同。(当然,这并不能解释原始的Unix文件系统或FFS。)由于磁盘故障数据太少,很难确定。
无论反对标签的理由是什么,不可否认的是,它们产生了一个非常强大的系统。事实上,Alto上的操作系统几乎可以完全换掉,换成用户程序,每个程序都可以提供自己的文件系统实现。随着时间的推移,出现了三种共享磁盘的文件系统实现,一种是BCPL,另一种是Mesa,还有一种是Smalltalk。在回顾性论文,兰普森写道:
如果磁盘地址错误,标签检查将检测到错误,并且可以调用各种恢复机制。Jim Morris编写的Scavenger程序需要大约一分钟的时间来检查或恢复Alto文件系统的一致性;它可以由非专业用户定期运行。由于这种保守的设计,文件系统被证明是非常可靠的;除了磁盘上物理损坏的位之外,任何其他信息的丢失都是闻所未闻的。尽管标准操作系统之外的许多程序都可以访问磁盘,但仍能实现这种可靠性。
谁会不想要这样一个强大的系统呢?为什么现在的文件系统没有那么健壮?