早期的Windows可能还需要在Fat32及NTFS之间选择,但现在Windows 和 Mac OS X 用户对于文件系统,只有一种选择,那就是 NTFS 和 APFS。相反,对于 Linux 系统而言,有很多种文件系统可以选择,现在默认的是广泛采用的 ext4。也有用户会尝试新的btrfs 文件系统。那btrfs有什么优点,它与其它文件系统又有什么相同点及区别呢?
首先让我们对文件系统有一个简单的认识,然后我们再对Linux下几个常用的文件系统做一个详细的比较。
本文整理自网络(文末有详细参考网址)
一、什么是文件系统
我们使用硬盘,并不是直接读写物理硬盘设备,而是通过文件系统来管理和访问硬盘上的文件。
文件系统主要用于控制所有程序在不使用数据时如何存储数据、如何访问数据以及有什么其它信息(元数据)和数据本身相关,等等。听起来要编程实现并不是轻而易举的事情,实际上也确实如此。文件系统一直在改进,包括了更多的功能、更高效地完成它需要做的事情。总而言之,它是所有计算机的基本需求、但并不像听起来那么简单。
文件系统(File System或fs),定义并实现了数据在存储介质(如硬盘等)上的存储方式和结构,以及其是如何被访问的,如索引、读取等。操作系统里,硬盘中的数据被抽象为文件的形式,并对其进行管理,比如为一块或多块数据关联一个文件名等,这些用于管理文件的数据结构(以及其对应的规则)为文件系统,Unix中更是讲一切皆文件,可见文件系统的地位非常之高。随着技术的发展,现代的文件系统特性也越来越多,如Btrfs等文件系统,支持快照、子卷、校验和自检、软RAID甚至透明压缩等。
二、文件分区
由于每个操作系统都能创建或者删除分区,很多人对分区都有模糊的认识。Linux 操作系统即便使用标准安装过程,在同一块磁盘上仍使用多个分区,这看起来很奇怪,因此需要一些解释。拥有不同分区的一个主要目的就是为了在灾难发生时能获得更好的数据安全性。
通过将硬盘划分为分区,数据会被分隔以及重组。当事故发生的时候,只有存储在被损坏分区上的数据会被破坏,很大可能上其它分区的数据能得以保留。这个原因可以追溯到 Linux 操作系统还没有日志文件系统、任何电力故障都有可能导致灾难发生的时候。
使用分区也考虑到了安全和健壮性原因,因此操作系统部分损坏并不意味着整个计算机就有风险或者会受到破坏。这也是当前采用分区的一个最重要因素。举个例子,用户创建了一些会填满磁盘的脚本、程序或者 web 应用,如果该磁盘只有一个大的分区,如果磁盘满了那么整个系统就不能工作。如果用户把数据保存在不同的分区,那么就只有那个分区会受到影响,而系统分区或者其它数据分区仍能正常运行。
记住,拥有一个日志文件系统只能在掉电或者和存储设备意外断开连接时提供数据安全性,并不能在文件系统出现坏块或者发生逻辑错误时保护数据。对于这种情况,用户可以采用廉价磁盘冗余阵列RAID:Redundant Array of Inexpensive Disks的方案。
三、一些术语
这些术语可能适应ZFS 或Btrfs
写时拷贝
写时拷贝(Copy-on-write)是另一个有趣并且很酷的特性。在大多数文件系统上,当数据被重写时,它将永久丢失。而在 ZFS 中,新数据会写到不同的块。写完成之后,更新文件系统元数据信息,使之指向新的数据块(LCTT 译注:更新之后,原数据块成为磁盘上的垃圾,需要有对应的垃圾回收机制)。这确保了如果在写新数据的时候系统崩溃(或者发生其它事,比如突然断电),那么原数据将会保存下来。这也意味着,在系统发生崩溃之后,不需要运行 fsck 来检查和修复文件系统。
快照
写时拷贝使得 ZFS 有了另一个特性: 快照(snapshots)。ZFS 使用快照来跟踪文件系统中的更改。快照包含文件系统的原始版本(文件系统的一个只读版本),实时文件系统则包含了自从快照创建之后的任何更改。没有使用额外的空间。因为新数据将会写到实时文件系统新分配的块上。如果一个文件被删除了,那么它在快照中的索引也会被删除。所以,快照主要是用来跟踪文件的更改,而不是文件的增加和创建。
快照可以挂载成只读的,以用来恢复一个文件的过去版本。实时文件系统也可以回滚到之前的快照。回滚之后,自从快照创建之后的所有更改将会丢失。
数据完整性验证和自动修复
当向 ZFS 写入新数据时,会创建该数据的校验和。在读取数据的时候,使用校验和进行验证。如果前后校验和不匹配,那么就说明检测到了错误,然后,ZFS 会尝试自动修正错误。
RAID-Z
ZFS 不需要任何额外软件或硬件就可以处理 RAID(磁盘阵列)。毫不奇怪,因为 ZFS 有自己的 RAID 实现:RAID-Z 。RAID-Z 是 RAID-5 的一个变种,不过它克服了 RAID-5 的写漏洞:意外重启之后,数据和校验信息会变得不同步(LCTT 译注:RAID-5 的条带在正写入数据时,如果这时候电源中断,那么奇偶校验数据将跟该部分数据不同步,因此前边的写无效;RAID-Z 用了 “可变宽的 RAID 条带” 技术,因此所有的写都是全条带写入)。为了使用基本级别的 RAID-Z(RAID-Z1),你需要至少三块磁盘,其中两块用来存储数据,另外一块用来存储奇偶校验信息。而 RAID-Z2 需要至少两块磁盘存储数据以及两块磁盘存储校验信息。RAID-Z3 需要至少两块磁盘存储数据以及三块磁盘存储校验信息。另外,只能向 RAID-Z 池中加入偶数倍的磁盘,而不能是奇数倍的。
四、为什么要选择文件系统
文件系统的选择,其重要性不言而喻,可能仅次于Linux发行版的选择。其实,各个文件系统在功能及性能方面是有不小的差异的。我们主要讨论Linux中主流的三个文件系统:Ext4、XFS以及Btrfs的功能特点
ext4 文件系统由 ext3 文件系统改进而来,而后者又是从 ext2 文件系统改进而来。虽然 ext4 文件系统已经非常稳定,是过去几年中绝大部分发行版的默认选择,但它是基于陈旧的代码开发而来。另外, Linux 操作系统用户也需要很多 ext4 文件系统本身不提供的新功能。虽然通过某些软件能满足这种需求,但性能会受到影响,在文件系统层次做到这些能获得更好的性能。
而Btrfs提供了更多新的功能,也扩大了容量,也可作为新的选择。但因为它是一种新的文件系统,有可能会有些Bug或稳定性的问题。所以选择文件系统需要考虑多方面的因素,综合考虑。
五、Linux下几种常用的文件系统
Ext4、XFS、Btrfs都是实现在Kernel代码中的fs目录下。文件系统需要实现操作系统所定义的对象和接口,如inode、dentry等。
Linux下常用的文件系统有:Ext4、XFS、ZFS、Btrfs
1、Ext4 文件系统
Ext4(ext4日志文件系统、第四代扩展文件系统)文件系统是Linux用途最广泛的日志文件系统。Ext4稳定版本发布于2008年,即Linux 2.6.28版本。但它的历史最早可以追溯到1992年的Ext2文件系统,那是Linux最早使用的文件系统,而后2001年出现的Ext3在Ext2基础上增加了日志功能,并最终由Ext4替代,而且Ext4可向前兼容Ext2/Ext3。Ext4是很多发行版如Debian、Ubuntu等的默认文件系统。什么是日志(Journaling)文件系统?就是在数据更改正式提交至硬盘之前,先在日志区域(也是存在文件系统上的)记录变更日志,这样可以在系统崩溃或掉电后能快速恢复。
Ext4在Ext3的基础上,增加了新特性。
1)大文件支持
最大卷 1EiB ,最大文件 16TiB (对于4KiB块)。Ext4中实现了基于extent的数据管理。extents可以简单理解为连续的块,有了它管理大文件就更方便,大大降低了用于索引大文件的元数据量——原来用间接块索引(Indirect Block)的方法是非常浪费的——自然访问也性能也提升。而且,Ext4的inode比Ext3大一倍,达到256字节。
2)增加并优化了日志校验和(journal check summing)功能,fsck过程更快
这两个特性XFS和Btrfs也都支持。
3)无日志模式
4)多块分配、延迟分配
5)在线去除碎片(defragmentation)
ext4的限制:最大文件大小是 16 tebibytes(大概是 17.6 terabytes),但这比我们当前能买到的硬盘都要大,所以这个限制暂时并不是太大的问题。使用 ext4 能创建的最大卷/分区是 1 exbibyte(大概是 1,152,921.5 terabytes)
ext4 比 ext3 有很大的速度提升。另它是一个日志文件系统,意味着它会对文件在磁盘中的位置以及任何其它对磁盘的更改都会做记录。不过它还不支持透明压缩、重复数据删除或者透明加密。技术上支持了快照,但该功能还处于实验性阶段。
2、XFS 文件系统
XFS 文件系统是扩展文件系统extent file system的一个扩展。XFS 是 64 位高性能日志文件系统。对 XFS 的支持大概在 2002 年合并到了 Linux 内核,到了 2009 年,红帽企业版 Linux 5.4 也支持了 XFS 文件系统。对于 64 位文件系统,XFS 支持最大文件系统大小为 8 exbibytes。
目前RHEL 7.0 文件系统默认使用 XFS。XFS是1993年由SiliconGraphic Inc(SGI) 公司创建的高性能的64位文件系统。2001年进入Linux内核,如今已被大多数Linux发行版支持。最支持的要数红帽公司,其下主打的操作系统RHEL(Red Hat Enterprise Linux)7和8——即最近两个稳定版——都选XFS为默认的文件系统,红帽的很多工程师也深度参与了XFS的开发和维护。
XFS的文件系统结构如上,不同于Ext4,它通过B+树来索引inode和数据块。用树结构的文件系统通常相比Ext4用表结构,如链表、直接/间接Block以及extent,能更好地支持大文件,如视频/数据库文件等。另外其元数据规模少,使得硬盘可用空间更多,实测XFS、Btrfs多平均至少1.5%以上的可用空间。
XFS能支持单卷可达 8EiB ,最大文件也到 8EiB ,相比Ext4的16TiB可高了几个数量级。而且是其实动态分配inode的实现机制,只要有空间,就不会耗尽inode。通过df命令看出,其inode初始值就是ext4的10倍左右。
另外,XFS可以更高效支持并行IO操作,RAID上的扩展性更好,多线程并行读写时相比Ext4有优势。
XFS 文件系统有一些缺陷,例如它不能压缩,删除大量文件时性能低下。
3、ZFS
ZFS 在创建之初linux手机,就被设计为最后一代文件系统。在大多数文件系统都是 64 位的时候,ZFS 创建者决定直接跳到 128 位。这意味着 ZFS “提供了 32 位或 64 位系统容量的 160 亿倍”。
当谈到 ZFS 功能和安装时,其实说的是 OpenZFS。自从 Oracle 停止对 OpenSolaris 更新代码之后[1],ZFS(由 Oracle 开发)和 OpenZFS 遵循了不同的路径
ZFS 是一个先进的文件系统。因此,它有一些有趣的特性。比如:
如果想开箱即用地使用 ZFS,则需要安装 FreeBSD或使用 illumos 内核的操作系统。illumos是 OpenSolaris 内核的一个分支。事实上,对 ZFS 的支持是一些有经验的 Linux 用户选择 BSD的主要原因之一。
如果想在 Linux 上试用 ZFS,可以将其用作存储文件系统。最近,Ubuntu 19.10 引入了在根目录上开箱即用安装 ZFS 的功能
4、Btrfs 文件系统
Btrfs,是B-Tree File System的缩写,可以读作“butter fs”或“b-tree fs”,是一个支持copy-on-write (COW)的文件系统,由Oracle公司于2007年设计并使用,2013年进入Linux内核稳定发布。 目前除了Oracle外,SUSE Linux Enterprise Server将其用作默认文件系统,而在工作站领域中,Fedora 33也将其作为默认文件系统,Facebook公司也大量应用了Btrfs文件系统。
btrfs是一个几乎完全从头开发的文件系统。btrfs 出现的原因是它的开发者起初希望扩展文件系统的功能使得它包括快照、池化pooling、校验以及其它一些功能。虽然和 ext4 无关,它也希望能保留 ext4 中能使消费者和企业受益的功能(小辣椒高效Office),并整合额外的能使每个人,尤其是企业受益的功能。对于使用大型软件以及大规模数据库的企业,让多种不同的硬盘看起来一致的文件系统能使他们受益并且使数据整合变得更加简单。删除重复数据能降低数据实际使用的空间,当需要镜像一个单一而巨大的文件系统时使用 btrfs 也能使数据镜像变得简单。
用户当然可以继续选择创建多个分区从而无需镜像任何东西。考虑到这种情况,btrfs 能横跨多种硬盘,和 ext4 相比,它能支持 16 倍以上的磁盘空间。btrfs 文件系统一个分区最大是 16 exbibytes,最大的文件大小也是 16 exbibytes。
Btrfs的强大之处,在于实现了很多先进特性的同时,还保持了很高的容错能力、可扩展性以及可靠性。其最早的COW B-tree的数据结构也是2007年才提出的,Btrfs比Ext4、XFS小了近20年,是一个现代文件系统。
Btrfs支持大文件,16EiB最大卷和文件大小;集成了卷管理功能,可以以卷的方式动态地增减设备,实现硬盘资源池化;高效的数据完整性check,如基于cow的自恢复(self-healing)、基于checksum的数据清理(data scrubbing);高性能的读写/只读快照,得益于cow,增量快照和备份非常直接、灵活且低成本;软raid支持,数据和元数据的stripe和mirror生产环境级别支持;透明的压缩,支持lzo和zlib;在线去碎片(online defragmentation);数据去重(data deduplication)。
这方面,与其说是更好的文件系统,倒不如说它把传统的逻辑卷管理(如LVM)、软RAID(如mdadm)等工具做的工作集成在了文件系统层面上red hat linux下载,方便了系统管理员,确实是一大进步。
BTRFS 相对其它文件系统提供以下更多的功能
1)支持大文件
Btrfs 文件系统最多可以支持 2个 64 字节,相当于16EiB或exbibytes!现在这是一个巨大的存储空间!
2)高效的文件存储
Btrfs 提供基于范围的文件存储。这被描述为为文件存储保留的连续区域。文件元数据的开销大大减少,小元数据直接有助于提高存储效率和性能。
Btrfs 仍然是高效的文件存储,它通过将较小的文件打包为元数据来为它们提供高效的存储。
3)内置 RAD 支持
Btrfs 文件系统包括对 RAID 0(数据剥离)、1(数据镜像)和 RAID 10(数据剥离和镜像)的支持
4)在线碎片整理和调整大小
使用 Btrfs,即使文件系统处于联机状态,也可以执行碎片整理和调整大小。
5)动态inode分配
Btrfs 提供 inode 的动态分配。它会在需要时将 inode 分配给文件,这有助于防止在文件系统上有很多小文件的情况下 inode 耗尽。
6)可写和只读快照
Btrfs 提供的另一个出色功能是对快照的支持。您可以轻松地创建文件系统的快照,并在数据意外删除或损坏时利用它来恢复其他地方的数据。
你会发现像群晖Nas也提供Btrfs文件系统并提供创建快照的功能,这个在防范病毒木马攻击及数据恢复非常有用。
7)支持校验和
另一个重要特性是对校验和的支持。校验和是小块数据,可以避免静默文件或数据损坏的可能性,这是其他文件系统不提供的。校验和存储在文件系统中,并持续关注文件系统错误和数据损坏的迹象。
8)优化对 SSD 驱动器的支持
SSD(固态硬盘)驱动器确实在 PC 中提供了相当程度的速度、可靠性和稳定性。Btrfs 文件系统通过优化它们的读写性能进一步提高了它们的性能,从而提高了 SSD 的寿命。
六、Ext4 和 Btrfs 文件系统的比较在各种关键特性上对Ext4 和 Btrfs文件系统进行比较。
1.日志和写时复制支持
这是两个文件系统之间出现的第一个主要区别。Ext4 文件系统是一个日志文件系统,而 Btrfs 是一个 Copy-on-Write (CoW) 文件系统。
2.多设备支持
将单个文件系统分布在多个设备上提供了某些优势,例如容量增加和可靠性更高。Btrfs 具有内置的 RAID 支持,可以轻松地在文件系统级别管理多个设备。
Ext4 文件系统没有对多设备的内置支持。您将不得不使用LVM 2之类的第 3 方逻辑卷管理器将文件系统跨越多个设备和磁盘。
3.文件系统级重复数据删除:
重复数据删除是一种自动从文件系统中删除重复数据副本以节省磁盘空间的功能。Btrfs 文件系统通过将文件系统中的相同块替换为指向该块的单个副本的逻辑链接来支持重复数据删除。此功能可节省大量磁盘空间。
Ext4 文件系统不支持重复数据删除。
4.文件系统级压缩
Btrfs 使用压缩算法来支持文件系统级别的数据压缩。这意味着数据将在写入文件系统时自动压缩。
Ext4 文件系统没有内置的压缩支持。
5.最大分区和文件大小
使用 ext4 可以创建的最大分区是 1 exbibyte——相当于大约 1,152,921.5 TB。最大文件大小为 16 TiB,比普通消费者目前可以购买的任何硬盘都要大得多。
Btrfs 支持的最大分区和文件大小高达 16Eib。
Ext4 允许您创建最多 232 个(= 4,294,967,296 ~= 40 亿)文件。Btrfs 允许您创建最多 264 个(= 18,446,744,073,709,551,616 ~= 18 quintillion)文件。
6.校验和/ECC支持
Btrfs 文件系统使用 CRC32C 校验和来确保数据完整性并避免数据损坏。Ext4 文件系统不保证数据的完整性。
7.快照支持
Btrfs 文件系统支持文件的只读和可写快照。快照是一个子卷,它使用 COW 功能与另一个子卷共享其数据和元数据。
Ext4 文件系统不支持创建文件系统的快照。
8.块子分配和尾打包
块子分配是一种功能,将大文件存储在块中,同时有效利用最后一个块末尾的尾部空间。块子分配是一种将另一个文件块的一部分存储到尾块并节省磁盘空间的方法。
Btrfs 旨在利用此可用空间,并可以将多个块的尾部与其他文件打包在一起。这提高了文件系统性能并提高了存储效率。
Ext4 不支持尾部打包。
9.碎片整理
Btrfs 文件系统的最大缺点是大文件容易碎片化,因此需要定期进行碎片整理。
Ext4与Btrfs特性比较:
我们将根据给定的特性比较文件系统:
Ext4与Btrfs对比表
功能Ext4Btrfs
类型的文件系统
日志记录
写入时拷贝(COW)
重复数据删除
不支持
支持
文件系统的压缩
不支持
支持
数据完整性
不保证
通过CRC32C校验和确保
快照
不支持
支持
存储效率
并不比Btrfs好
比Ext4更好
最大文件数
~ 40亿(2 ^ 32)
~18万亿 (2^64)
最大分区大小和文件大小
文件大小:16 tib ;分区大小:1 exbibyte
文件大小:16 eib ;分区大小:16 eib
Ext4与Btrfs相比的优点:Btrfs相对于Ext4的优点:七、结论
Ext4在于它的易用性以及广泛性。对于桌面或者工作站, ext4 仍然是一个很好的文件系统。由于它是默认提供的文件系统,用户可以在上面安装操作系统。同时, ext4 支持最大 1 exabytes 的卷和 16 terabytes 的文件,在多数情况下也够用了 。
Ext4 文件系统是扩展文件系统的最新版本。Ext4 已经存在了很长时间,并且被证明是可靠和稳定的。建议日常使用。万一停电,ext4 很有可能会确保您保存的数据安全。
另一方面,Btrfs 是一个现代文件系统linux文件系统ext4,可以处理多达 16 倍于 Ext4 的数据以及更好的容错。这种改进特别重要,因为 Linux 现在在企业实体中使用。Btrfs 有很多上面提到的很好的特性,例如 Copy-on-Write、快照、校验和和复制。Btrfs 正在快速增长,但仍被认为不稳定。它感觉更像是一个附加的文件系统。
有网友进行过一些测试(数据不一定准确,与不同的环境 不同的硬件均有关系)仅供参考:
格式化
Btrfs > XFS > Ext4
顺序读
读吞吐量:XFS、Btrfs差不多,相比Ext4稍有优势。
顺序写
写吞吐量:线程少的时候,总体差不多,Ext4略快一些。
4K随机读
4K随机读,XFS > Btrfs > Ext4。
有网友对各个文件系统的性能进行过详细测试,可参考这篇:
ext4、ntfs、xfs、btrfs、zfs、f2fs和reiserFS文件系统性能对比_林地宁宁
本文参考了以下文章:
1、极客教程
2、archlinux
3、TAOXC博客
到目前为止,ext4 似乎是桌面系统上更好的选择,因为它是默认文件系统,并且在传输文件时比 btrfs 更快。btrfs 文件系统值得研究,但要在桌面 Linux 上完全取代 ext4 可能需要些时间。
如果你需要一些新的特性,如快照,或需要 支持更大的文件,则可选择btrfs。
如对付木马与病毒侵犯,快照是一种比较不错的备份方案。如群晖Nas也支持btrfs。
如果需要多硬盘支持,如需要文件系统级别的 raid 阵列能力linux文件系统ext4,则选择zfs。
希望对您有一些帮助!以上纯是个人看法,如大牛有更好的建议,也可在评论区回复!