Skip to main content

从BFS到ZFS:文件系统的过去、现在和未来

什么是文件系统?

简而言之,文件系统是计算机操作系统用于存储、编目和检索文件的明确定义的方法。文件是我们使用计算机进行的一切的核心:所有应用程序、图像、电影和文档都是文件,它们都需要存储在某个地方。对于大多数计算机来说,这个地方是硬盘驱动器,但文件可以存在于各种媒体上:闪存驱动器、CD和DVD光盘,甚至磁带备份系统。

文件系统不仅需要跟踪构成文件本身的位以及它们在逻辑上放置在硬盘驱动器上的位置,还需要存储有关文件的信息。它必须存储的最重要的东西是文件的名称。没有这个名字,人类几乎不可能再次找到文件。此外,文件系统必须知道如何在层次结构中组织文件,这同样是为了那些讨厌的人的利益。这个层次结构通常被称为目录。文件系统最不担心的是元数据。

元数据

元数据的字面意思是“关于数据的数据”,这正是它。虽然元数据听起来可能相对较新和现代,但所有文件系统从一开始就必须至少存储一些元数据以及文件和文件名。其中一个重要的元数据是文件的修改日期——对计算机来说并不总是必要的,但对这些人类来说也很重要,这样他们才能确保他们正在处理最新版本的文件。对人们来说不重要但对计算机至关重要的一点元数据是存储设备上文件的确切物理位置(或多个位置)。

元数据的其他示例包括操作系统用来决定如何显示文件以及谁可以修改文件的属性,例如隐藏或只读。多用户操作系统将文件权限存储为元数据。现代文件系统绝对会对元数据着迷,添加了各种可以为特定类型的文件量身定制的疯狂属性:音乐文件的艺术家和相册名称,或照片的标签,使它们更容易以后排序。

高级文件系统功能

随着操作系统的成熟,他们的文件系统增加了越来越多的功能。更多的元数据选项就是这样一个改进,但还有其他改进,例如为文件编制索引以加快搜索的能力,减少文件碎片的新存储设计,以及更强大的纠错能力。文件系统的最大进步之一是增加了日志记录,记录了计算机即将对每个文件所做的更改。这意味着,如果计算机在文件操作中途崩溃或停电,它将能够检查日志,并在不损坏文件的情况下快速完成或放弃操作。这使得重新启动计算机的速度要快得多,因为操作系统不需要扫描整个文件系统来发现是否有任何不同步的东西。

侏罗纪文件系统

带Dectape的DEC PDP 11
带DECTape的DEC PDP-11微型计算机

在计算机的早期,当恐龙自由漫游,IBM像巨像一样站在地球上空时,文件系统诞生了。当时,他们很少有名字,因为他们只是被认为是运行计算机的操作系统的一部分,在那些日子里,操作系统本身相当新颖和花哨。首批命名的文件系统之一是DECTape,它以制造它的公司(数字设备公司)和存储文件的物理系统(那些巨大的旋转卷轴到卷轴磁带录音机,你经常在20世纪60年代的电影中看到)命名。这些磁带就像非常慢的磁盘驱动器,如果你足够绝望,你甚至可以在上面运行整个操作系统。

DECTape在DEC流行的早期微型计算机PDP-8上存储了每盘惊人的184千字节(千字节,不是兆字节)的数据。它之所以被称为微型计算机,只是因为虽然它有冰箱那么大,但仍然比占据整个房间的IBM庞然大主机小。当然,晶体管和集成电路(或硅芯片)的发明允许另一轮小型化。当世界其他地区移动微型计算机或我们大多数人称之为计算机时,DEC慢慢灭绝。(IBM奇迹般地活了下来,但没人完全确定如何生存下来。)

CP/M

带Dectape的DEC PDP 11
Gary Kildall在他的电脑前工作

加里·基尔德尔在1973年发明了CP/M,因为他很懒。他的工作是为一些大型恐龙电脑编程,但他不想每天开车上班。因此,他写了一个名为“微机控制程序”的程序,该程序允许他在家里的小电脑上存储文件并从8英寸的舒加特软盘驱动器运行程序。

CP/M有一个文件系统,但它没有名称。如果它被称为任何东西,那就是“CP/M文件系统”。这很简单,主要是因为加里的需求很简单。它将文件存储在一个完全平坦的层次结构中,没有目录。文件名限制为八个字符,外加一个决定文件类型的三个字符的“扩展”。这是完全明智的,因为它与基尔德尔正在使用的大型计算机完全相同的限制。

Gary Kildall和他为销售CP/M而成立的公司,星际数字研究,很快就变得非常富有。事实证明,许多微型计算机公司都需要一个操作系统,Gary的设计方式将所有计算机专用位(称为BIOS)与操作系统的其他部分分开。Kildall也出于懒惰而这样做,因为他不想继续为每台新计算机重写整个CP/M。这个故事的寓意是,懒惰有时可能是一件非常聪明的事情。

对基尔代尔来说,不幸的是,其他人很快就有了同样的想法。一位名叫Tim Patterson的程序员编写了自己的操作系统,名为“QDOS”(用于快速和肮脏的操作系统),这是CP/M所做的一切的快速和肮脏的克隆,因为他需要在一台花哨的新16位计算机上运行操作系统,而Gary还没有费心编写16位版本的CP/M。(这就是懒惰可以对你不利的地方!)QDOS的文件系统与CP/M略有不同,尽管它基本上做了同样的事情,也没有目录。Patterson的文件系统基于1977年微软名为Microsoft Disk Basic的程序,该程序基本上是Basic的一个版本,可以将其文件写入软盘。它使用一种名为文件分配表的组织方法,因此文件系统本身被赋予了FAT令人难以置信的富有想象力的名称。

然后,比尔·盖茨以更壮观的方式应用了懒惰理论,以5万美元的价格购买了蒂姆·帕特森的QDOS锁、股票和桶,并将其更名为MS-DOS。他现在能够将其出售给IBM和每家公司克隆IBM,可怜的Gary发现自己很快就被护送出个人计算阶段。从现在开始,世界将不得不处理所有血腥的脂肪。我说的是血腥吗?我的意思是荣耀。

鉴于它最初是20世纪70年代为8位微型计算机设计的文件系统的快速肮脏的克隆,而文件系统本身就是一个模仿十年前微型计算机的快速肮脏的黑客,FAT并没有真正达到很大作用。它保留了CP/M的“8和3”文件名限制,以及它围绕当天主要存储设备软盘驱动器的物理结构设计的存储方式。

文件分配表描述了磁盘的哪些区域分配给了文件,哪些是可用空间,哪些是损坏和无法使用(称为“坏扇区”)。由于每个软盘的空间很小(IBM PC中的第一批单面磁盘只能存储160千字节),因此表本身需要非常小。为了保持其小,磁盘被划分为集群——磁盘上相邻存储的扇区组。FAT的第一个版本被称为FAT-12,因为它使用12位数来计算集群(12的功率为4096,每个集群为8KB,因此最大音量大小为32MB)。

5.25英寸软盘的大量存储
原始的IBM PC 5.25英寸软盘,带有叠加轨道/扇区

FAT对目录或优化文件存储一无所知,只是将所有文件片段扔到了磁盘的第一部分,在那里它找到了任何空间。对于软盘来说,这并不重要,因为无论如何,您通常只在上面存储几个文件。然而,IBM正准备发布带有可选20MB硬盘的PC-XT。这个(在当时)巨大的空间意味着FAT需要一种将文件存储在适当的层次结构中的方法。对于MS-DOS 2.0,微软添加了嵌套目录,并标记为反斜杠()作为分隔符,因此文件可能会存储在C:MYFILESNOTES中。为什么像上帝(和Unix)打算的那样是反斜杠,而不是向前斜杠?好吧,一些MS-DOS 1.0程序已经将正斜杠用作修饰参数(例如,格式A:/S在格式化后添加系统文件),现在更改它太难了。为什么C:?好吧,A:和B:是为硬盘成为标准之前每个人都必须拥有的第一和第二软盘驱动器保留的。

过时

硬盘的引入很快就使FAT-12过时,因此微软在1987年发布的DOS 3.31中提出了16位版本。它有32KB集群,可以访问其中216个,最大磁盘大小惊人2GB。

存储优化的问题呢?使用硬盘驱动器,用户总是复制和删除文件,这留下了新文件塞进的漏洞(因为FAT刚刚寻找第一个可以存储东西的空间),这导致了碎片化的真正问题。这使得硬盘驱动器比以往任何时候都更加努力地工作,随意跳来跳去,试图找到散落在驱动器上的文件的所有位。微软用FAT解决这个问题了吗?一点也不。他们让其他公司制作Norton Utilities和PC-Tools等程序,一次性对整个磁盘进行碎片整理,让用户永远记住快乐的夜晚,坐着看着屏幕移动小矩形。

到1995年,硬盘越来越大于2GB的限制,8.3文件名限制似乎比20年前更过时。为了解决这两个问题,微软推出了FAT-32,具有8TB(TB)限制和名为VFAT的特殊魔法能力,使FAT能够在没有真正拥有长文件名的情况下拥有长文件名。

VFAT采用了一个长文件名(最多255个字符),并创建了一个适合8.3紧身衣的简短版本。例如,“超长文件名.txt”将存储为“SUPER-~1”。TXT。剩下的字母被扔进了一种非常奇怪的不存在,就像生活在星体平面上一样。它们被切成13个字母的块,并存储为幻影目录,这些目录标有卷标签、系统、隐藏只读的元数据属性,这种组合使旧版本的MS-DOS如此混乱,以至于它们完全忽略了它们。但是,如果从DOS中删除了一个长文件名,它会认为充满卷标签条目的关联幻影目录是空的,并删除了它。甚至添加了更奇怪的技巧来检查长文件名是否与8.3文件名匹配。

由于VFAT摇摇欲坠的第三方实现,其中一些技巧今天仍然困扰着我们。例如,在撰写本文时,我有一种有趣的体验,在将文件传输到我的iBook时,看着USB闪存驱动器上的目录自发地从“Williams文件”更改为“WILLIA~1”。

那么,微软是否也解决了这个版本中FAT的可怕碎片化问题?答案是:没有那么多。但它至少包括一个与Windows 95一起自制的碎片整理程序。多亏了多任务处理的力量,你甚至可以在碎片整理时做其他事情!除了你不能,因为它会抱怨“文件变了”,然后重新开始。

这个奇怪的VFAT解决方案是一个可怕的黑客,但它确实允许将DOS和Windows 3.1系统无缝升级到Windows 95和长文件名,同时仍然允许贫穷的DOS用户访问这些文件。它还导致Macintosh用户大笑,并开出没有人理解的“MICROS~1”笑话。然而,他们可能不应该笑,因为Macintosh文件系统有更奇怪的限制。

你好,HFS!

大多数人用一种浪漫的阴霾来记住1984年的麦金塔,忘记了原始单元的巨大局限性。当PC用户开始习惯硬盘时,Mac附带了一个软盘驱动器。最初的文件系统被称为Macintosh文件系统(MFS),限制为20MB和4,096个文件。它都有目录,也没有。用户可以创建图形“文件夹”并将文件拖入其中,但它们不会显示在应用程序的打开/保存对话框中。相反,所有文件和目录信息都存储在单个“空文件夹”中,如果以任何方式修改,该文件夹将消失,仅被一个新的“空文件夹”取代。这在软盘上效果很好,但确实减缓了硬盘驱动器的性能。文件名可以是63个字符。

1984年麦金塔
原始的128K Macintosh,显示为可选的第二个软盘驱动器

1985年,MFS被一个具有适当层次目录的系统所取代。因此,它被称为分层文件系统或HFS。出于某种原因,文件名现在限制在31个字符,这足够短,很烦人。文件、目录和可用空间信息存储在B-Tree中,这是一种二进制存储结构,允许快速排序和检索信息。HFS使用512KB集群和16位指针,因此驱动器的最大尺寸为32GB。后来的版本将指针增加到32位,因此可以同时访问2TB。

MFS和HFS引入了一种处理文件的创新方法,称为“叉子”。HFS没有将元数据存储在单独的地方(例如存储的地方目录),而是将每个文件分为两个文件:文件本身(“数据分叉”)和包含结构化数据的隐形“资源分叉”,包括有关文件的信息,例如其图标。然而,资源分叉用于的远不止元数据——例如,它们在pre-PowerPC mac中保存了应用程序界面和可执行代码的详细信息。就像叉子上的叉子一样,数据和资源一直一起传播,直到文件被发送到另一种不知道叉子的计算机。幸运的是,当时电脑非常势利,从未交谈过,所以这很少成为问题。

HFS没有使用微小的三字母文件扩展名来确定文件类型,而是使用一个巨大的字母“类型代码”和另一个创建者代码,这些代码存储在文件系统的元数据中,被视为文件创建日期等信息的对等。

HFS没有乱搞斜杠或反斜杠来分离目录名称。相反,它使用冒号(:),然后确保人类永远不会在系统的任何地方看到这个字母,直到他们试图在文件名中包含一个。

开玩笑的,HFS是历史上第一个专门为适应当时新的图形用户界面需求而设计文件系统的例子。Macintosh GUI 设计的整个理念是向用户隐藏不重要的细节。这种“以人为本”的设计旨在帮助人们更专注于他们的工作,而不是文件系统的技术细节。

当然,没有什么是完美的,所有试图抽象讨厌的技术片段的系统偶尔都会与Joel Spolsky所谓的泄漏抽象定律相冲突。当某些东西坏了,例如当文件发送到另一台计算机并返回Macintosh时丢失资源分叉时,并不总是清楚该怎么做才能解决问题。

