ZFS

能够跟结识ZFS是由于Solaris,虽然当时ZFS还不是Solaris的默认文件系统,但是它成为了Solaris操作系统中吸引我的最大亮点。

一开始接触ZFS,我就被它无尽的存储空间和像管理内存一样管理管理磁盘的方式深深地吸引了,但是之后很长的一段时间里,​我都是只限于使用ZFS。后来,由于工作原因,我开始调查ZFS的测试工具,在那段过程中,ZFS的各种特性更加令我着迷,​这也使我迫切希望学习ZFS的源码。虽然过了这么长时间,我也只是学到了一点皮毛,但还是想把在这一经典巨作的学习成果跟大家分享。

其实,选择今天作为ZFS系列博客的开始,也是是因为今天是opensolaris.org关闭一周年。这也算是个纪念吧。



之前,我对文件系统的了解也不是很多,于是就到处找一些跟文件系统发展史相关的资料来看,下面的内容基本上是参照​From BFS to ZFS: past, present, and future of file systems这篇文章来写的,索性就把这篇博客的类别设为“翻译”吧。

在我们使用计算机的过程中,我们需要对数据进行读、写等一系列操作。比如,我们在存储一份数据时,只需要简单地发出保存​命令(不管是终端命令还是windows的点击保存),数据就会被保存在磁盘上,而我们并不清楚这些数据具体在磁盘的什么位置;​当我们想要读取一个文件时,只需要知道它在哪个目录,文件名是什么,然后选择适当的应用程序打开即可,同样,我们也不知​道这些文件具体来自磁盘的哪个位置(或者是分散的许多位置)。其实,在我们保存或是读取数据的过程中,真正将数据放到磁​盘上或是从磁盘上找到数据所需要的一系列操作都是由操作系统通过文件系统来完成这一系列的操作。

那么什么是文件系统?文件系统的发展是怎样的一个过程?有哪些经典的文件系统?文件系统发展方向又是怎样?今天我们将围绕这些问题进行讨论。

什么是文件系统

概要地说,文件系统就是操作系统用来存储、访问磁盘上的数据的一种方法。通过这样的方法简化操作系统对数据存储、访问等操作。

用户在使用文件系统读取数据时,不需要关注数据在磁盘或光盘上存储的物理地址,而只需要知道所需的文件的文件名以及所属目录;​在向磁盘上写入数据时,不需要关注磁盘上的某个部分是否已经被使用,磁盘的空间(已使用空间、空闲空间等)都有文件系统来自​动分配、管理。用户只需要知道写入的目录以及文件名即可。

文件系统主要负责两个方面工作:文件管理和空间管理。

文件管理主要表现在以下方面:文件存储不仅存储文件数据本身,还要存储跟文件相关的其他信息,比如文件名、文件创建时间等;​同时文件系统需要通过一个等级制度来管理文件,这点在外在形式上就是目录。

空间管理是说,文件系统不仅要跟踪磁盘上已用空间,还要管理磁盘上没有使用的空间。这一点,不同的文件系统(或者可以说是​不同时代的文件系统)有着不同的管理方式,这点,后面将详细说明

元数据

上文中已经提到,文件系统在存储数据时不仅要存储文件本身,还需要存储跟文件相关的其他信息,这就是元数据。元数据,按照​其字面意思来看就是“关于数据的数据”,文件系统在存储文件以及文件名之外,至少还要存储一些其他的元数据,一些对计算机来​说没有什么意义,但是对用户来说却很重要的数据:比如说文件的创建日期,修改日期等等;同时有一些元数据可能对人类没有任​何意义,但是对文件系统来说却是不可或缺的,比如文件在磁盘上的物理位置。

文件系统的高级特性

随着操作系统的发展,越来越多的特性被加入到文件系统的元数据中。比如说为了提高搜索速率加入了索引信息;采用更好的设计​来降低文件系统的碎片化;为了节省磁盘空间加入了去重、压缩功能;为了保证数据的正确性加入了校验码;加强了文件系统的自​我修复能力……其中一个重要的变化就是日志功能,这使得在突然断电或者宕机之后重启机器,系统可以根据日志内容恢复相关信息,
​保持文件系统中数据的一致性。这也使得计算机的重启过程更快速,因为不需要对整个硬盘进行扫描来保证数据的一致性。这就是​为什么有的问题见系统断电后硬盘自检时间很长,比如说XP,有的文件系统断电后硬盘自检时间极短,比如说Ext4的Linux(这应该​就是日志的的作用了)。

