本文将对Linux下常见的几种文件系统进行对比,包括ext二、ext三、ext四、XFS和Btrfs,但愿能帮助你们更好的选择合适的文件系统。node
内容来自于网上找的资料以及本身的一些经验,能力有限,错误在所不免,仅供参考数据库
文件系统 | 建立者 | 建立时间 | 最开始支持的平台 |
---|---|---|---|
ext2 | Rémy Card | 1993 | Linux,Hurd |
XFS | SGI | 1994 | IRIX, Linux, FreeBSD |
ext3 | Dr. Stephen C. Tweedie | 1999 | Linux |
ZFS | Sun | 2004 | Solaris |
ext4 | 众多开发者 | 2006 | Linux |
Btrfs | Oracle | 2007 | Linux |
从建立时间能够看出他们所处的不一样时代,由于Btrfs的实现借鉴自ZFS,因此这里也将ZFS列出来做为参考。ubuntu
文件系统 | 最大文件名长度 | 最大文件大小 | 最大分区大小 |
---|---|---|---|
ext2 | 255 bytes | 2 TB | 16 TB |
ext3 | 255 bytes | 2 TB | 16 TB |
ext4 | 255 bytes | 16 TB | 1 EB |
XFS | 255 bytes | 8 EB | 8 EB |
Btrfs | 255 bytes | 16 EB | 16 EB |
最大文件和分区大小受格式化分区时所采用的块大小(block size)所影响,块越大,所支持的最大文件和分区越大,也越可能浪费磁盘空间,上表列出的数据基于4K的块大小。swift
从代码规模能够看出文件系统的功能丰富程度以及复杂度,下面列出的数据来自于kernel-4.1-rc8,只是简单的用wc -l来统计,没有过滤空行、注释等。安全
文件系统 | 源文件(.c) | 头文件(.h) |
---|---|---|
ext2 | 8363 | 1016 |
ext3 | 16496 | 1567 |
ext4 | 44650 | 4522 |
XFS | 89605 | 15091 |
Btrfs | 105254 | 7933 |
Btrfs还在快速的开发过程当中,代码行数可能还有比较大的变化bash
XFS和Btrfs都使用了B-tree并发
ext的优势是比较简单,文件比较少时性能较好,比较适合文件少的场景,主要缺点以下函数
inode的数量是固定不变的,在格式化分区的时候能够指定inode和数据块所占空间的比例,但一旦格式化好,后续就无法再改变了工具
当块大小为4K时,单个文件大小不能超过2TB,分区大小不能超过16TB(目前硬盘大小通常都只有几TB,因此也不是什么大问题,)布局
一个目录下最多只能有32000个子目录
因为目录里面存储的文件和子目录都是以线性方式来组织的,因此遍历目录效率不高,尤为当目录下文件个数达到10K以上规模的时候,速度会明显的变慢
当底层的磁盘分区空间变大时(使用LVM时很常见),ext2无法动态的扩展来使用增长的空间
没有日志(Journal)功能,因此数据的安全性不高
ext3在ext2的基础上实现了下面几个功能,其它的都保持不变,即ext2的缺点ext3也有
支持日志(Journal)功能,数据的安全性较ext2有很大的提升
当底层的分区空间变大时,ext3能够自动扩展来使用增长的空间
使用HTree来组织目录里面的文件和子目录,使目录下的文件和子目录数再也不受性能限制(数量超过10K也不会有性能问题)
ext4借鉴了当前成熟的一些文件系统技术,在ext3上增长了一些功能,而且对性能作了一些改进,主要变化以下
当块大小为4K时,支持的最大文件和最大分区大小分别达到了16TB和1EB
再也不受32000个子目录数的限制,支持不限数量的子目录个数
支持Extents,提升了大文件的操做性能
内部实现上支持一次分配多个数据块,较ext3的性能有所提升
支持延时分配(即支持fallocate函数)(fallocate是libc的函数,在不支持该功能的文件系统上,libc会建立一个占用磁盘空间文件)
支持在线快速扫描
支持在线碎片整理(单个文件或者整个分区)
日志(Journal)支持校验码(checksum),数据的安全性进一步提升
支持无日志(No Journaling)模式(ext3不支持该功能),这样就和ext2同样,消除了写日志对性能的影响
支持纳秒级的时间戳
记录了文件的建立时间,因为相关的应用层工具还不支持,因此只能经过debug的方式看到文件的建立时间
这里是一个查看文件/etc/fstab建立时间的例子(文件存在/dev/sda1分区上):
dev@ubuntu:~$ ls -i /etc/fstab 10747906 /etc/fstab dev@ubuntu:~$ sudo debugfs -R 'stat <10747906>' /dev/sda1 Inode: 10747906 Type: regular Mode: 0644 Flags: 0x80000 Links: 1 Blockcount: 8 ctime: 0x5546dc54:6e6bc80c -- Sun May 3 22:41:24 2015 atime: 0x55d1b014:8bcf7b44 -- Mon Aug 17 05:57:40 2015 mtime: 0x5546dc54:6e6bc80c -- Sun May 3 22:41:24 2015 crtime: 0x5546dc54:6e6bc80c -- Sun May 3 22:41:24 2015 Size of extra inode fields: 28 EXTENTS: (0):46712815
Extents: 在最开始的ext2文件系统中,数据块都是一个一个单独管理的,inode中存有指向数据块的指针,文件占用了多少个数据块,inode里面就有多少个指针(多级),想象一下一个1G的文件,4K的块大小,那么须要(1024 * 1024)/4=262144个数据块,即须要262144个指针,建立文件的时候须要初始化这些指针,删除文件的时候须要回收这些指针,影响性能。现代的文件系统都支持Extents的功能,简单点说,Extent就是数据块的集合,之前一次分配一个数据块,如今能够一次分配一个Extent,里面包含不少数据块,同时inode里面只须要分配指向Extent的指针就能够了,从而大大减小了指针的数量和层级,提升了大文件操做的性能。
inode数量固定: 在ext2/3/4系列的文件系统中,inode的数量都是固定的,坏处是若是存不少小文件的话,有可能形成inode被用光,但磁盘还有不少剩余空间没法被使用的状况,不过它也有一个好处,就是一旦磁盘损坏,恢复起来要相对简单些,由于数据在磁盘上布局相对要固定简单。
和ext4相比,xfs不支持下面这些功能
不支持日志(Journal)校验码
不支持无日志(No Journaling)模式
不支持文件建立时间
不支持数据日志(data journal),只有元数据日志(metadata journal)
但xfs有下面这些特性
支持的最大文件和分区都达到了8EB
inode动态分配,从而不受inode数量的限制,不再用担忧存储大量小文件致使inode不够用的问题了。
更大的xattr(extended attributes)空间,ext2/3/4及btrfs都限制xattr的长度不能超过一个块(通常是4K),而xfs能够达到64K
内部采用Allocation groups机制,各个group之间没有依赖,支持并发操做,在多核环境的某些场景下性能表现不错
提供了原生的dump和restore工具,而且支持在线dump
btrfs是一个和ZFS相似的文件系统,支持的功能很是多,听说未来会替换ext4成为Linux下的默认文件系统。这里列举一些重要的功能
支持的最大文件和分区达到了16EB
支持COW(copy on write)
针对小文件和SSD作了优化
inode动态分配
支持子分区(Subvolumes),子分区能够单独挂载
支持元数据和数据的校验(crc32)
支持压缩,去重
支持多个磁盘和分区,可动态扩展
支持LVM,RAID的功能(有了btrfs,就再也不须要lvm和软raid了)
增量备份和恢复
支持快照
将ext2/3/4转换成btrfs(反过来不行)
btrfs最大的缺点就是因为其COW的实现方式,致使碎片化问题比较严重,不太适合频繁写的场景,好比数据库、虚拟机的磁盘文件等。不过大部分场合不须要担忧,btrfs有在线的碎片整理工具。
下表仅供参考
文件系统 | 适用场景 | 缘由 |
---|---|---|
ext2 | U盘 | U盘通常不会存不少文件,且U盘的文件在电脑上有备份,安全性要求没那么高,因为ext2不写日志(journal),因此写U盘性能比较好。固然因为ext2的兼容性没有fat好,目前大多数U盘格式仍是用fat |
ext3 | 对稳定性要求高的地方 | 有了ext4后,好像没什么缘由还要用ext3,ext4如今的问题是出来时间不长,还须要一段时间变稳定 |
ext4 | 小文件较少 | ext系列的文件系统都不支持inode动态分配,因此若是有大量小文件须要存储的话,不建议用ext4 |
xfs | 小文件多或者须要大的xttr空间,如openstack swift将数据文件的元数据放在了xttr里面 | xfs支持inode动态分配,因此不存在inode不够的状况,而且xttr的最大长度能够达到64K |
btrfs | 没有频繁的写操做,且须要btrfs的一些特性 | btrfs虽然还不稳定,但支持众多的功能,若是你须要这些功能,且不会频繁的写文件,那么选择btrfs |
另外,ext系列文件系统内部结构相对简单一些,出问题后恢复相对容易。
本篇没有比较它们的性能,在一般状况下,他们之间没有太大的性能差异,只有在特定的场景下,才能看出区别,若是对性能比较敏感,建议根据本身的使用场景来测试不一样的文件系统,而后根据结果来选择。