HFS还有其他一些技术限制,偶尔可能会泄露出去。文件和目录的所有记录都存储在一个名为目录文件的单个位置,只有一个程序可以同时访问此文件。这种方法有一些好处,比如非常快的文件搜索。第一个Macintoshes没有多任务处理,所以这不是一个问题,但当后来添加多任务处理时,它导致某些程序“堵塞系统”的问题。文件也可能损坏,这可能会使整个文件系统无法使用。其他文件系统将文件和目录信息存储在不同的地方,因此即使一个目录损坏,系统的其余部分仍然可以访问。

与迄今为止涵盖的其他文件系统一样,集群的数量(称为“块”)被固定为16位数,因此单个分区上只能有65,535个块,无论大小。由于HFS(像大多数文件系统一样)只能将文件存储在单个块中,因此更大的块大小意味着浪费大量空间:即使是一个小的1KB文件也会在1GB驱动器上占用满16K。对于8GB驱动器来说,问题恶化了8倍,以此类推。

最后一个问题由苹果于1998年与HFS+修复,HFS+与Mac OS 8.1的发布捆绑在一起。HFS+使用32位数字进行编号块,还允许255个字符的文件名,尽管“经典”Mac OS(9.2.2及更低版本)仅支持32个字符的文件名。奇怪的是,Mac版Microsoft Office直到2004年才支持超过32个字符的名称。

Amiga文件系统

Amiga在Macintosh发布一年后发布,具有先进的多媒体功能,这些功能似乎来自未来的十年。然而,由于将原始AmigaOS推出门的时间压力很大,文件系统是其最薄弱的部分之一。它来自TripOS,这是一个由MetaComCo开发的操作系统。它使用512KB块,但为元数据保留了每个块的24KB。Amiga工程师将文件系统称为OFS为“旧文件系统”,他们尽可能快地更换了它。

Amiga 1000
Amiga 1000

FFS或Fast File System于1987年与Amiga 500、2000和AmigaOS 1.3一起发布。主要区别在于元数据从每个块移动到一个单独的空间。与HFS一样,它仅限于32个字符的文件名。

为了支持OFS和FFS,Amiga操作系统进行了重新设计,以便它可以接受插件格式的多个文件系统,并记录了这种格式,以便任何人可以根据需要编写自己的文件系统。许多人这样做了,一些结果,如专业文件系统(PFS)和智能文件系统(SFS),至今仍被Amiga粉丝使用。PowerPC Amigas的Amiga OS4操作系统也支持FFS2,由于原始实现代码不便携,其内部工作和数据结构的文档很难获得,因此很难进行重大重写。FFS2增加了支持105个字符的文件名的功能。

Unix和Linux文件系统

UFS(FFS)

Unix在MULTICS上以双关语开始其生活,MULTICS是一个非常严重的多用户分时系统,不喜欢被取笑,但后来又将其严肃的竞争对手留在了历史的垃圾箱中。Unix几乎完全主导了科学工作站和服务器的市场,然后被一个名为Linux的同类克隆巧妙地取代,该克隆最初是Unix上的双关语。这个故事的寓意?双关语可以是强大的东西。

在此过程中,Unix为用户如何存储文件设置了各种标准。当加州大学伯克利分校的研究人员开发了原始Unix文件系统的大幅改进版本时,Unix文件系统(UFS),也被称为伯克利快速文件系统,成为标准。

Unix起源于黑客文化,而不是商业部门,其文件系统反映了这些根源。首先,该系统区分大小写,这意味着README.TXT是一个与readme.txt完全不同的文件,后者也与Readme.Txt不同。大多数其他文件系统都保留文件名的情况,但不在乎用户如何访问它。这种相当神秘和以计算机为中心的文件名视图一直保存到今天,因为现在更改它会破坏依赖它的软件。有时,这两个世界可能会发生剧烈碰撞:当服务器要求some_file.htm时,将网站从Windows服务器移动到Linux,有时会导致链接损坏,而最后一个编辑它的人将其保存为Some_File.htm。

除了对案件挑剔外,文件系统还以其他方式暴露了其黑客根源。UFS用于定位磁盘上文件的指针称为inodes,与其他操作系统不同,Unix非常乐意向最终用户显示此inode数据。UFS一开始没有写日记,因此崩溃或停电可能会导致损坏的inode和丢失文件。解决方案是运行一个名为fsck(用于文件系统检查)的实用程序,并观看操作系统告诉您其所有肮脏的inode秘密。

与其他文件系统一样,数据存储在称为块的独立组件中。随着磁盘变大,标准块大小不断增加,但最终标准化为8KB。由于如此大的块大小会浪费大量磁盘空间,BSD实现了一种名为块子分配的聪明算法,其中来自多个文件的部分填充块可以存储在单个块中。

UFS还试图通过将文件和元数据存储在称为圆柱体的组中,以最小化硬盘驱动器头过度移动,并试图将所有文件从相邻的圆柱体中的单个目录中保存。

许多Unix供应商实现了自己的UFS版本,通常使它们与其他Unices不兼容。Sun在Solaris 7的版本中添加了日记,NeXT为NeXTstep创建了自己的UFS版本。

分机2

ext2受到UFS设计的“启发”,本质上是UFS的类似工作克隆,就像Linux是Unix的类似工作克隆一样。这允许轻松移植许多Unix实用程序,如fsck,如果你说得足够快,这听起来有点像亵渎。与UFS一样,ext2缺乏日志记录,但它也避免了UFS为了运行得更快而进行的其他一些安全检查。因此,有时有必要一遍又一遍地说“fsck”。

Linux始于1991年,是一个业余爱好项目,以取代Andrew Tanenbaum的教学OS Minix,最初克隆了Minix文件系统,但它仅限于64MB,并很快被ext2取代。ext2于1993年开发,以解决原始分机的一些限制,此后存活了多年。ext2具有与UFS相同的“缸”系统,但称它们为块组

ReiserFS

由于ext2缺乏日志记录,Linux是基于开源精神和任何人的贡献,因此有很多人想构建更好的Linux文件系统。一个真正成功的人是Hans Reiser,他适度地将他的作品命名为ResierFS。

ReiserFS不仅添加了日志记录,还试图改进ext2的许多其他方面。B-Tree索引和高级块子分配例程显著加快了文件系统,特别是在处理1KB级的小文件时。

ReiserFS获得了SuSE等Linux发行版的大量赞誉,甚至获得了主要行业支持,直到车轮因主要非技术原因而开始脱落。

首先,Hans Reiser决定不再支持或更新ReiserFS,更愿意研究其继任者,称为Reiser4。新版本运行良好,但它不是ReiserFS的干净更新,需要用户重新格式化。关于Reiser4的可靠性和稳定性存在一些问题,但这些问题本可以及时解决。

真正让社区陷入循环的是没有人能预见到的东西。2006年,Hans Reiser的妻子Nina被宣布失踪。在汉斯汽车的睡袋上发现了与她的DNA轮廓相匹配的血液。汉斯不认罪,他的刑事审判目前正在进行中。

分机3

ReiserFS的受欢迎程度已经开始下降,在对ReiserFS未来的困惑中,许多仍在使用它的人切换到更安全的ext3,这基本上是ext2,并增加了日志支持。虽然不太可能赢得任何速度德比,但ext3保留了其前身久经考验的可靠性遗产。

JFS

JFS是IBM进入Unix文件系统游戏的条目,并在UFS中添加了日志记录。这是IBM独特的Unix版本AIX使用的旧专有系统的开源再实现。JFS使用B-Trees来加快文件访问速度,并引入了范围的概念,即128字节的inodes块。这防止了文件系统不得不像ext2和ext3那样为inodes专用固定空间。

XFS

XFS来自Silicon Graphics版本的Unix,称为Irix。XFS于1994年首次与Irix 5.3一起推出,针对速度和可靠性进行了优化,赢得了许多速度比较测试。这是一个64位文件系统,最大音量大小为8兆字节。它使用范围,并具有许多高级功能,例如针对多线程进行优化——多个线程可以同时在同一文件系统上运行。

2000年,SGI在GNU公共许可证下发布了XFS源代码,在接下来的几年里,许多Linux发行版增加了对该文件系统的支持。

IBM和微软决斗

OS/2和HPFS

今天大多数孩子都不会记得了,但IBM曾经短暂地玩弄过直接与微软竞争个人计算机操作系统主导地位的想法。更不寻常的是,这次竞争最初是一种伙伴关系。

OS/2翘曲
IBM的OS/2翘曲(3.0版)

即使是拥有10,000层管理层和比苏联更多官僚机构的IBM,也意识到国防部迫切需要更换。IBM决定设计一个继任者——名为OS/2——然后将完全拥有,但微软将完成所有实际写作工作。Steve Ballmer在以上下跳跃和扔椅子而闻名之前,曾描述过当时计算机行业如何看待IBM。他们是熊,你可以骑熊,也可以在熊下面!因此,微软同意了这个疯狂的计划。

