1、日志文件系统的由来
之前讲述的都是文件系统的基本功能,但是一直都集中在数据如何存放获取的过程上,那么文件系统对于数据的一致性又是如何保证的呢??
同样,我们从一个文件的新建开始说起,类似第三小节,一个文件的新建步骤如下:
- 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
- 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
- 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且升级 inode 的 block指向数据;
- 将刚刚写入的 inode 与 block 数据同步升级 inode bitmap 与 block bitmap,并升级
superblock 的内容。
一般来说,我们将 inode table 与 data block 称为数据存放区域,至于其他例如 superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中介数据) 啰,因为 superblock, inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为元数据的啦。
上面这种新建过程看似没有什么问题,但是如果在数据写入过程中文件系统发生了意外导致写入没有成功,此时会发生什么情况呢?
**一个简单的例子:**新建文件在写入文件系统时,因为不知名原因导致系统中断(例如突然的停电啊、 系统核心发生错误啊~等等的怪事发生时),所以写入的数据仅有 inode table 及 data block 而已, 最后一个同步升级中介数据的步骤并没有做完,此时就会发生 metadata 的内容与实际数据存放区产生不一致 (Inconsistent) 的情况了。
解决办法:早期的文件系统(ext2),如果发生这个问题, 那么系统在重新启动的时候,就会由 Superblock 当中记录的 valid bit (是否有挂载) 与 filesystem state (clean 与否) 等状态来判断是否强制进行数据一致性的检查!若有需要检查时则以 e2fsck 这支程序来进行的。
不过,这样的检查很费时~因为要针对 metadata 区域与实际数据存放区来进行比对, 得要搜寻整个文件系统。这就是为什么有时候电脑不正常关机,再次开机会显示正在检测硬盘的数据。
为了解决上述数据一致性的问题,文件系统引入了日志的概念,这一类文件系统被称为日志文件系统。
2、日志文件系统的操作
具体来说,日志文件系统是在文件系统中划分出一个小区块(例如128M),该区块专门在记录写入或修订文件时的步骤。
例如:
- 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
- 实际写入:开始写入文件的权限与数据;开始升级 metadata 的数据;
- 结束:完成数据与 metadata 的升级后,在日志记录区块当中完成该文件的纪录。
那么当文件系统在数据的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了。
常见的日志文件系统
——ext3、ext4、JFFS,YAFFS等
参考博客:
http://cn.linux.vbird.org/linux_basic/0230filesystem_1.php