文件系统的发展

每种操作系统都有自己代表性的文件系统,比如Windows的FAT32、NTFS,Linux的ext2、ext3、ext4,Unix的UFS,Mac OS的HFS、HFS+……

其实在计算机发明的早期文件系统就已经存在,只是当时人们把它们认为是操作系统功能的一部分,而那个时候操作系统本身都已​经是神秘莫测了,自然也不会有人去注意文件系统,计算机技术的发展,操作系统的发展,人类对文件管理的需求,甚至是硬件的​发展,都推动了文件系统的迅速发展。

早期的文件系统都是没有名字的,最早有名字的文件系统是DECTape——由设计他的公司(Digital Equipment Corporation)名称和​存储设备来命名。该文件系统最初被用在PDP-8服务器上,每个磁带只可以存储小到184KB的数据。

在随后的时间里,“懒人原理”推动了文件系统的发展。1973年Gary Kildall发明了CP/M,因为他比较懒,不想每天开车去上班,但是​他又需要在公司巨大的计算机上编程,于是他开发了一个叫“Control Program for Microcomputers”的软件来使自己可以在家里8英寸​的小型计算机上的软盘上存储并运行程序。此时CP/M上已经有文件系统了,但这个文件系统没有名字,由于Gary Kildall的需求很简​单,所有文件系统的功能也很简单,文件之间都是平级关系,没有目录结构。CP/M文件系统对文件名的支持上,允许最多8个字节的​文件名另外加上3个字符扩展名(这与Gary Kildall工作的大型机上的限制是相同的)。随后,他的销售他发明的微型计算机,受到了​各大微机厂商的欢迎。还是由于“懒”,Gary为了避免为每个微机厂商都写一个CP/M系统,他写了独立于系统之外的系统——BIOS。

​由于Gary的“懒”,他没有开发16位的CP/M,这是另外一个人出现了——Tim Patterson。Tim完全抄袭了CP/M的一切,只不过他是为​16位机器开发的,并命名为QDOS(Quick And Dirty Operating System)。在文件系统上,QDOS与CP/M稍微有点不同,虽然它在管​理文件时仍然是平级的,它采用了一个叫做“File Allocation Table”的方法来管理文件,并且给了他一个经典的名称——FAT

经典文件系统介绍

下文简单介绍一下各大公司的文件系统,关于各种文件系统的对比,维基百科上面有非常详细的介绍。

MicroSoft

FAT

File Allocation Table用来描述磁盘上的哪些部分已经被分配给文件使用,哪些部分是空闲空间以及哪些部分已经被损坏不能使用。由于早期的软盘很小,所以用来管理磁盘的File Allocation Table也要非常小,为了满足这点,磁盘被划分成多个簇(Cluster,由相邻的扇区组成)。第一个版本的FAT文件系统被称为FAT12,因为它使用12为的数字来对簇进行计数,212次方是4096,所以可以管理4096个簇,每个扇区大小为8KB,所以卷的最大空间为32MB

最初的FAT文件系统,仅仅是将文件存储在第一个找到的空闲空间里面,对于软盘而言,空间很小,这样的方法没有大碍,但是对于更大磁盘来说将会带了各种问题。在MS-DOS 2.0中,微软给FAT文件系统添加了目录嵌套。后来微软开发了FAT16以及FAT32文件系统,分别可以支持2GB8TB的磁盘空间。但是由于FAT文件系统在分配空间上的算法比较差(FAT通过寻找第一个空闲空间,然后将文件存储到该位置),使得使用一段时间之后,磁盘过度碎片化,同时访问文件时到处读取散落在磁盘各个位置的数据及其耗时。而微软并没有从根本上解决这一问题,而是提供了一个工具——磁盘整理。另一方面,8字符+三字符扩展名的命名方式所带来的问题也越来越突出。微软通过VFAT功能使得FAT文件系统可以支持255字符的文件名,其实微软的文件系统一直都没有突破这个限制,下图是我在NTFS文件系统上发的一封邮件:

 

exFATExtended File Allocation Table

扩展的FAT文件系统,又名FAT64,是Microsoft开发的一种适合于闪存的文件系统,加入了空余空间寻址,使得空间的分配、释放的性能得到改进。

NTFS

NTFSNew Technology File System),Window NT及之后基于NT内核的系统的标准文件系统。NTFS文件系统的设计作为商业机密,Microsoft已经注册了知识产权。作为替代了FAT文件系统的新一代文件系统,NTFSFATHPFSHigh Performance File System)的基础上做了一系列的改进,比如支持元数据、使用B+树提高了性能。NTFS同时提升了附加功能,如访问控制列表和文件系统日志

Mac OS

MFSMacintosh File System

1984年有Apple公司开发作为Mac OS的默认文件系统。MFS支持20M的磁盘大小以及1400个文件。这对于当时Macintosh仅有400KB的软盘来说已经很大了。MFS支持目录,但是不支持目录嵌套。

HFSHierarchal File System

分层文件系统1985年取代MFS成为Mac OS的文件系统。最初为软盘和硬盘设计,后来也用于类似光盘的只读文件系统。文件名只支持31个字符,其实HFS是支持255字符的文件名,但是由于Mac OSFinder(类似于Window的资源管理器,一种图形化界面的Shell)的限制,所以最多只能使用31个字符作为文件名。HFS通过B树来管理目录以及元数据等。HFS使用512K的簇以及16位指针,因此最大的分区大小为32G 

HFS+

Apple公司在1998年发布,替换了原有的HFS文件系统,是HFS的升级版本。采用了32位的块地址指针,使得寻址空间进一步扩大。在文件名上,允许255UTF-16字符的文件名。HFS+采用了32位的BitmapHFS采用16位,即磁盘最多可以支持65536个块,比如一个1GB的磁盘,,也就是说即使是1bit的数据,也要占用16K的空间。同样HFS使用B树来管理元数据。

2002年,Mac OS X 10.2.2发布时,AppleHFS+添加了日志功能,提高了数据可可靠性。

Linux

最初的Linux文件系统是MINIX系统,当时Unix系统的源码在教育行业是可以自由使用的,MINIX文件系统就是将UFS文件系统中的一些复杂的功能去掉来保持代码的整洁、清晰、简单,便于教学。1991Linus在写Linux系统的时候所用的操作系统上就是MINIX文件系统。知道1992extExtended File System)发明之前,MINIX作为Linux的原始文件系统。

ext(Extended File System)

Rémy Card1992年开发的,符合VFSVirtual File Syste)设计的文件系统,也是第一个使用VFS API的文件系统,并且被加入到Linux内核中。ext解决了MINIX文件系统中的两个主要问题(最大分区大小、14字符文件名的限制),支持2GB空间以及255字符的文件名。在19931月就被ext2所取代。

ext2Second Extend File System

同样是由Rémy Card开发,在19931月取代ext成为Linux的默认文件系统。ext文件系统虽然解决了MINIX所存在的两个主要问题,但是仍然存在其他的问题,比如不支持分开的文件访问时间戳,对inode以及数据的修改都存在一定问题等等。在此情况下ext2诞生了。

ext2支持的最大的文件大小为16GB2TB,支持的最大文件系统大小为4TB32TB

ext3Third Extended Filesystem

ext3文件系统与ext2文件系统非常相似,这也决定了从ext2转换成ext3将会特别方便、简单。相对于ext2ext3开始添加了日志功能。

Unix

UFS(Unix File System)

又称Berkeley Fast File System,BSD Fast File System,FFS被广泛用于Unix以及类Unix系统。

ZFSZettabyte File System

第一个128位文件系统,也被称为文件系统的终结者。由Sun公司的Jeff Bonwick所领导的团队完成,于2004914日发布,并在2005年加入Solaris主干代码。

 

这里大概将文件系统的发展、以及经典的文件系统提了一下。

后面,重点就是ZFS了。

 

原文地址:https://www.cnblogs.com/SunChina/p/3617256.html