ext2 ext3 ext4 文件系统的区别:
ext2为非日志文件系统,即在文件系统的运行期间不会记录写操作的日志,这就有一个很大的弊端,即文件系统只能单纯依靠Inode和Data Block的Bitmap来确定数据写入的状态。
我们先来了解一下写入数据的一些具体的步骤:
数据不一致:
通常我们将Inode和Data Block中的数据称为数据部分,将Super Block/Inode Bitmap/Data Block Bitmap称为元数据(Metadata)。从上面数据写入的过程可以很容易看到问题,如果在意外情况下(例如掉电,Kernel Crash,读写异常等等),数据写入成功,但是元数据没有完成写入,这时就会出现元数据与实际数据不一致的情况。当出现这种不一致的情况时,可以通过文件系统自检来针对数据一致性进行检查(fsck),一致性检查要遍历整个文件系统,根据元数据中的标志位来与实际数据存放进行对比,如果文件数量和大小很多,那么整个过程的耗时就会非常长。
为了克服上述的问题,在ext3中引入了日志功能,ext3文件系统由ext2发展而来(二者的Magic Number都是一样的,可见其兼容性),ext3文件系统本身的数据结构(例如Super Block,Inode,Group Descriptor,Dir Entry等)基本与ext2一致,可以完全兼容ext2文件系统,使得用户可以平滑地过度到一个带有日志功能的文件系统中。
引入日志功能后,文件系统会划分出部分Block用于日志的写入,当进行文件写入时,系统首先会把待写的Block数据写入日志中,当数据成功提交到日志中后,会进一步向文件系统的Data Block中提交,数据成功提交到文件系统后,日志中的临时数据就会被丢弃。
当出现系统故障,通过fsck进行一致性检查和恢复的时候,会存在以下两种情况:
从上面的两种情况可以看到,引入日志系统后,能够保证数据一致性,但是并不能保证数据不丢失。
ext3支持三种日志模式,区别是写入日志的Block是元数据的Block还是Data Block,以及何日提交日志:
上面三种日志模式,可以在手动mount的时候通过-o参数指定,也可以在/etc/fstab中指定,例如:
[root@DanCentOS65 daniel]# mount -o data=writeback /dev/sde1 /mnt/sde [root@DanCentOS65 daniel]# mount -v /dev/sda1 on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) /dev/sdb1 on /mnt/resource type ext4 (rw) /dev/sdd1 on /mnt/sdd type ext4 (rw) /dev/sdc1 on /mnt/sdc type ext2 (rw) /dev/sde1 on /mnt/sde type ext3 (rw,data=writeback) |
# /etc/fstab # Created by anaconda on Tue Mar 29 17:12:12 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=8fc4d768-29cd-462c-a7ab-5bf4bcfa9fa2 / ext4 defaults 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/sde1 /mnt/sde ext3 data=writeback 0 0 |
ext3日志可以存储到一个文件中,也可以存放在单独的设备中,可以在建立文件系统的时候,指定将日志记录到其他设备上,例如:
[root@DanCentOS65 daniel]# mkfs.ext3 -J device=/dev/sdf1 /dev/sdc1 |
文件系统本身并不处理日志,而是通过日志块设备(Journaling Block Device,JBD)的通用内核层进行处理。
ext3文件系统与JBD的交互过程主要基于三个单元:
运行(Running):表示事务可以接收和处理更多的原子操作
锁定(Locked):不接收新的原子操作,所有已接受的原子操作尚未完成
同步(Flush):事务已完成,正在向提交日志
提交(Commit):日志提交完成,正在向文件系统提交数据
完成(Finished):数据已经全部提交到文件系统中,可以删除此事务
ext3日志文件系统的几个特点:
[root@DanCentOS65 daniel]# mount -v /dev/sdc1 on /mnt/sdc type ext2 (rw) [root@DanCentOS65 daniel]# umount /dev/sdc1 [root@DanCentOS65 daniel]# tune2fs -j /dev/sdc1 tune2fs 1.41.12 (17-May-2010) Creating journal inode: done This filesystem will be automatically checked every 31 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@DanCentOS65 daniel]# mount /dev/sdc1 /mnt/sdc [root@DanCentOS65 daniel]# mount -v /dev/sdc1 on /mnt/sdc type ext3 (rw) |
也可以在不修改ext3文件系统的前提下,直接将其重新挂载为ext2文件系统。
ext4文件系统:
ext4文件系统是ext3的改进版,从前面的描述中我们可以看到,ext3仅仅是在ext2文件系统上增加了一个日志功能而已,而ext4则针对ext2/ext3的重要数据结构进行了调整优化,使其可以提供更好的性能和稳定性,以及更为丰富的功能。
与ext2转换为ext3一样,无需重新格式化,就可以将ext3文件系统更新为ext4,原有ext3的数据结构依然保留,ext4作用与新的数据。例如:
[root@DanCentOS65 daniel]# umount /dev/sdc1 [root@DanCentOS65 daniel]# tune2fs -O extents,uninit_bg,dir_index /dev/sdc1 tune2fs 1.41.12 (17-May-2010) Please run e2fsck on the filesystem. [root@DanCentOS65 daniel]# fsck /dev/sdc1 ...... Group descriptor 8181 checksum is invalid. FIXED. Group descriptor 8182 checksum is invalid. FIXED. Group descriptor 8183 checksum is invalid. FIXED. /dev/sdc1 contains a file system with errors, check forced. Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/sdc1: 23/1047552 files (0.0% non-contiguous), 134133/268173037 blocks [root@DanCentOS65 daniel]# mount /dev/sdc1 /mnt/sdc [root@DanCentOS65 daniel]# mount -v /dev/sdc1 on /mnt/sdc type ext4 (rw) |
与ext3相比,ext4有如下新的特性: