深度解析Unix中inode块与超级块( 二 )


二、超级块,文件系统的心脏 。
如果说inode块是Unix操作系统中文件的核心,那么超级块就是文件系统的心脏 。启动Unix操作系统后,发现某个文件系统无法使用,很有可能就是超级块出现了问题 。为什么这个超级块有这么大的作用呢?主要是因为在超级块中保存了全局文件信息,如硬盘已用空间、数据块可用空间、inode结点信息等等 。做一个形象的比喻,这个超级块就好像是企业的资产负债表,一个文件系统中有哪些资源都记录在这个表中 。
当操作系统启动后,系统内核会把超级块中的内容复制到内存中,并周期性的利用内存里的最新内容去更新硬盘上的超级块中的内容 。由于这个更新存在一个时间差,为此内存中的超级块信息与硬盘中的超级块信息往往只有在开机与关机的某个特定时刻是同步的;而在其他时间都是不同步的 。假设当操作系统意外当机或者因为断电而造成的意外事故时,内存中的超级块信息没有及时保存到硬盘中,此时文件系统的完整性就会受到破坏 。轻者导致刚建立的丢失,重则的话会导致文件系统瘫痪 。遇到这种情况时,系统工程师往往需要利用系统提供的sync命令在系统出现故障的那一刻把内存里的内容复制到磁盘上 。这个过程往往操作系统会自动完成,这也正是因为为什么Unix操作系统要比Windows操作系统稳定的一个重要原因 。当操作系统重新启动的过程中,系统内核会对两者进行比较,根据他们之间的差异,给文件系统打上干净或者脏的标签 。这个信息也是存储在文件系统的超级块中 。
可见超级块如果发生损坏的话,对于文件系统的破坏性非常的大 。轻者的话导致某个文件系统无法挂载,重则的话导致整个操作系统崩溃 。在Unix操作系统中,除了可以利用sync命令来保证硬盘上的内容决不会比内存里的内容更新之外,还提供了一个很有利的措施来保证其的安全性 。其实,这个技术很早就有,只是一开始并没有用在超级块的管理中 。这个技术就是跟磁盘阵列类似 。操作系统会将多个超级块内容保存到硬盘中的不同区域 。当其中一个超级块出现问题时,操作系统会自动采用另外一个超级块 。等到系统运行正常后,系统内容就会把可用的超级块去替换那个故障的超级块 。为此除非所有的超级块都损坏了,否则的话,只要有一个超级块是可用的,那么文件系统与操作系统就可以正常挂载与启动 。这种安全机制在很大程度上提高了超级块的安全性,系统了Unix操作系统的稳定性 。现在大部分的Unix操作系统(包括Linux操作系统)已经实现了类似的安全机制 。
另外系统工程师需要了解在超级块中到底保存了哪些信息 。这对于以后遇到问题时查找问题原因有一定的故障 。根据笔者的了解,在超级块中保存了如下有用的信息 。一是保存了文件系统的大小以及所用酷块的大小;二是保存了可用数据库的数量和部分可以及时分配的空闲数据块列表;三是最近一次的更新时间与文件系统的状态;四是空闲Inode结点的个数和部分可以及时使用的inode结点列表 。有时候在Unix操作系统上进行应用程序开发也需要用到这些信息 。
最后笔者需要强调一点,超级块损坏的最大杀手仍然是意外断电或者其他原因的意外当机 。因为此时内存中的超级块信息无法及时更新到硬盘中 。为此就出现了内存与超级块中内容不一致的地方,从而会导致系统启动时的一系列故障 。为此在Unix服务器上部署一个UPS是非常重要的 。这虽然是一个老生常谈的方法,但是却非常有效 。

推荐阅读