操作系统中的文件系统具有即使电源突然改变也能持久保存的机制,从而可以解决崩溃一致性的问题。为了了解崩溃的情况,假设用户已经在磁盘上给出了“写”指令,并且在此过程中有人拔下了电源线。磁盘仅被部分更新。然后,用户重新引导系统,期望再次安装文件系统。
考虑一个用户希望将单个数据块(4KB)附加到现有文件的实例。下图表示附加之前的状态(白色块为空,绿色块表示包含数据)。 写入磁盘块时,对文件系统进行了3次更新:
- 索引节点已更新。
- 数据位图被更新。
- 分配了新的数据块。
下图显示了追加后的状态(红色块表示更新)。 但是,这些更新不会自动进行。因此,可能会出现以下情况:
- 仅将Inode更新写入磁盘:
在这种情况下,Inode将指向数据块,但是由于从未写入新数据,因此它将从该地址读取旧的垃圾内容。这导致文件系统不一致。 - 只有数据块被写入磁盘:
在这种情况下,磁盘上有数据,但是没有Inode可以引用它。这等同于根本没有写的情况。系统未处于不一致状态。 - 仅将更新的位图写入磁盘:
在这种情况下,位图表明已写入数据块,但没有指向它的Inode。这实质上浪费了数据块上的空间(因为该块将永远不会用于存储更多数据)。这会导致空间泄漏以及文件系统不一致。 - 仅将Inode和数据位图写入磁盘:
在这种情况下,没有数据写入磁盘。因此,即使文件元数据正确,在访问时仍会检索到旧的垃圾值。 - 仅将Inode和数据块写入磁盘:
在这种情况下,Inode和位图之间存在不一致。 - 仅将位图和数据块写入磁盘:
在这种情况下,Inode和数据位图之间仍然存在不一致。我们在某处有一些数据,但是我们不知道它属于哪个文件。
解决问题的方法:
对于文件系统不一致的问题,有两种标准的解决方案-文件系统检查器(FSCK)(一种传统方法)和一种更现代的方法(称为日志记录(或预写日志记录))。