计算机的文件系统是一种储存和组织计算机数据的方式,它促使对其访问和查找显得容易,文件系统使用文件和树状目录的具象逻辑概念取代了硬碟和光碟等化学设备使用数据块的概念,用户使用文件系统来保存数据毋须关心数据实际保存在硬碟(或则光碟)的地址为多少的数据块上,只须要记住这个文件的所属目录和文件名。在写入新数据之前,用户毋须关心硬碟上的哪个块地址没有被使用,硬碟上的储存空间管理(分配和释放)功能由文件系统手动完成,用户只须要记住数据被写入到了那个文件中。
严格地说,文件系统是一套实现了数据的储存、分级组织、访问和获取等操作的具象数据类型(Abstractdatatype)。
Linux的文件系统
LinuxI/O的基本组成:一切皆文件
Linux中的各类事物诸如像文档、目录(MacOSX和Windows系统下称之为文件夹)、键盘、监视器、硬盘、可联通媒体设备、打印机、调制混频器、虚拟终端,还有进程间通讯(IPC)和网路通讯等输入/输出资源都是定义在文件系统空间下的字节流。一切都可看作是文件,其最明显的用处是对于前面所列举的输入/输出资源,只须要相同的一套Linux工具、实用程序和API。你可以使用同一套api(read,write)和工具(cat,重定向,管线)来处理unix中大多数的资源。
一切皆文件指的是对所有文件(目录、字符设备、块设备、套接字、打印机等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理。屏蔽了硬件的区别,所有设备都具象成文件,提供统一的插口给用户。即使类型各不相同,并且对其提供的却是同一套操作界面。更进一步,对文件的操作也可以跨文件系统执行。
一切皆文件的不利之处在于,使用任何硬件设备都必须与根目录下某一目录执行挂载操作,否则难以使用。我们晓得,本身Linux具有一个以根目录为树叶的文件目录结构,每位设备也同样这么,它们是互相独立的。假如我们想通过Linux上的根目录找到设备文件的目录结构,就必须将这两个文件系统目录合二为一,这就是挂载的真正涵义。
文件系统
VFS,是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统插口;同时,它也提供了内核中的一个具象功能,容许不同的文件系统共存。系统中所有的文件系统不但依赖VFS共存,并且也借助VFS协同工作。不仅Linux标准的文件系统Ext2/Ext3/Ext4,Windows的vfatNTFS等,还有好多种文件系统,例如reiserfs,xfs,网路文件系统nfs。Linux通过VFS这个中间层对那些文件系统提供支持。
VFS,向下,对应用层提供一个标准的文件操作插口。向上,对文件系统提供一个标准的插口,便于其他操作系统的文件系统可以便捷的移植到Linux上。
VFS为底层文件系统提供了一个尽量大的通用模型,致使这个模型包含所有文件系统功能的合辑。因而VFS封装了底层文件系统的所有功能和具象,VFS负责把应用层的恳求转发给特定的文件系统。
目前的大部份Linux文件系统都默认采用ext4文件系统,正如先前的Linux发行版默认使用ext3、ext2以及更久前的ext。
c盘
c盘指的是系统的储存设备,常见的有机械硬碟、固态硬碟等。假如发觉应用程序要读的数据没有在页缓存中,这时侯就须要真正向c盘发起I/O恳求。c盘I/O的过程要先经过内核的通用块层、I/O调度层、设备驱动层,最后才能交给具体的硬件设备处理。
EXT导论MINIX文件系统
在有ext之前,使用的是MINIX文件系统。假如你不熟悉Linux历史,这么可以理解为MINIX是用于IBMPC/AT微型计算机的一个特别小的类Unix系统。AndrewTannenbaum为了教学的目的而开发了它,并于1987年发布了源代码(以彩印版的格式!)。
尽管你可以通读MINIX的源代码,但实际上它并不是自由开源软件(FOSS)。出版Tannebaum专著的出版商要求你花69港元的许可费来运行MINIX,而这笔费用包含在书籍的费用中。虽然这么,在那时来说十分实惠,但是MINIX的使用得到迅速发展,很快超过了Tannebaum曾经使用它来院士操作系统编码的意图。在整个20世纪90年代,你可以发觉MINIX的安装在世界各个学院上面特别流行。而此时,年青的LinusTorvalds使用MINIX来开发原始Linux内核,并于1991年首次公布,而后在1992年12月在GPL开源合同下发布。
MINIX有自己的文件系统,初期的Linux版本依赖于它。跟MINIX一样,Linux的文件系统也仿佛玩具那般小,MINIX文件系统最多能处理14个字符的文件名,但是只能处理64MB的储存空间。到了1991年,通常的硬碟规格早已达到了40-140MB。很其实,Linux须要一个更好的文件系统。
ext
当Linus开发出刚起步的Linux内核时,RémyCard从事第一代的ext文件系统的开发工作。ext文件系统在1992年首次实现并发布,ext使用在Linux内核中的新虚拟文件系统(VFS)具象层。与之前的MINIX文件系统不同的是,ext可以处理高达2GB储存空间并处理255个字符的文件名,解决了MINIX文件系统中最糟糕的问题。但ext并没有长时间占统治地位,主要是因为它原始的时间戳(每位文件仅有一个时间戳,而不是明天我们所熟悉的有inode、最近文件访问时间和最新文件更改时间的时间戳。)仅仅一年后,ext2就取代了它。
ext2
Rémy很快就意识到ext的局限性,所以一年后他设计出ext2取代它。当ext一直根植于“玩具”操作系统时,ext2从一开始就被设计为一个商业级文件系统,承袭BSD的Berkeley文件系统的设计原理。ext2提供了GB级别的最大文件大小和TB级别的文件系统大小,使其在20世纪90年代的地位牢牢巩固在文件系统大联盟中。很快它被广泛地使用,无论是在Linux内核中还是最终在MINIX中,且借助第三方模块可以使其应用于MacOS和Windows。
但这儿仍旧有一些问题须要解决:ext2文件系统与20世纪90年代的大多数文件系统一样,假如在将数据写入到c盘的时侯,系统发生崩溃或断电,则容易发生灾难性的数据受损。随着时间的推移,因为碎片(单个文件储存在多个位置,化学上其分散在旋转的c盘上),它们也遭到了严重的性能损失。虽然存在这种问题,但明天ext2还是用在个别特殊的情况下。最常见的是,作为便携式USB驱动器的文件系统格式。
ext3
1998年,在ext2被采用后的6年后,StephenTweedie宣布他正在旨在于改进ext2。这成了ext3,并于2001年11月在2.4.15内核版本中被采用到Linux内核主线中。
在大部份情况下,ext2在Linux发行版中工作得挺好,但像FAT、FAT32、HFS和当时的其它文件系统一样,在断电时容易发生灾难性的破坏。假如在将数据写入文件系统时侯发生断电,则可能会将其留在所谓“不一致”的状态——事情只完成一半而另一半未完成。这可能造成大量文件遗失或破损,这种文件与正在保存的文件无关甚至造成整个文件系统未能卸载。
ext3和20世纪90年代后期的其它文件系统,如谷歌的NTFS,使用日志来解决这个问题。日志是c盘上的一种特殊的分配区域,其写入被储存在事务中;假如该事务完成c盘写入,则日志中的数据将递交给文件系统自身。假如系统在该操作递交前崩溃,则重新启动的系统辨识其为未完成的事务而将其进行回滚,如同未曾发生过一样。这意味着正在处理的文件可能仍然会遗失,但文件系统本身保持一致,且其它所有数据都是安全的。
在使用ext3文件系统的Linux内核中实现了三个级别的日志记录方法:日记(journal)、顺序(ordered)和回写(writeback)。
跟之前的ext2类似,ext3使用16位内部主存。这意味着对于有着4K块大小的ext3在最大尺寸为16TiB的文件系统中可以处理的最大文件大小为2TiB。
ext4
TheodoreTs’o(是当时ext3主要开发人员)在2006年发表的ext4,于五年后在2.6.28内核版本中被加入到了Linux主线。Ts’o将ext4描述为一个明显扩充ext3但依然依赖于旧技术的临时技术。他预计ext4终将会被真正的下一代文件系统所替代。
ext4在功能上与ext3在功能上十分相像,但支持大文件系统,提升了对碎片的抵抗力,有更高的性能以及更好的时间戳。
ext3和ext4的差异:
大文件系统分配方式改进区段多块分配持久的预分配延后分配无限制的子目录日志校准快速文件系统检测改进的时间戳在线碎片整理
正在进行的ext4开发
尽管ext的主要开发人员觉得它只是一个真正的下一代文件系统的权宜之计,然而在一段时间内,没有任何可能的候选人打算好(因为技术或许可问题)布署为根文件系统。在未来的ext4版本中依然有一些关键功能要开发,包括元数据校准和、一流的配额支持和大分配块。
一流的配额支持大分配块
ext4的实际限制
ext4是一个强壮、稳定的文件系统。现在大多数人都应当在用它作为根文件系统,但它未能处理所有需求。让我们简单地说说你不应当期盼的一些事情——现在或可能在未来:
尽管ext4可以处理高达1EiB大小(相当于1,000,000TiB)大小的数据,但你真的不应当尝试这样做。不仅还能记住更多块的地址之外,还存在规模上的问题。而且现今ext4不会处理(但是可能永远不会)超过50-100TiB的数据。
ext4也不足以保证数据的完整性。随着日志记录的重大进展又回到了ext3的那种时侯,它并未囊括数据受损的许多常见诱因。假如数据早已在c盘上被破坏——由于故障硬件,宇宙射线的影响(是的,真的),或则只是数据随时间衰减——ext4未能测量或修补这些受损。
基于前面两点,ext4只是一个纯文件系统,而不是储存卷管理器。这意味着,虽然你有多个c盘——也就是奇偶校准或冗余,理论上你可以从ext4中恢复受损的数据,但未能晓得使用它是否对你有利。其实理论上可以在不同的层中分离文件系统和储存卷管理系统而不会遗失手动受损检查和修补功能,但这不是当前储存系统的设计方法,但是它将给新设计带来重大挑战。
Linux下其他文件系统XFS
XFS与非ext文件系统在Linux中的主线中的地位一样。它是一个64位的日志文件系统,自2001年以来外置于Linux内核中,为小型文件系统和高度并发性提供了高性能(即大量的进程就会立刻写入文件系统)。从RHEL7开始,XFS成为RedHatEnterpriseLinux的默认文件系统。对于家庭或大型企业用户来说,它依然有一些缺点:重新调整现有XFS文件系统是一件十分苦闷的事情,不如创建另一个并复制数据更有意义。
尽管XFS是稳定的且是高性能的,但它和ext4之间没有足够具体的最终用途差别,以值得推荐在非默认(如RHEL7)的任何地方使用它,除非它解决了对ext4的特定问题,比如小于50TiB容量的文件系统。XFS在任何方面都不是ZFS、Btrfs甚至WAFL(一个专有的SAN文件系统)的“下一代”文件系统。如同ext4一样,它应当被视为一种更好的方法的权宜之计。
ZFS
ZFS由SunMicrosystems开发,以zettabyte命名——相当于1万亿GB——因为它理论上可以解决小型储存系统。作为真正的下一代文件系统,ZFS提供卷管理(才能在单个文件系统中处理多个单独的储存设备),块级加密校准和(容许以极高的确切率测量数据受损),手动受损修补(其中冗余或奇偶校准储存可用),快速异步增量复制,内联压缩等。
从Linux用户的角度来看,ZFS的最大问题是许可证问题。ZFS许可证是CDDL许可证,这是一种与GPL冲突的半许可的许可证。关于在Linux内核中使用ZFS的意义存在好多争议,其争议范围从“它是GPL违法”到“它是CDDL违法”到“它完全没问题,它还没有在法院上进行过测试。”最值得注意的是,自2016年以来Canonical已将ZFS代码内联在其默认内核中,并且目前尚未能律挑战。
Btrfs
Btrfs是B-TreeFilesystem的简称,一般发音为“butter”——由ChrisMason于2007年在Oracle任职期间发布。Btrfs致力跟ZFS有大部份相同的目标,提供多种设备管理、每块校准、异步复制、直列压缩等。
截止2018年,Btrfs相当稳定,可用作标准的单c盘文件系统,但可能不应当依赖于卷管理器。与许多常见用例中的ext4、XFS或ZFS相比,它存在严重的性能问题,其下一代功能——复制、多c盘拓扑和快照管理——可能十分多,其结果可能是从灾难性地性能增加到实际数据的遗失。
Btrfs的维持状态是有争议的;SUSEEnterpriseLinux在2015年采用它作为默认文件系统,而RedHat于2017年宣布它从RHEL7.4开始不再支持Btrfs。可能值得注意的是,该产品支持Btrfs布署用作单c盘文件系统,而不是像ZFS中的多c盘卷管理器,甚至Synology在它的储存设备使用Btrfs,并且它在传统Linux内核RAID(mdraid)之上分层来管理c盘。
MacOS的文件系统
MacOS有很长的发展历史,其中经历过好多不同的文件系统。比较知名的文件系统:UFS,HFS+,以及APFS。
UFS
1985年,SteveJobs出走苹果,创立了NeXT公司。NeXT公司基于BSD开发了NeXTSTEP操作系统,也就是现今你们熟悉的MacOS的前身。NeXTSTEP当时使用的文件系统是UnixFileSystem(UFS),这是当时最先进的文件系统,对前面的文件系统的设计形成了巨大的影响。
UFS,全称是UnixFileSystem,也被叫做BerkeleyFastFileSystem。UFS并不是苹果的原创。UFS最早发表于1984年,他的作者是MarshallKirkMcKusick和WilliamJoy(Sun公司创始人)。UFS可以说是现代文件系统的鼻祖,它的出现促使文件系统可以真正适用于生产环境。在UFS之前的文件系统最多只能使用5%的c盘带宽,而UFS将这个数字提高到了50%。这主要缘于UFS中的两个设计:
UFS的c盘layout如上图。c盘被分成了多个CylinderGroup,每位CylinderGroup包含了一份Superblock的拷贝,以及这个CylinderGroup内部的元信息。因为操作文件时,一般还会先读取文件的Inode,再操作文件的DataBlock。假如Inode和DataBlock被放置在c盘上相邻的位置,那就意味着不须要额外的寻道时间。
UFS最早被实现在BSD系统上,随后,Sun的Solaris,IBM的SystemV,以及HP-UX等Unix操作系统都移植了UFS。包括现今储存界的大鳄EMC公司的好多储存产品,操作系统是Unix的,而文件系统则是基于UFS演化而至的。NeXTSTEP作为BSD的变种,自然也采用了UFS。Linux上并没有UFS的实现,但知名的ext2文件系统在设计上很大程度借鉴了UFS的思想。而ext3,ext4又是基于ext2设计的扩充,也承继了UFS的思想。
1997年2月,苹果完成竞购NeXT公司,SteveJobs回归苹果。随后的MacOS中依然保留了对UFS的支持,直至MacOSXLion版本才取消对UFS的支持。
HFS+
苹果竞购NeXT后,UFS在MacOS中作为默认文件系统的时间并不长。在1998年1月,苹果竞购NeXT一年后,发布了MacOS8.1,并搭载了HFSPlus(HFS+)文件系统,用于替代UFS。从设计上来说,HFS+相对于他的上一代HFS有了不少改进,包括从16位升级为32位,支持Unicode,最大文件支持2^63bytes等等。HFS+最吸引人的功能,就是TimeMachine了。使用过TimeMachine功能的人都晓得,这是一个十分炫目且实用的功能,它可以将文件系统完整的回滚到之前的某一个时间点,可以用于对文件系统做备份,寻回历史版本文件,也可以用于做系统迁移。
虽然这么,HFS+可以说是备受争议的文件系统,甚至被Linus指责为有史以来最烂的文件系统。对HFS+的批评主要有以下几个方面:
从技术角度来看,HFS+完全不像是一个现代文件系统,虽然它可以完成TimeMachine这样炫目的功能,而且和其他文件系统相比,技术过分落后linux 文件修改历史,败笔太多,比如大小写不敏感,不支持SparseFile等。这样HFS+很难被叫做是一个优秀的文件系统。
APFS
2017年,伴随着MacOSHighSierra版本,苹果即将发布了AppleFileSystem。而在2016年的WWDC上,苹果就早已公布了APFS项目。为了和AFS(AppleFileService)进行分辨,采用了APFS作为简写。
HFS是HFS+的前身,HFS设计于1985年,距今早已有30多年的时间。当时的c盘设备还是以软驱和c盘为主,当时的Mac笔记本的显存更是只有512K。而随着CPU,显存,储存介质技术的发展,明天我们使用的硬件和30年前相比,发生了巨大的变化。CPU向多核方向发展,显存容量不断降低,单机早已可以支持TB级容量的显存,而储存介质也从HDD渐渐转为SSD。硬件特点的变化,造成软件也须要不断调整设计和构架,就能跟得上硬件的节奏。HFS经过30年的发展,技术生命早已走到了尽头,再对HFS进行改进早已十分困难了。
从2014年开始,在Giampaolo的率领下,苹果开始设计和开发新的文件系统,也就是APFS。APFS并没有基于已有的文件系统进行整修,而是从零开始建立,仅仅用了两年的时间就发布并上线,而一般一个文件系统从开发到稳定起码须要10年左右的时间。
苹果对新的文件系统提出了以下几个需求:
同时linux漏洞扫描,和HFS+相比,APFS提供了更多的功能:
MacOS的用户只要升级到HighSierra版本,文件系统会手动从HFS+升级到APFS。之所以可以从HFS+直接升级到APFS,是由于苹果设计了一个比较巧妙的升级过程。HFS+升级到APFS的过程如下:
从性能上讲,虽然苹果声称APFS为SSD做了优化,但有不少网站对APFS的性能进行了测试,发觉APFS在SSD上的性能反倒比HFS+还有所增长。
Windows的文件系统
Windows下常见的文件系统格式有:FAT32、NTFS、exFAT
FAT32
Windows平台的传统文件格式通用格式,任何USB储存设备就会预装该文件系统,可以在任何操作平台上使用。Windows95第二版首次引入,代替FAT16(支持文件最大容量2GB),兼容性挺好,但缺点是对文件大小有限制,不支持超过4GB的文件。所以,对于好多小型游戏、镜像文件、压缩包、视频,它是没有办法的。另外,FAT32格式硬碟分区的最大容量为2TB,FAT32早已落后于时代,能不用就别用。现今低格U盘的时侯,FAT32一直是默认操作,Windows10也是这么,更多是出于兼容性的保守考虑。
exFAT
最适宜U盘的文件格式,是谷歌为闪存U盘量身定做的,性能和技术支持很先进,同时针对闪存优化保护,不会导致多余的伤害。
exFAT(ExtendedFileAllocationTableFileSystem,扩充FAT,也叫做FAT64,即扩充文件分配表)是Microsoft在WindowsEmbeded5.0以上(包括WindowsCE5.0、6.0、WindowsMobile5、6、6.1)中引入的一种适宜于闪存的文件系统,为了解决FAT32等不支持4G及其更大的文件而推出。对于闪存,NTFS文件系统不适宜使用,exFAT更为适用。对于c盘则不太适用exFAT。主要用处包括:提高台式机/电脑、移动设备之间的互操作能力、单文件最大16EB、剩余空间分配表改善空间分配行、同一目录下最多65536个文件、支持访问控制。最大的缺点是没有文件日志功能linux 文件修改历史,这样就不能记录c盘上文件的更改记录。
exFAT借助剩余空间位图来管理容量分配,提升删掉性能,这对改善写入性能十分重要,尤其是对比NTFS。但要注意的是,在exFAT分区上安装Windows系统是不可能的。WindowsVista/7都十分依赖NTFS的文件许可等特点。不过因为谷歌授权机制的限制,exFAT的普及并不广泛,在消费电子领域的应用也不是非常多。
NTFS
Windows平台目前应用最广泛的格式,也是目前最好的,支持大容量文件和超大分区,但是有好多中级技术,包括长文件名、压缩分区、事件追踪、文件索引、高容错性、数据保护和恢复、加密访问等等。并且,NTFS一直是针对机械硬碟设计的,会记录详尽的硬碟读写操作,因而对于闪存(例如U盘、固态硬碟、SD卡等)会有很大的负担和伤害,容易影响寿命。闪存存储芯片读写次数是有限的,使用日志式文件系统的话,意味着所有对c盘的操作都要记录日志。大量的小文件读写对于闪存的伤害是极大的,会减短寿命。所以U盘不建议使用NTFS。
笔记本使用固态硬碟时为何仍旧在使用为机械盘设计的NTFS文件系统?由于没有更好的选择!
ReFS
弹性文件系统(德语:ResilientFileSystem,简称ReFS)。这是一个谷歌在WindowsServer2012中引入的专有文件系统,目的是成为NTFS以后的“下一代”文件系统。ReFS致力克服NTFS被设想以来出现的重要问题,面向已改变的数据储存需求。ReFS的关键设计优势包括手动完整性检测和数据清除、避免须要运行chkdsk、防止数据没落、内置硬碟驱动器故障和冗余的处理、集成RAID功能、数据和元数据更新切换到写时复制/分配、超长路径和文件名的处理,以及储存虚拟化和储存池、包括几乎任意大小的逻辑卷(与所用驱动器的化学大小无关)。从Win101709夏季创意者更新版开始,只有Win10企业版和Win10Pro工作站版提供ReFS分区选项linux windows,其他Win10版本不再支持。
ReFS是与NTFS大部份兼容的,其主要目的是为了保持较高的稳定性,可以手动验证数据是否受损,并竭力恢复数据。假如和引入的StorageSpaces(储存空间)联合使用的话则可以提供更佳的数据防护。同时对于上亿级别的文件处理也有性能提高。
参考链接: