当新建一个文件或目录时,Ext2是如何处理的?这个时候就要blockbitmap及inode bitmap的帮忙。假设我们想要新增一个文件,此时文件系统的行为是:
1、先确定用户对于欲添加的文件是否有w与x权限,如果有才能添加
2、根据inode bitmap找到没有使用的inode号码,将新文件的权限/属性写入
3、根据block bitmap找到没有使用的block号码,将实际的数据写入block中,并更新inode的block指向数据。
4、将刚才写入的block与inode同步更新到inode bitmap与block bitmap中,并更新superblock的内容
一般来说,我们将inode table与data block称为数据存放区域,至于其他例如super block、block bitmap、inode bitmap等区段称为metadata(中间数据),因为super block、inode bitmap与block bitmap的数据是经常变动的,每次添加,编辑,删除都可能影响到这三部分的数据,因此才将其称为中间数据。
数据的不一致状态
在一般正常情况下,上述操作自然可以顺利完成,如果出现意外怎么办?比如文件在写入文件系统时,因为不明原因导致系统中断(比如突然通电,内核发生错误等),所以写入的数据仅有inode bitmap与block bitmap而已,最后一个同步更新中间数据的步骤没有做完,此时就会发生meta data 的内容与实际数据存放区产生不一致的情况。
既然不一致,那么就得克服。在早期的ext2文件系统中,如果发生这个问题,那么系统在重新启动的时候,就会通过Super block当中记录的valid bit(是否有挂载)与文件系统的state等状态来判断是否强制进行数据一致性的检查。但是这样检查很费时,特别当文件系统特别大时。所以后面一般使用日志文件系统。
日志文件系统
为了避免上述提到的文件系统不一致的情况发生,一个办法是:如果在文件系统中规划出一个块,该块专门记录写入或修订文件时的步骤,那不就可以简化一致性检查的操作了。局部如下:
1、预备:当系统要写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息。
2、实际写入:开始写入文件的权限与数据,开始更新meta data的数据
3、结束:完成数据与meta data的更新后,在日志记录块当中完成该文件的记录
在这样的程序当中,万一数据的记录过程中发生了问题,那么系统只要检查日志记录块就可以知道哪个文件发生了问题,针对该问题做一致性检查即可,而不必针对整块文件系统去检查,这样就可以达到快速修复文件系统的能力。这就是日志式文件最基础的功能。