本文将对Linux下常见的几种文件系统进行对比,包括ext2、ext3、ext4、XFS和Btrfs,希望能帮助大家更好的选择合适的文件系统。
内容来自于网上找的资料以及自己的一些经验,能力有限,错误在所难免,仅供参考
历史
文件系统 | 创建者 | 创建时间 | 最开始支持的平台 |
---|---|---|---|
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列出来作为参考。
大小限制
文件系统 | 最大文件名长度 | 最大文件大小 | 最大分区大小 |
---|---|---|---|
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的块大小。
代码规模
从代码规模可以看出文件系统的功能丰富程度以及复杂度,下面列出的数据来自于kernel-4.1-rc8,只是简单的用wc -l来统计,没有过滤空行、注释等。
文件系统 | 源文件(.c) | 头文件(.h) |
---|---|---|
ext2 | 8363 | 1016 |
ext3 | 16496 | 1567 |
ext4 | 44650 | 4522 |
XFS | 89605 | 15091 |
Btrfs | 105254 | 7933 |
ext2
ext的优点是比较简单,文件比较少时性能较好,比较适合文件少的场景,主要缺点如下
ext3
ext3在ext2的基础上实现了下面几个功能,其它的都保持不变,即ext2的缺点ext3也有
ext4
ext4借鉴了当前成熟的一些文件系统技术,在ext3上增加了一些功能,并且对性能做了一些改进,主要变化如下
这里是一个查看文件/etc/fstab创建时间的例子(文件存在/dev/sda1分区上):
Extents: 在最开始的ext2文件系统中,数据块都是一个一个单独管理的,inode中存有指向数据块的指针,文件占用了多少个数据块,inode里面就有多少个指针(多级),想象一下一个1G的文件,4K的块大小,那么需要(1024 * 1024)/4=262144个数据块,即需要262144个指针,创建文件的时候需要初始化这些指针,删除文件的时候需要回收这些指针,影响性能。现代的文件系统都支持Extents的功能,简单点说,Extent就是数据块的集合,以前一次分配一个数据块,现在可以一次分配一个Extent,里面包含很多数据块,同时inode里面只需要分配指向Extent的指针就可以了,从而大大减少了指针的数量和层级,提高了大文件操作的性能。
inode数量固定: 在ext2/3/4系列的文件系统中,inode的数量都是固定的,坏处是如果存很多小文件的话,有可能造成inode被用光,但磁盘还有很多剩余空间无法被使用的情况,不过它也有一个好处,就是一旦磁盘损坏,恢复起来要相对简单些,因为数据在磁盘上布局相对要固定简单。
xfs
和ext4相比,xfs不支持下面这些功能
但xfs有下面这些特性
btrfs
btrfs是一个和ZFS类似的文件系统,支持的功能非常多,据说将来会替换ext4成为Linux下的默认文件系统。这里列举一些重要的功能
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系列文件系统内部结构相对简单一些,出问题后恢复相对容易。
结束语
本篇没有比较它们的性能,在通常情况下,他们之间没有太大的性能差别,只有在特定的场景下,才能看出区别,如果对性能比较敏感,建议根据自己的使用场景来测试不同的文件系统,然后根据结果来选择。