ext3和ext4文件系统有什么区别?

ext3和ext4文件系统有什么区别?

很长一段时间以来,ext3是很多linux发行版默认的文件系统,现在ext4已经发布,并且已经有发行版开始使用ext4作为默认的文件系统了(其实最初的时候ext4是作为ext3的扩展,但是为了保证ext3的稳定性等原因,很多人反对直接对ext3进行扩展 , 所以单独作为了ext4项目) 。
ext3还是使用15个inode来查找数据块,前12个为直接数据块,直接指向存储数据的数据块,接下来分别为一级间接块,二级间接块 , 三级间接块
其中point本来也是数据块,现在拿来做数据块的索引用,其中ext3的头文件定义为:__u32 i_block[EXT3_N_BLOCKS];/* Pointers to blocks */,所以可以计算ext3文件系统的极限:
最大分区:
因为定义的是无符号32位数,所以可能定位的block范围为2^32,也就是4G,如果一个block大小为4KB,所以为4G * 4KB = 16TB
最大文件:
前面直接指向12个数据块,一级间接块最大为block size / 4,block size就是数据块的大小 , 因为一个索引是4个字节,所以除以4,这样计算下来,最大的文件可以使用的总块数为:12(block size/4)(block size/4)^2(block size/4)^3,如果block size大小为4K,则为(122^102^202^30) * 2^12 约等于4T 。
为了突破ext3这个大小限制,ext4使用了48位的数据块索引空间,同时使用了如下结构代替inode索引的方式:

struct ext3_extent {
__u32 ee_block; /* first logical block extent covers */
__u16 ee_len; /* number of blocks covered by extent */
__u16 ee_start_hi; /* high 16 bits of physical block */
__u32 ee_start; /* low 32 bigs of physical block */
};
这样查找数据块的时候就不是每个块建立一个索引,而且使用连续的数据块,也就是分别指示起始位置,以及连续的块数 , 这样在大文件的时候,磁盘io效率以及查找数据块效率上都有很大的提高,所以ext4的文件系统也比ext3出色 。因为使用了48位的索引空间,所以在4KB块大小的情况下,文件系统的极限是2^48 * 4KB = 1EB,不过,目前由于工具的限制 , 只能使用16TB的分区 。
ext3和ext4文件系统的区别如下:
1. 与 Ext3 兼容 。执行若干条命令 , 就能从 Ext3 在线迁移到 Ext4 , 而无须重新格式化磁盘或重新安装系统 。原有 Ext3数据结构照样保留 , Ext4 作用于新数据,当然 , 整个文件系统因此也就获得了 Ext4 所支持的更大容量 。

tune2fs -O extents,uninit_bg,dir_index /dev/sda5
e2fsck /dev/sda5
2. 更大的文件系统和更大的文件 。较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系统,以及 16TB 的文件 。
3. 无限数量的子目录 。Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录 。
4. Extents 。Ext3 采用间接块映射,当操作大文件时,效率极其低下 。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表 。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块 , 上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率 。
5. 多块分配 。当 写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块 。

6. 延迟分配 。Ext3 的数据块分配策略是尽快分配 , 而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能 。
7. 快速 fsck 。以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,而现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了 。
8. 日志校验 。日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏 。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能 。
9. “无日志”(No Journaling)模式 。日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能 。
mkfs.ext4 -O ^has_journal /dev/sda5
10. 在线碎片整理 。尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生 。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理 。
11. inode 相关特性 。Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字
节 , Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本) , 默认 inode 大小为 256 字节 。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation) 。
12. 持久预分配(Persistent preallocation) 。P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败 。Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()) , 比应用软件自己实现更有效率 。
13. 默认启用 barrier 。磁 盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性 。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据 。(可通过 "mount -o barrier=0" 命令禁用该特性 。
【ext3和ext4文件系统有什么区别?】

经验总结扩展阅读