日志文件系统(英語:Journaling file system)是一種文件系統。在发生变化时,它先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统。在文件系统发生故障(如内核崩溃或突然停电)时,日志文件系统更容易保持一致性,并且可以较快恢复。[1]
概述
对文件系统进行修改时,需要进行很多操作。这些操作可能中途被打断,也就是说,這些操作不是“不可中斷”(atomic)的。如果操作被打断,就可能造成文件系统出现不一致的状态。[1]
例如:删除文件时,先要从目录树中移除文件的标示,然后收回文件占用的空间。如果在这两步之间操作被打断,文件占用的空间就无法收回。文件系统认为它是被占用的,但实际上目录树中已经找不到使用它的文件了。
在非日志文件系统中,要检查并修复类似的错误就必须对整个文件系统的数据结构进行检查。一般在挂载文件系统前,操作系统会检查它上次是否被成功卸载,如果没有,就会对其进行检查。如果文件系统很大或者I/O带宽有限,这个操作可能会花费很长时间。
为了避免这样的问题,日志文件系统分配了一个称为日志(journal)的区域来提前记录要对文件系统做的更改。在崩溃后,只要读取日志重新执行未完成的操作,文件系统就可以恢复一致。这种恢复是原子的,因为只存在几种情况:
- 不需要重新执行:这个事务被标记为已经完成
- 成功重新执行:根据日志,这个事务被重新执行
- 无法重新执行:这个事务会被撤销,就如同这个事务从来没有发生过
- 日志本身不完整:事务还没有被完全写入日志,它会被简单忽略
日志的三个级别
在很多日志文件系统(如:ext3、ReiserFS)中,可以选择三个级别的日志:回写(writeback)、顺序(ordered)和数据(data)。
回写
在回写模式中,只有元数据被记录到日志中,数据会被直接写入主文件系统。这种模式能提供较好的性能,不过有较大的风险。例如:在增大文件时,数据还未写入就发生崩溃,那么文件系统恢复后,文件后面就可能出现垃圾数据。
顺序
在顺序模式中,只有元数据被记录到日志中,但在日志被标记为提交前,数据会被写入文件系统。在这种模式下,如果在增大文件时,数据还未写入就发生崩溃,那么在恢复时这个事务会被简单的撤销,文件保持原来的状态。
数据
在数据模式中,元数据和文件内容都先被写入日志中,然后在提交到主文件系统。这提高了安全性,但损失性能,因为所有数据要写入两次[1]。在这种模式下,如果在增大文件时,发生崩溃,那么可能有两种情况:
- 日志完整:这时事务会被重新执行,修改会被提交到主文件系统
- 日志不完整:这时主文件系统还未被修改,只需要简单放弃这个事务
常见的日志文件系统
参见
参考资料