上一小节谈到的仅是读取而已,那么如果是新建一个文件或目录时,我们的 Ext2 是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个文件,此时文件系统的行为是:
1.先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
2.根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
3.根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且升级 inode 的 block 指向数据;
4.将刚刚写入的 inode 与 block 数据同步升级 inode bitmap 与 block bitmap,并升级 superblock 的内容。
一般来说,我们将 inode table 与 data block 称为数据存放区域,至于其他例如 superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中介数据) ,因为 superblock, inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为中介数据。
数据的不一致 (Inconsistent) 状态
一般正常的情况下,上述的新增动作当然可以顺利的完成。
但文件在写入文件系统时,因为不知名原因导致系统中断,metadata 的内容与实际数据存放区产生不一致时,系统在重新启动就会藉由 Superblock记录的 valid bit (是否有挂载) 与 filesystem state (clean 与否) 等状态来判断是否强制进行数据一致性的检查。不过,这样的搜索整个filesystem检查是很费时;则产生日志式文件系统的兴起。
日志式文件系统 (Journaling filesystem)
为了避免数据的不一致状态; filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤, 那可以简化一致性检查的步骤,也就是:
1.预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
2.实际写入:开始写入文件的权限与数据;开始升级 metadata 的数据;
3.结束:完成数据与 metadata 的升级后,在日志记录区块当中完成该文件的纪录。
在这样的程序当中,万一数据的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了!