OS/2将是一个多任务操作系统,其花哨的GUI稍后将安装。它花了很长时间才到达,运行DOS应用程序时遇到困难,并且需要比大多数计算机用户一生中负担得起的更多的RAM,所以它和New Coke一样。对于1987年发布的1.2版本,IBM想要一个新的文件系统来取代糟糕的FAT。因此,HPFS诞生于高性能文件系统,由微软员工Gordon Letwin领导的一个小团队编写。

HPFS使用B-Trees,支持255个字符的文件名,并使用范围。根目录存储在磁盘中间而不是开头,以加快平均访问时间。它不支持日记,但它确实支持分叉,并具有广泛的元数据能力。这些新的元数据被称为扩展属性,甚至可以通过将自己保存在名为EA_DATA.SF的文件中存储在FAT分区上。HFS+也支持扩展属性,但直到Mac OS X 10.4才在Apple OS中公开。

就在Windows 3准备发布时,微软和IBM经历了一场相当混乱的离婚。(IBM也想拥有它,而微软真的不想要它。)在版本3取得成功后,微软重新将精力集中在Windows上,而IBM保留了其拥有的代码,并添加了一堆额外的用户界面代码,这些代码来自与苹果和NeXT的各种联系。因此,OS/2 2.0和面向对象的Workplace Shell诞生了,在Windows 95到达并将其压入地下之前,它在阳光下度过了短暂的一天(甚至奇怪地在嘉年华碗上做了广告)。IBM后来将JFS移植到OS/2,这让仍在使用它的三个人非常高兴。

NTFS

Windows NT 3.1安装CD。
Windows NT 3.1安装CD。注意支持的平台!

微软也知道DOS需要更换,但对其在IBM的体验感到酸痛。在比尔·盖茨第二次壮观地应用懒惰理论时,他聘请了DEC坚如磐石的VMS操作系统的建筑师Dave Cutler,就在DEC陷入螺旋式下降时,它永远不会从中恢复。

Dave Cutler带着他的团队,尽管垂死的DEC提起诉讼,但他还是实施了全新的操作系统的洁净室实施。随着一个全新的操作系统,出现了一个全新的文件系统,该系统最初没有名称,但后来在操作系统本身被命名为Windows NT时被称为NTFS。NT是一个代表新技术的营销名称,但WNT是VMS,每个字母都被下一个字母取代,这仍然是一个有趣的巧合。

NTFS是一个全面、球到墙的实现,在文件系统中,Cutler的团队可以想到的所有最佳想法。这是一个64位文件系统,最大文件和卷大小为264(16兆字节),将所有文件名存储在Unicode中,以便支持任何语言。甚至文件日期属性也被拉伸到荒谬的极限:文艺复兴时期的时间旅行者最早可以在公元1601年愉快地设置他们的文件日期,并且支持到公元60056年的日期,尽管如果到那时人类仍在使用NTFS,这将表明我们的文明存在严重问题。它首次向公众公布了Windows NT的第一个版本(出于不正当的营销原因称为3.1版本)。

NTFS使用B+Trees(HFS+也支持的增强和更快的B-Trees版本),从第一天起就支持日志记录,具有内置的透明压缩能力,并通过使用访问控制列表具有极其细粒度的安全设置(ACL与NT 3.5一起添加,于1994年发布)。它的设计是为了让微软可以添加额外的元数据支持,直到奶牛回家。事实上,NTFS对元数据的支持是如此广泛,以至于有时微软的操作系统团队需要一段时间才能赶上已经存在的功能。

例如,自Windows 2000发布以来,NTFS对文件和元数据进行了超快的索引搜索,但直到2005年,微软才发布了支持此功能的图形界面,直到2006年Windows Vista才成为操作系统本身的一部分。嘿,有时事情会被遗忘。有人想重新设计添加新字体对话框吗?

在后来版本的Windows NT中,NTFS中添加了其他功能。与Windows 2000一起发布的3.0版本添加了上述索引元数据搜索,以及加密和磁盘配额,以便学生无法再用盗版MP3填充文件服务器。

NTFS将其所有元数据信息存储在单独的文件中,通过以$字符开头的文件名,从操作系统的常规操作中隐藏起来。通过将所有内容存储为文件,NTFS允许文件系统结构动态增长。文件系统还通过尝试将文件存储在有足够的连续空间的地方来抵抗碎片化,而不仅仅是在驱动器上的第一个可用空间中。

为了方便从基于FAT的操作系统过渡到NTFS操作系统,微软为Windows 98及更早版本的用户提供了一个方便的工具,可以安全地将他们的FAT16和FAT32分区转换为NTFS。它不会反过来,但老实说,你想吗?

