本文将对Linux下几种常见文件系统进行比较,包括ext2、ext3、ext4、XFS和Btrfs,希望能帮助大家更好地选择合适的文件系统。内容来源于网上查到的资料和自己的一些经验。能力有限,失误在所难免。仅供参考。历史文件系统的创造者创建的平台最初支持ext2RémyCard1993Linux、HurdXFSSGI1994IRIX、Linux、FreeBSDext3Dr。StephenC.Tweedie1999LinuxZFSSun2004Solarisext4许多开发商2006LinuxBtrfsOracle2007Linux从他们所处的不同时代的创建时间可以看出,因为Btrfs的实现是借鉴了ZFS,所以ZFS也列在这里作为参考。大小限制文件系统最大文件名长度最大文件大小最大分区大小ext2255bytes2TB16TBext3255bytes2TB16TBext4255bytes16TB1EBXFS255bytes8EB8EBBtrfs255bytes16EB16EB最大文件和分区大小由格式化分区时使用的块大小决定块越大,最大支持的文件和分区越大,越容易浪费磁盘空间。上表中列出的数据是基于4K的块大小。代码大小从代码大小可以看出文件系统的功能丰富性和复杂性。下面列出的数据来自kernel-4.1-rc8,通过wc-l简单统计,没有过滤空行、注释等。文件系统源文件(.c)头文件(.h)ext283631016ext3164961567ext4446504522XFS8960515091Btrfs1052547933Btrfs还在快速发展的过程中,代码行数可能还是有比较大的变化XFS和Btrfs都使用B-treeext2ext的优点是它比较简单,文件比较小的时候性能更好,比较适合文件少的场景。主要缺点如下。inode的数量是固定的。格式化分区时,可以指定索引节点和数据块的比例。它不能再改变了。当块大小为4K时,单个文件的大小不能超过2TB,分区的大小不能超过16TB。由于目录下存放的文件和子目录是线性组织的,因此遍历目录的效率不高,尤其是当目录下的文件数达到10K以上时,速度会明显变慢。当底层磁盘的分区空间变大时(在使用LVM时很常见),ext2无法动态扩展以使用增加的空间。没有日记(Journal)功能,所以数据安全性不高与ext2相比,数据安全性大大提高。当底层分区空间变大时,ext3可以自动扩展使用增加的空间使用HTree组织目录下的文件和子目录,使目录下的文件和子目录数量不再受性能限制(会有如果数量超过10K,则不会出现性能问题)。增加了一些功能,并对性能做了一些改进,主要变化如下当块大小为4K时,最大支持的文件和分区大小分别达到16TB和1EB,不再受限于32000个子目录,支持无限个数子目录数量支持Extents,提高了大文件的运行性能。内部实现支持一次分配多个数据块,这点优于ext3。支持延迟分配(即支持fallocate功能)(fallocate是libc的一个功能,在不支持该功能的文件系统上,libc会创建一个占用磁盘空间的文件)支持在线快速扫描支持在线碎片整理(单个文件或整个分区)日志(Journal)支持校验和(checksum),数据安全进一步改进了对NoJournalin的支持g)mode(ext3不支持该功能),与ext2相同,消除了写日志对性能的影响。支持纳秒级时间戳记录文件的创建时间。由于相关的应用层工具还不支持,所以只能通过debug查看文件的创建时间。这里以查看文件/etc/fstab的创建时间为例(该文件存在于/dev/sda1分区):dev@ubuntu:~$ls-i/etc/fstab10747906/etc/fstabdev@ubuntu:~$sudodebugfs-R'stat<10747906>'/dev/sda1Inode:10747906类型:常规模式:0644标志:0x80000Links:1Blockcount:8ctime:0x5546dc54:6e6bc80c-2015年5月2日星期日1:24atime:0x55d1b01744-8b-2015年8月17日星期一05:57:40mtime:0x5546dc54:6e6bc80c-2015年5月3日星期日22:41:24crtime:0x5546dc54:6e5bc8013-5月24日星期日:2个额外的inode字段:28EXTENTS:(0):46712815Extents:In原来的ext2文件系统,数据块是单独管理的,inode存放的是数据块的指针,文件占用了多少个数据块,inode中有多少个指针(多级),想象一个1G的文件,4K的块大小,那么你需要(1024*1024)/4=262144个数据块,也就是你需要262144个指针,你需要创建一个文件初始化这些指针。删除文件时需要回收这些指针,影响性能。现代文件系统支持Extents的功能。简单的说,Extents就是数据块的集合。以前是一次分配一个datablock,现在一次可以分配一个Extent。它包含很多数据块,inode只需要分配指向Extents的指针,大大减少了指针的数量和层级,提高了大文件操作的性能。inode数量固定:在ext2/3/4系列文件系统中,inode数量是固定的。缺点是如果存储很多小文件,inode可能会被用完,但磁盘上还有很多剩余空间无法使用。不过它也有一个好处,就是一旦磁盘损坏,恢复起来也比较简单,因为数据在磁盘上的布局比较固定,简单。与ext4相比,xfs不支持以下功能。它不支持日志校验和。它不支持NoJournaling模式。它不支持文件创建时间。它不支持数据日志(元数据)。journal),但是xfs有以下特点,支持最大8EBinode的文件和分区动态分配,所以不受inode个数的限制,不用担心存储大文件导致inode不足的问题小文件的数量。更大的xattr(扩展属性)空间,ext2/3/4和btrfs都限制xattr的长度不超过一个block(一般为4K),而xfs可以达到64K。内部使用分配组机制,组与组之间没有依赖关系。支持并发操作,多核环境下部分场景表现良好提供原生dump和restore工具,支持在线dumpbtrfsbtrfs是一个类似ZFS的文件系统,支持很多功能。据说以后会取代ext4成为Linux下的默认文件系统。这里有一些重要的功能。支持的最大文件和分区达到16EB。COW(写时复制)针对小文件和SSD进行了优化。inode动态分配支持子分区(Subvolumes),子分区可以单独挂载支持元数据和数据校验(crc32)支持压缩,去重支持多盘多分区,可动态扩展支持LVM、RAID功能(带不再需要btrfs、lvm和软raid)增量备份和恢复支持快照将ext2/3/4转换为btrfs(而不是相反)。btrfs最大的缺点是其COW实现方式导致碎片问题严重,不适合频繁写入的场景,比如数据库,虚拟机的磁盘文件等。不过大多数场合不用担心,btrfs有在线碎片整理工具。下表如何选择,仅供参考。文件系统的适用场景是因为ext2的U盘一般不会存放很多文件,U盘里的文件都是在电脑上备份的,对安全性要求没有那么高。因为ext2不写日志,所以写U盘的性能更好。当然,由于ext2的兼容性不如fat,所以对于稳定性要求高的地方,目前U盘格式大多采用fatext3。ext4之后,好像没有理由再用ext3了。需要一段时间才能稳定下来。Ext4的小文件较少。ext系列文件系统不支持inode动态分配,所以如果要存储大量的小文件,如果小文件很多或者需要很大的xttr空间,不建议使用ext4xfs。比如openstackswift将数据文件的元数据放在xttr中。xfs支持动态分配inode,所以不会出现inode不足的情况,xttr的最大长度可以达到64K。btrfs没有频繁的写操作,需要btrfs的一些特性。虽然btrfs还不稳定,但是它支持很多功能。如果你需要这些功能,又不经常写文件,那就选择btrfs。另外,ext系列文件系统内部结构比较简单,出现问题后也比较容易恢复。结论本文不比较它们的性能。一般情况下,它们之间的性能差别不大。只有在特定场景下才能看出差异。如果对性能比较敏感,建议根据自己的使用场景测试不同的文件系统,再根据结果进行选择。
