很多文件系统在读取磁盘块进行修改后,会再写回磁盘。如果在修改过的磁盘块全部写回之前系统崩溃,则文件系统有可能处于不一致状态。如果一些未被写回的块是目录块或者包含空闲表的磁盘块时,这个问题尤为严重。
为了解决文件系统的不一致问题,一些系统会带有一个实用程序以检验文件系统的一致性。系统启动时,特别是崩溃之后重新启动时,可以运行该程序。下面介绍几种常见的一致性检查方法。
1.重复文件的一致性检查
我们以UNIX类型的文件系统为例来说明如何保证重复文件的一致性问题。对于通常的UNIX文件目录,其每个目录项中含有一个ASCII码的文件名和一个索引节点号,后者指向一个索引节点。当有重复文件时,一个目录项可由一个文件名和若干个索引节点号组成,每个索引节点号都是指向各自的索引节点。表7-1表示UNIX类型的目录和具有重复文件的目录。
表7-1 UNIX类型的目录
在有重复文件时,如果一个文件拷贝被修改,则必须同时修改其他几个文件拷贝,以保证各相应文件中数据的一致性。这可采用两种方法来实现:第一种方法是当一个文件被修改后,可查找文件目录,以得到其他几个拷贝的索引节点号,再从这些索引节点中找到各拷贝的物理位置,然后对这些拷贝做同样的修改;第二种方法是为新修改的文件建立几个拷贝,并用新拷贝去取代原来的文件拷贝。
2.磁盘块的一致性检查
盘块是用于存储文件的物理空间,这样用来描述盘块使用情况的数据结构就经常被访问。如果正在修改这些数据结构时系统突然发生故障,此时会使盘块数据结构中数据不一致。因此,在每次启动机器时应检查这几个数据结构是否保持了数据的一致性。
为了保证盘块数据结构一致性,可利用软件方法构成一个计数器表,每个盘块对应一个表项,每个表项中包含两个计数器,分别用作空闲盘块号计数器和数据盘块号计数器。计数器表中的表项数目等于盘块数。
在对盘块数据结构进行检查时,应该先将计数器表中的所有表项初始化为0;然后用n(假定磁盘有n个盘块)个空闲盘块号计数器组成的第一组计数器对空闲盘块的块号进行计数,再用n个数据盘块号计数器所组成的第二组计数器对已分配给文件使用的盘块号进行计数。如果情况是正常的,则上述两组计数器中对应的一对计数器中的数据应互补,也就是某个盘块在第一组计数器中的计数值为1,则在第二组计数器中计数值必为0,反之亦然。但如果情况并非如此时,说明发生了某种错误。(www.xing528.com)
表7-2(a)的情况属于正常情况。表7-2(b)中不是正常情况,对盘块号7的计数在两组计数器中都为0,盘块丢失。当检查到这种情况时,应向系统报告,该错误的影响不大,只是盘块7未被利用,其解决的方法也较简单,只需将盘块7归入空闲块中即可。表7-2(c)表示空闲盘块号重复出现的错误,即盘块号1在空闲盘块中出现了两次,其解决方法是从空闲盘块表中删除一个空闲盘块号1。表7-2(d)所示的情况是相同的数据盘块号出现了两次(或多次),这种错误影响较严重,必须立即报告。
图7-2 盘块一致性检查情况
3.链接数的一致性检查
在UNIX类型的文件目录中,其每个目录项内都含有一个索引节点号,用于指向该文件的索引节点。一方面,对于一个共享文件,其索引节点号会在目录中出现多次。例如,当有5个用户(进程)共享某文件时,其索引节点号会在目录中出现5次;另一方面,在该共享文件的索引节点中有一个链接计数count,用来指出共享本文件的用户(进程)数。在正常情况下,这两个数据应该一致,否则就会出现数据不一致性差错。
为了检查这种数据不一致性差错,同样要配置一张计数器表,此时应是为每个文件而不是为每个盘块建立一个表项,其中含有该索引节点号的计数值。在进行检查时,从根目录开始查找,每当在目录中遇到该索引节点号时,便在该计数器表中相应文件的表项上加1。当把所有目录都检查完后,便可将该计数器表中每个表项中的索引节点号计数值与该文件索引节点中的链接计数count值加以比较,如果两者一致,表示是正确的;否则,便是产生了链接数据不一致的错误。
如果索引节点中的链接计数count值大于计数器表中相应索引节点号的计数值,则即使在所有共享此文件的用户都不再使用此文件时,其count值仍不为0,因而该文件不会被删除。这种错误的后果是使一些已无用户需要的文件仍驻留在磁盘上,浪费了存储空间。当然这种错误的性质并不严重。解决的方法是用计数器表中的正确计数值为count重新赋值。
反之,如果出现count值小于计数器表中索引节点号计数值的情况时,就有潜在的危险。假如有两个用户共享一个文件,但是count值仍为1,这样,只要其中有一个用户不再需要此文件时,count值就会减为0,从而使系统将此文件删除,并释放其索引节点及文件所占用的盘块,导致另一共享此文件的用户所对应的目录项指向了一个空索引节点,最终是使该用户再无法访问此文件。如果该索引节点很快又被分配给其他文件,则又会带来潜在的危险。解决的方法是将count值置为正确值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。