唯一能真正找到抱怨NTFS的是,它的设计是微软拥有的专有秘密。尽管存在这一挑战,但开源编码器还是能够逆向工程支持从其他操作系统读取NTFS分区,以及更晚的写入NTFS分区。NTFS-3G项目允许任何操作系统读取和写入NTFS分区。

死胡同和大道

BeOS和BFS

1990年,苹果法国热情洋溢的前负责人Jean-Louis Gasee顿悟。他决定,Mac OS和Windows等当前桌面操作系统的问题在于,它们因支持自己的旧版本而负担过重。他的解决方案是从头开始,使用所有可用的最佳想法创建一个全新的硬件和操作系统平台。他受到Amiga团队的启发——Amiga团队早在1982年就做了同样的事情——甚至为他的汽车获得了“AMIGA96”虚荣车牌。

当硬件团队选择处理器——AT&T Hobbit——被其母公司停止时,几乎立即遇到了麻烦。切换到PowerPC,该团队实现了极客的梦想:一台快速、经济实惠的多处理器计算机,配有大量端口和光滑的赛昂式闪烁灯。不幸的是,1995年底发货的BeBox总共售出了不到500台。正如史蒂夫·乔布斯在NeXT发现的那样,桌面市场的现实是,不再有新的硬件平台的空间了。Be, Inc.将其操作系统快速移植到Power Macintosh平台,然后移植到更大的x86兼容PC领域。

BeBox和BeOS
运行BeOS的PPC BeBox

BeOS需要一个文件系统,其最初的目标确实是宏伟的。BeBox上的原始分层文件系统(称为OFS)直接链接到关系数据库,允许各种灵活性和功能。不幸的是,数据库驱动的设计太慢,保持数据库和文件系统同步存在问题。随着转向PowerPC Mac,BeOS现在也必须支持HFS,因此文件系统基础设施需要更改。因此,Be File System(BFS)诞生了。

BFS由Dominic Giampaolo和Cyril Meurillon编写,是一个64位文件系统,支持日志记录并使用B+Trees,就像NTFS一样。它还需要支持原始BeBox操作系统使用的数据库功能,这些功能允许用户将他们想要的任何文件信息存储在一系列记录和字段中。这些信息被放入元数据中,用户可以向每个文件添加尽可能多的字段。

这个可扩展的元数据想法在当时似乎很新颖,但重要的是要认识到NTFS已经支持基本相同的东西。主要区别在于用户界面:BeOS目录窗口支持按任何元数据字段添加、编辑、排序和索引搜索。这对于组织一个人的MP3收藏非常方便。

早在1996年,很少有人使用Windows NT和NTFS,因此BFS的64位支持、日志记录和可扩展元数据都给BeOS的印象增添了BeOS是一个先进操作系统的印象。不幸的是,对Be, Inc.来说,该公司无法找到销售操作系统的可持续商业模式,在灾难性的“焦点”转向疯狂命名的索尼eVilla等专用互联网电器后,该公司资金耗尽,并于2001年出售给Palm。

Mac OS X和HFS+

Be, Inc.倒闭的原因之一是Jean-Louis Gassee指望他的老公司苹果,通过购买BeOS用于他们的下一个操作系统来拯救他。苹果的传统Mac OS并没有很好地老化。缺乏内存保护、自动内存分配和先发制人的多任务处理开始对公司造成非常严重的伤害,当苹果的内部替代品Copland在一堆粘性内脏中崩溃时,该公司开始购买替代品。Solaris、BeOS甚至讨厌的Windows NT都在争夺该奖项,BeOS是领先的候选人。五颜六色的Gassee说,他“把苹果的蛋蛋边,要挤到疼为止。”

他挤得有点太紧了。苹果内部有人给NeXT的史蒂夫·乔布斯打了电话,剩下的就是历史了。Steve骑着白色充电器回到苹果,带着他的NeXTstep团队。在对苹果是否会同时提供传统Mac OS和名为Rhapsody的高端版本感到困惑后,Steve完全控制了局面,并决定合并两者。因此诞生了Mac OS X

Mac OS X 10.0版本
Macintosh OS X 10.0,2001年发布。

合并并不完全漂亮。NeXT的核心是基于Mach,Mach本身早在学术过去就与BSD Unix混杂在一起。Unix为命令行而活,而MacOS则避开了CLI,认为它不友好。Unix使用传统的文件扩展名来识别文件类型,而MacOS将此信息隐藏在资源分叉中。最后,Unix的文件系统是UFS,而Mac OS在HFS+上运行。决定支持哪一方总是一场战斗。

