主旨

事务的原子性是指一个事务要么被执行,要么不被执行,不能执行一半。

在文件系统中,由于存在突然掉电的情况,会导致文件系统的不一致。这就是文件系统的崩溃一致性(Crash Consistency)问题。

文件系统的崩溃一致性

例 1:一个事务包含多个写 IO

删除文件的步骤有

  1. 删除该文件的条目;
  2. 将文件占用的块在 bitmap 中置为 0。

如果在 1、2 之间掉电,会导致上电后文件系统不一致。

例 2:一个事务包含一个写 IO

一个写 IO 在从文件系统到硬件设备的每一个环节都很有可能被分解为多个 IO。如 write_data_pages->write_data_page;在 IO 控制器、硬盘上往往会由缓冲 buffer 分割写入。如果一个文件没有完全落盘就突然掉电,则该文件可能修改了一部分,造成不一致。

image.png

注意:读 IO 不会影响原子性和一致性。

关于文件系统不一致的例子参看https://pages.cs.wisc.edu/~remzi/OSTEP/file-journaling.pdf,一般会有垃圾数据、空间泄漏和文件系统元数据结构不一致等问题。只有一种情况,即只写了数据却没有更新 inode 和 bitmap 这两个元数据的时候,才没有造成文件系统不一致,只是用户丢失了数据。

保证崩溃一致性:保证文件系统从一个稳定的状态原子地转移到另一个稳定的状态

lazy approach:放任文件系统不一致,上电后通过fsck检查并修复

早期文件系统放任不一致,上电以后再解决这个问题。fsck 是一个在挂载文件系统之前检查并修复文件系统不一致的 Unix 工具。

  1. 检查超级块,成员数值是否合理。
  2. 检查 inode、dnode 等和 bitmap 是否一致。不一致则以前者为准。