研究!rsc公司

关于编程的想法和链接,通过

RSS(RSS)

绝对文件系统设计
发布于2008年2月11日星期一。

巴特勒·兰普森和罗伯特·斯普鲁尔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文件系统的一致性;它可以由非专业用户定期运行。由于这种保守的设计,文件系统被证明是非常可靠的;除了磁盘上物理损坏的位之外,任何其他信息的丢失都是闻所未闻的。尽管标准操作系统之外的许多程序都可以访问磁盘,但仍能实现这种可靠性。

谁会不想要这样一个强大的系统呢?为什么现在的文件系统没有那么健壮?

(评论最初通过Blogger发布。)

  • 加里杰 (2008年2月11日上午10:08)这无关紧要的原因完全是因为磁盘不会以某种方式出现故障,从而使其变得重要。也就是说,如果你丢失了几个区块,很可能你丢失了很多区块,或者整个扇区都无法读取。对磁盘故障的研究还表明,一旦你失去了几个扇区,你很可能很快就会失去更多的扇区(因为这些错误是由于磁盘翘曲、异物、磁头对准等造成的)。

    Unix保留inode的多个副本的方案实际上在处理此类情况时更加可靠。

    当然,随着固态硬盘的发展,也许兰普森和斯普鲁尔的方法值得再看一眼(有人对研究闪存驱动器故障有什么建议吗?)。

  • 塞雷吉尼 (2008年2月11日下午7:37)很有趣。因此,如果我在1GB文件的开头插入一个块,FS必须每隔一个块写入一次,以更新其偏移量?

  • 俄罗斯考克斯 (2008年2月12日凌晨3:19)@seregine:当然,但传统的Unix文件界面无论如何都不提供“插入”操作。文件开头的“插入”是通过以不同的偏移量再次写出整个文件来完成的。

    这就是为什么MP3标签通常放在MP3文件的末尾,这样更容易编辑。

  • 粉丝 (2008年2月15日下午2:51)反对块标签的一个原因是,它们将数据和元数据交错,因此用户无法映射文件,操作系统也无法拥有统一的缓冲区缓存。

  • 俄罗斯考克斯 (2008年2月15日下午4:13)@fanf:每N个数据块放置一个充满N个标签的块可以解决这个问题。

  • 米克·w·迈耶 (2008年2月15日下午8:42)交错的数据和元数据也会影响
    多块(甚至不太大)传输。如果我不这样做,我可以
    将磁盘控制器指向连续的RAM块,并让它
    将块直接加载到用户输出缓冲区中。元数据位于
    块的开始,我必须把块放在中间
    缓冲区,以便只复制出数据。

  • 俄罗斯考克斯 (2008年2月17日上午6:06)@mike.w.meyer:我认为这在实践中并不值得关注,因为首先将数据加载到内核的缓冲区缓存中要常见得多。缓冲区缓存当然可以处理一些作为标签块的缓冲区,因此它仍然是一个顺序传输。

  • 马吕斯·格德米纳斯 (2008年3月15日上午5:52)这种文件系统的性能影响是什么?寻找一个大文件的中间位置是否需要从文件的开头读取所有块以遵循元数据链?附加到大文件的末尾怎么样?

    与ext3之类的东西相比,这种广泛的元数据将使用多少磁盘空间?

  • 俄罗斯考克斯 (2008年3月15日上午8:10)@马吕斯:当然,如果只使用链接列表进行导航,那么文件系统访问速度会很慢。但没有什么可以阻止您构建块树,如Unix文件系统,并将其用作提示更快地找到块。

    空间开销非常小:每个4096字节的块中只有几个字的开销不到1%。将块变大,开销就会降低。

  • 连翘 (2008年4月30日下午3:25)ken thompson的Plan 9文件服务器用少量数据(类型和路径)标记每个块,这些数据不足以自动恢复整个文件,但允许进行简单的一致性检查,(对我来说)不仅可以检测到问题(硬件和软件)但防止它们升级到破坏文件系统(例如,数据、目录和空闲列表块具有不同类型)。

  • 基思 (2009年6月24日下午7:59)很抱歉这么晚才来参加聚会。但作为一个文件系统书呆子,我忍不住评论。。。

    一些现代文件系统会这样做。不幸的是,它们不是学术文献中描述得很好的系统。Sun的新ZFS文件系统存储每个元数据块的多个副本,以及每个块的校验和。因此,如果inode或间接块损坏,您可以检测损坏并找到数据的良好副本。它与Alto不同,但它使您更难对数据块进行松散跟踪。

    NetApp的WAFL文件系统将块标识信息与块一起存储,可以存储在一个放大的4160字节块中,也可以存储在与您描述的“标签扇区”概念类似的附近块中。

    还有许多现实世界中的问题使得Alto方法不那么有用。

    使用RAID,我通常可以重建丢失的数据(或元数据),而无需扫描文件系统中的每个块。这对使用单磁盘文件系统的个人用户没有帮助,但许多更高级的文件系统都是针对那些可以付费的用户,而这些用户通常都有RAID。

    随着现代磁盘的大小,对文件系统进行完整扫描越来越不切实际。磁盘大小已经超过1 TB,而且有人在运行跨越数十个磁盘的文件系统。如果我丢失了几个索引节点,从备份中恢复可能比扫描整个文件系统以查找未引用的块更快。

    性能和容量。在高端,您可以获得支持520字节扇区的磁盘,从而为存储块标签提供空间。但大多数数据都存储在低端磁盘上。在那里,你可以对一个4KB的块使用9个扇区,基本上浪费了10%的存储空间,也可以做一些类似于“标签扇区”的事情。标签扇区可以工作,但会迫使你对修改的每个块进行磁盘写入。

    然而,您会注意到,这些问题都不会使Alto方法无效。在某些情况下,它仍然可以拯救你。考虑到人们在新的文件系统(如btrfs、tux3和HAMMER)中提出了许多聪明的想法,你会认为更多的人会找到在现代文件系统中使用这种想法的方法。