事务的原子性是指一个事务要么被执行,要么不被执行,不能执行一半。
在文件系统中,由于存在突然掉电的情况,会导致文件系统的不一致。这就是文件系统的崩溃一致性(Crash Consistency)问题。
例 1:一个事务包含多个写 IO
删除文件的步骤有
如果在 1、2 之间掉电,会导致上电后文件系统不一致。
例 2:一个事务包含一个写 IO
一个写 IO 在从文件系统到硬件设备的每一个环节都很有可能被分解为多个 IO。如 write_data_pages->write_data_page;在 IO 控制器、硬盘上往往会由缓冲 buffer 分割写入。如果一个文件没有完全落盘就突然掉电,则该文件可能修改了一部分,造成不一致。
注意:读 IO 不会影响原子性和一致性。
关于文件系统不一致的例子参看https://pages.cs.wisc.edu/~remzi/OSTEP/file-journaling.pdf,一般会有垃圾数据、空间泄漏和文件系统元数据结构不一致等问题。只有一种情况,即只写了数据却没有更新 inode 和 bitmap 这两个元数据的时候,才没有造成文件系统不一致,只是用户丢失了数据。
早期文件系统放任不一致,上电以后再解决这个问题。fsck 是一个在挂载文件系统之前检查并修复文件系统不一致的 Unix 工具。