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