目录
一、ext4文件系统
二、XFS文件系统
三、其他文件系统
一、ext4文件系统
ext4是第四代扩展文件系统是linux系统下的日志文件系统。
ext4文件系统的特点:
1、更大的文件系统和更大的文件
ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对于一般的台式机和服务器而言,这可能并不重要,但对于大型的磁盘阵列的用户而言,这就非常重要了。
2、更多的子目录数量
ext4在理论上支持无限制数量的子目录。
3、更多的块和i-节点数量
ext4文件系统使用64位空间记录块数量和i-节点数量。
4、多块分配
ext4的多块分配器“支持一次调用分配多个数据块”。
5、持久性预分配
ext4在文件系统层面实现了持久预分配并提供相应的API,比应用软件自己实现更有效率。
6、延迟分配
ext4的策略是尽可能地延迟分配,直到文件在缓冲中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,显著提升性能。
7、盘区结构
ext4引入了盘区概念,每个盘区为一组连续的数据块,提高访问效率。
8、新的i-节点结构
ext4支持更大的i-节点,在i-节点中容纳更多的扩展属性,默认i-节点大小为256字节。另外,ext4还支持快速扩展属性和i-节点保留。
9、日志校验功能
日志是文件系统最常用的结构,日志也很容易损坏,而从损坏的日志中恢复数据会导致更多的数据损坏。ext4给日志数据添加了校验功能,日志校验功能可以很方便地判断日志数据是否损坏。而且ext4将ext3的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。
10、支持“无日志”模式
日志总归会占用一些开销。ext4允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
11、默认启用Barrier
磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写Commit记录。若Commit记录写入在先,而日志有可能损坏,那么就会影响数据完整性。ext4文件系统默认启用Barrier,只有当Barrier之前的数据全部写入磁盘,才能写Barrier之后的数据。
12、在线碎片整理
尽管延迟分配、多块分配和盘区功能可以有效减少文件的碎片,但碎片还是不可避免会产生。ext4支持在线碎片整理,并将提供e4defrag工具进行个别文件或整个文件系统的碎片整理。
13、支持快速fsck
ext4给每个块组的i-节点表中都添加了一份未使用i-节点的列表,所以ext4文件系统做一致性检查时就可以跳过它们而只去检查哪些在使用的i-节点,从而提高了速度。
14、支持纳秒级时间戳
ext4之前的扩展文件系统的时间戳都是以秒为单位的,这已经能够应付大多数设置,但随着处理器的速度和集成程度(多核处理器)不断提升,以及Linux开始向其他应用领域发展,它将时间戳的单位提升到纳秒。
ext4给时间范围增加了两个位,从而让时间寿命在延长500年,ext4的时间戳支持的日期到2514年4月25日。
Ext4文件系统的向前和向后兼容
Ext4文件系统在Ext3的基础之上做了很多改进,引入了大量新功能,这些改进主要是为了提高未来的Linux系统的性能。
虽然Ext4做了很多改进,但依然能够与Ext3实现向后和向前的兼容性,这一点的确很难得。
因为Ext3文件系统是Linux操作系统上最受欢迎的文件系统之一,所以Ext4的研发人员考虑到应该让Ext3用户能够轻松迁移到Ext4,为此,Ext4被设计为在盘区结构方面具有向后和向前的兼容性。
首先Ext4是可以向前兼容的,也就是说Ext3文件系统可以挂载为Ext4文件系统使用,不过为了充分利用Ext4的优势,必须实现文件系统的迁移,以转换和利用新的Ext4格式。
Ext3文件系统可以在线转换为Ext4,但这样并不能用到Ext4的全部新特性,只有将文件系统重新创建为Ext4才比较彻底。
Ext4的向后兼容,向后兼容就是指可以将Ext4文件系统挂载为Ext3文件系统使用,但是前提是Ext4文件系统不能使用盘区功能。
二、XFS文件系统
XFS一种高性能的日志文件系统,极具伸缩性,非常健壮。,特别擅长处理大文件,同时提供平滑的数据传输。
主要特性包括以下几点:
数据完全性
采用XFS文件系统,当意想不到的宕机发生后,首先,由于文件系统开启了日志功能,所以你磁盘上的文件不再会意外宕机而遭到破坏了。不论目前文件系统上存储的文件与数据有多少,文件系统都可以根据所记录的日志在很短的时间内迅速恢复磁盘文件内容。
传输特性
XFS文件系统采用优化算法,日志记录对整体文件操作影响非常小。XFS查询与分配存储空间非常快。xfs文件系统能连续提供快速的反应时间。笔者曾经对XFS、JFS、Ext3、ReiserFS文件系统进行过测试,XFS文件文件系统的性能表现相当出众。
可扩展性
XFS 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大 小为263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为18 exabytes。
XFS使用高的表结构(B+树),保证了文件系统可以快速搜索与快速空间分配。XFS能够持续提供高速操作,文件系统的性能不受目录中目录及文件数量的限制。
传输带宽
XFS 能以接近裸设备I/O的性能存储数据。在单个文件系统的测试中,其吞吐量最高可达7GB每秒,对单个文件的读写操作,其吞吐量可达4GB每秒。
容量
XFS是一个64位文件系统,最大支持 8exbibytes 减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在
16tebibytes。
文件系统日志
日志文件系统是一种即使在断电或者是操作系统崩溃的情况下保证文件系统一致性的途径。XFS对文件系统元数据提供了日志支持。当文件系统更新时,元数据会在实际的磁盘块被更新之前顺序写入日志。XFS的日志被保存在磁盘块的循环缓冲区上,不会被正常的文件系统操作影响。XFS日志大小的上限是64k个块和128MB中的较大值,下限取决于已存在的文件系统和目录的块的大小。在外置设备上部署日志会浪费超过最大日志大小的空间。XFS日志也可以被存在文件系统的数据区(称为内置日志),或者一个额外的设备上(以减少磁盘操作)。
XFS的日志保存的是在更高层次上描述已进行的操作的“逻辑”实体。相比之下,“物理”日志存储每次事务中被修改的块。为了保证性能,日志的更新是异步进行的。当系统崩溃时,崩溃的一瞬间之前所进行的所有操作可以利用日志中的数据重做,这使得XFS能保持文件系统的一致性。XFS在挂载文件系统的同时进行恢复,恢复速度与文件系统的大小无关。对于最近被修改但未完全写入磁盘的数据,XFS保证在重启时清零所有未被写入的数据块,以防止任何有可能的、由剩余数据导致的安全隐患(因为虽然从文件系统接口无法访问这些数据,但不排除裸设备或裸硬件被直接读取的可能性)。
分配组
XFS文件系统内部被分为多个“分配组”,它们是文件系统中的等长线性存储区。每个分配组各自管理自己的inode和剩余空间。文件和文件夹可以跨越分配组。这一机制为XFS提供了可伸缩性和并行特性——多个线程和进程可以同时在同一个文件系统上执行I/O操作。这种由分配组带来的内部分区机制在一个文件系统跨越多个物理设备时特别有用,使得优化对下级存储部件的吞吐量利用率成为可能。
条带化分配
在条带化RAID阵列上创建XFS文件系统时,可以指定一个“条带化数据单元”。这可以保证数据分配、inode分配、以及内部日志被对齐到该条带单元上,以此最大化吞吐量。
基于Extent的分配方式
XFS文件系统中的文件用到的块由变长Extent管理,每一个Extent描述了一个或多个连续的块。相比将每个文件用到的所有的块存储为列表的文件系统,这种策略大幅缩短了列表的长度。有些文件系统用一个或多个面向块的栅格管理空间分配——在XFS中这种结构被由一对B+树组成的、面向Extent的结构替代了;每个文件系统分配组(AG)包含这样的一个结构。其中,一个B+树用于索引未被使用的Extent的长度,另一个索引这些Extent的起始块。这种双索引策略使得文件系统在定位剩余空间中的Extent时十分高效。
可变块尺寸
块是文件系统中的最小可分配单元。XFS允许在创建文件系统时指定块的大小,从 512 字节到
64KB,以适应专门的用途。比如,对于有很多小文件的应用,较小的块尺寸可以最大化磁盘利用率;但对于一个主要处理大文件的系统,较大的块尺寸能提供更好的性能。
延迟分配
主条目:延迟分配
XFS在文件分配上使用了惰性计算技术。当一个文件被写入缓存时,XFS简单地在内存中对该文件保留合适数量的块,而不是立即对数据分配Extent。实际的块分配仅在这段数据被冲刷到磁盘时才发生。这一机制提高了将这一文件写入一组连续的块中的机会,减少碎片的同时提升了性能。
稀疏文件
XFS对每个文件提供了一个64位的稀疏地址空间,使得大文件中的“洞”(空白数据区)不被实际分配到磁盘上。因为文件系统对每个文件使用一个Extent表,文件分配表就可以保持一个较小的体积。对于太大以至于无法存储在inode中的分配表,这张表会被移动到B+树中,继续保持对该目标文件在64位地址空间中任意位置的数据的高效访问。
扩展属性
XFS通过实现扩展文件属性给文件提供了多个数据流,使文件可以被附加多个名/值对。文件名是一个最大长度为256字节的、以NULL字符结尾的可打印字符串,其它的关联值则可包含多达 64KB 的二进制数据。这些数据被进一步分入两个名字空间中,root和user。保存在root名字空间中的扩展属性只能被超级用户修改,user名字空间中的可以被任何对该文件拥有写权限的用户修改。扩展属性可以被添加到任意一种XFS inode上,包括符号链接、设备节点、目录,等等。可以使用
attr 这个命令行程序操作这些扩展属性。xfsdump 和 xfsrestore 工具在进行备份和恢复时会一同操作扩展属性,而其它的大多数备份系统则会忽略扩展属性。
Direct I/O
对于要求高吞吐量的应用,XFS给用户空间提供了直接的、非缓存I/O的实现。数据在应用程序的缓冲区和磁盘间利用DMA进行传输,以此提供下级磁盘设备全部的I/O带宽。
确定速率 I/O
XFS确定速率I/O系统给应用程序提供了预留文件系统带宽的API。XFS会动态计算下级存储设备能提供的性能,并在给定的时间内预留足够的带宽以满足所要求的性能。此项特性是XFS所独有的。确定方式可以是硬性的或软性的,前者提供了更高性能,而后者相对更加可靠。不过只要下级存储设备支持硬性速率确定,XFS就只允许硬性模式。这一机制最常被用在实时应用中,比如视频流。
DMAPI
XFS实现了数据管理应用程序接口(DMAPI)以支持高阶存储管理(HSM)。到2010年10月为止,Linux上的XFS实现已经支持DMAPI所要求的的磁盘元数据规范,但有报告称内核支持仍处于不稳定状态。此前SGI曾提供了一个包含DMAPI钩子的内核源码树,但这个支持未被合并进主代码树。不过现在内核开发者们已经注意到了它并对其做了更新。
快照
XFS并不直接提供对文件系统快照的支持,因为XFS认为快照可在卷管理器中实现。对一个XFS文件系统做快照需要调用 xfs_freeze 工具冻结文件系统的I/O,然后等待卷管理器完成实际的快照创建,再解冻I/O,继续正常的操作。之后这个快照可以被当作备份,以只读方式挂载。在IRIX上发布的XFS包含了一个整合的卷管理器,叫XLV。这个卷管理器无法被移植到Linux上,不过XFS可以和Linux上标准的LVM正常工作。在最近发布的Linux内核中,xfs_freeze
的功能被实现在了VFS层,当卷管理器的快照功能被唤醒时将自动启动 xfs_freeze。相对于无法挂起,卷管理器也无法对其创建“热”快照的ext3文件系统,XFS的快照功能具有很大优势。幸运地是,现在这种情况已经改观。从Linux
2.6.29内核开始,ext3, ext4,
gfs2和jfs文件系统也获得了冻结文件系统的特性。
在线碎片整理
虽然XFS基于Extent的特征和延迟分配策略显著提高了文件系统对碎片问题的抵抗力,XFS还是提供了一个文件系统碎片整理工具,xfs_fsr(XFS
filesystem reorganizer的简称)。这个工具可以对一个已被挂载、正在使用中的XFS文件系统进行碎片整理。
在线尺寸调整
XFS提供了 xfs_growfs 工具,可以在线调整XFS文件系统的大小。XFS文件系统可以向保存当前文件系统的设备上的未分配空间延伸。这个特性常与卷管理功能结合使用,因为后者可以把多个设备合并进一个逻辑卷组,而使用硬盘分区保存XFS文件系统时,每个分区需要分别扩容。到2010年8月为止,XFS分区不可以原位收缩,不过有一些方法可以变相处理这个问题。
原生备份/恢复工具
XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据。xfsdump 按inode顺序备份一个XFS文件系统。与传统的UNIX文件系统不同,XFS不需要在dump前被卸载;对使用中的XFS文件系统做dump就可以保证镜像的一致性。这与XFS对快照的实现不同,XFS的dump和restore的过程是可以被中断然后继续的,无须冻结文件系统。xfsdump
甚至提供了高性能的多线程备份操作——它把一次dump拆分成多个数据流,每个数据流可以被发往不同的目的地。不过到目前为止,Linux尚未完成对多数据流dump功能的完整移植。
原子磁盘配额
XFS的磁盘配额在文件系统被初次挂载时启用。这解决了一个在其它大多数文件系统中存在的一个竞争问题:要求先挂载文件系统,但直到调用quotaon(8)之前配额不会生效。
性能考虑
写入屏障
XFS文件系统默认在挂载时启用“写入屏障”的支持。该特性会一个合适的时间冲刷下级存储设备的写回缓存,特别是在XFS做日志写入操作的时候。这个特性的初衷是保证文件系统的一致性,具体实现却因设备而异——不是所有的下级硬件都支持缓存冲刷请求。在带有电池供电缓存的硬件RAID控制器提供的逻辑设备上部署XFS文件系统时,这项特性可能导致明显的性能退化,因为文件系统的代码无法得知这种缓存是非易失性的。如果该控制器又实现了冲刷请求,数据将被不必要地频繁写入物理磁盘。为了防止这种问题,对于能够在断电或发生其它主机故障时保护缓存中数据的设备,应该以
nobarrier 选项挂载XFS文件系统。日志的放置
XFS文件系统创建时默认使用内置日志,把日志和文件系统数据放置在同一个块设备上。由于在所有的文件系统写入发生前都要更新日志中的元数据,内置日志可能导致磁盘竞争。在大多数负载下,这种等级的竞争非常低以至于对性能没有影响。但对于沉重的随机写入负载,比如在忙碌的数据块服务器上,XFS可能因为这种I/O竞争无法获得最佳性能。另一个可能提高这个问题的严重性的因素是,日志写入被要求以同步方式提交——它们必须被完全写入,之后对应实际数据的写入操作才能开始。
如果确实需要最佳的文件系统性能,XFS提供了一个选项,允许把日志放置在一个分离的物理设备上。这只需要很小的物理空间。分离的设备有自己的I/O路径,如果该设备能对同步写入提供低延迟的路径,那么它将给整个文件系统的操作带来显著的性能提升。SSD,或带有写回缓存的RAID系统是日志设备的合适候选,它们能满足这种性能要求。不过后者在遭遇断电时可能降低数据的安全性。要启用外部日志,只须以
logdev 选项挂载文件系统,并指定一个合适的日志设备即可。缺点
XFS文件系统无法被收缩。
历史上XFS上的元数据操作曾比其它文件系统都慢,表现为在删除大量小文件时性能糟糕。该性能问题是被Red
Hat的XFS开发者Dave Chinner在代码中定位到的。使用一个叫“延迟记录”的挂载选项可以成数量级地提升元数据操作的性能。该选项几乎把日志整个存在内存中。Linux内核主线版本2.6.35中作为一个试验性特性引入了这个补丁,在2.6.37中使它成为了一个稳定的特性,并计划在2.6.39中把它作为默认的日志记录方法。早期测试显示在有少量线程的环境中其性能接近EXT4,在大量线程的环境下超过了EXT4。三、其他文件系统
Minix 是Linux支持的第一个文件系统,对用户有很多限制,性能低下,有些没有时间标记,文件名最长l4个字符。Minix文件系统最大缺点是只能使用64MB的硬盘分区,所以目前已经没有人使用它了。
Xia 是Minix文件系统修正后的版本,在一定程度上解决了文件名和文件系统大小的局限。但是没有新的特色,目前很少有人使用。
ISO9660 标准CDROM文件系统,通用的Rock Ridge增强系统,允许长文件名。
NFS Sun公司推出的网络文件系统,允许多台计算机之间共享同一文件系统,易于从所有这些计算机上存取文件。
SysV 是System V/Coherent在Linux平台上的文件系统。
除了上面这些Linux文件系统外,Linux也可以支持基于Windows和Netware的文件系统,例如UMSDOS、 MSDOS、VFAT、HPFS、SMB和NCPFS等。兼容这些文件系统对Linux用户也是很重要的,毕竟在桌面环境下Windows文件系统还是很流行的,而Netware网络也有许多用户,Linux用户也需要共享这些文件系统的数据。
UMSDOS Linux下的扩展MSDOS文件系统驱动,支持长文件名、所有者、允许权限、连接和设备文件。允许一个普通的MSDOS文件系统用于Linux,而且无须为它建立单独的分区。
MSDOS 是在DOS、Windows和某些OS/2操作系统上使用的一种文件系统,其名称采用“8+3”的形式,即8个字符的文件名加上3个字符的扩展名。
VFAT 是Windows 9x和Windows NT/2000下使用的一种DOS文件系统,其在DOS文件系统的基础上增加了对长文件名的支持。
HPFT 高性能文件系统(High Performance File System,HPFS)是微软的LAN Manager中的文件系统,同时也是IBM的LAN Server和OS/2的文件系统。HPFT能访问较大的硬盘驱动器,提供了更多的组织特性,并改善了文件系统的安全特性。
SMB 是一种支持Windows for Workgroups、Windows NT和Lan Manager的基于SMB协议的网络操作系统。
NCPFS 是一种Novell NetWare使用的NCP协议的网络操作系统。
NTFS 是Windows NT/2000操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。