ZFS - 文件系统简介

可以跟结识ZFS是因为Solaris,虽然当时ZFS还不是Solaris的默认文件系统,可是它成为了Solaris操做系统中吸引个人最大亮点。

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

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



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

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

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

什么是文件系统

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

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

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

文件管理主要表如今如下方面:文件存储不只存储文件数据自己,还要存储跟文件相关的其余信息,好比文件名、文件建立时间等;​同时文件系统须要经过一个等级制度来管理文件,这点在外在形式上就是目录。

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

元数据

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

文件系统的高级特性

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

文件系统的发展

每种操做系统都有本身表明性的文件系统,好比Windows的FAT3二、NTFS,Linux的ext二、ext三、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了。

相关文章
相关标签/搜索