在其中一些战斗中,NeXTies赢了。文件扩展名被倡导为识别文件类型的“新方法”。对于 OS X 的第一个版本,用户在新的硬盘驱动器分区上安装 OS 时,系统要求在 UFS 和 HFS+ 之间进行选择。然而,出于兼容性原因,选择了HFS+作为默认值。也不建议选择UFS,因为它区分大小写,因此会破坏一些在文件名大写方面草率的第三方应用程序。

随着时间的推移,NeXT人群的影响减弱,他们的一些强硬决定被重新审视了。UFS支持终于在最新版本的OS X Leopard中删除了。文件扩展名虽然仍然受支持,但不再是强制性的。

仍然存在将HFS+提升到更现代标准的问题。在OS X 10.2(Jaguar)中,日志记录被添加到文件系统中,尽管它默认关闭,并且只能通过命令行启用。在10.3(黑豹)中,默认启用了它。苹果还聘请了BFS的联合创始人Dominic Giampaolo,他致力于添加可扩展的元数据、日志记录、Spotlight的初始实现和FSEvents。最后,在Mac OS X Server 10.4中添加了NTFS风格的细粒度文件权限。

ZFS和文件系统的未来

许多人想知道为什么苹果不放弃HFS+,代之以更新、更性感的东西,比如Sun的ZFS。2004年宣布的Zettabyte文件系统是一个128位文件系统,支持荒谬的文件大小(16兆字节)的文件,对于文件系统的总可访问大小,绝对可笑的限制为256 zettabytes(2到78字节)。项目负责人Jeff Bonwick表示:“填充128位文件系统将超过基于地球的存储的量子极限。如果不煮沸海洋,你就无法装满128位的储物池。”从字面上看,需要一台由纯能量组成的计算机,释放足够的能量将整个世界的海洋带到沸点,来填补128位文件系统的极限。似乎不太可能有人会在短期内构建256位文件系统。

ZFS还有一种处理多个分区的旧bugbear的新方法。ZFS建立在称为zpools的虚拟存储池之上,因此所有连接的驱动器似乎都是单个巨大分区的一部分。驱动器可以无缝串通各种虚拟 RAID 配置,如果一面镜面上的数据损坏,则可以自动“自行修复”。ZFS还可以自动拍摄对文件所做的每个更改的快照,仅保存差异,因此永远不会丢失数据。

ZFS存储池
ZFS存储池。进来吧,水很好!它甚至还没有沸腾!

还有其他花哨的ZFS功能太多,无法在这里列出。除了给你做晚饭外,它基本上什么都做,那么苹果为什么不把它放进Mac OS X呢?

部分问题是ZFS仍在成熟,Sun仍在解决纠结。然而,更大的问题是,即使所有错误都已修复,将整个用户群转移到新的文件系统也是一项艰巨的任务。

文件系统应该完全可靠,用户通常会将旧数据保存在使用传统文件系统格式化的驱动器上。微软设法通过Windows内置的转换实用程序将一些FAT用户转移到NTFS,但这一转变主要是通过自然减员实现的,因为旧的Windows 98时代计算机被扔掉,取而代之的是预装XP的新机器。直到今天,FAT仍然困扰着我们,因为大多数闪存驱动器都是用FAT32格式化的。为什么?因为作为最古老的文件系统之一,它也是最容易理解和最容易实现的。

通常,即使切换成本表面上是“免费的”,坚持使用成熟的文件系统也更容易。Linux的例子非常有用,它完全开源,允许任何人为它编写新的文件系统。尽管勇敢地试图将ReiserFS建立为新标准,并且XFS等系统具有可衡量优势,但大多数Linux用户仍在使用ext3。ext3并不新。不是超级快。这并不性感。它不会做你的晚餐。但这是经过考验和真实的,对许多人来说,这更重要。

微软最近试图用WinFS恢复最初的BeOS数据库驱动的文件系统想法,WinFS原计划包含在Windows Vista中。然而,发布操作系统的延迟导致微软将WinFS从操作系统中删除,而是将其作为其SQL数据库产品的可选部分移动。WinFS的未来仍然模糊不清,但微软可能会试图为未来的Windows版本复活它。

NTFS将来可能会持续多年,纯粹出于惰性。HFS+也可能再持续几年。甚至脂肪可能仍然在我们的拇指驱动器上,在每个人都忘记了那是什么之后很久,CP/M的幽灵一直困扰着我们。

虽然文件系统本身可能并不令人兴奋,但它们的历史告诉我们计算机和操作系统多年来是如何演变的。“根据他的作品,你们会认识他”对人类和文件系统都是真的。通过了解操作系统如何存储一个不起眼的文件,人们可以一窥其设计师的局限性和愿望。