2026-10-24 10:22:56
原理
日志型文件系统的基本思想是在真正更新磁盘上的数据之前,先往磁盘上写入一些描述接下来要更新什么的信息,这种方式被称为write-ahead logging(预写日志)。这样,即便发生系统崩溃(crash),也可通过记录的日志信息回溯并恢复崩溃前正在进行的操作(称为replay)。
Transaction(事务):日志型文件系统将一系列更新操作视为一个事务(transcation),每个事务有一个开始标记(TxB)和一个结束标记(TxE),它们具有相同的sequence number。事务的概念起源于数据库领域,有助于在操作未能完成的情况下保证数据的一致性。
Journal(日志):日志部分单独占据一块磁盘空间,用于记录事务的步骤信息。在一个记录步骤信息的事务完成之后,才真正地更新磁盘上的文件数据(这一步称为checkpoint)。
Write Barrier(写屏障):由于I/O调度等原因,日志的各个部分不一定是按照提交的顺序写入的(out of order)。为了解决这一问题,使用写屏障。在写入除TxE以外的部分后(称为journal write),执行一次屏障操作。如果在此期间发生崩溃,由于没有TxE,这个事务会被认为是不完整的,重启后就不会试图恢复这个事务所代表的步骤。待journal write顺利完成以后,再写入TxE(称为journal commit),然后再执行一次屏障操作,以保证数据的写入是发生在日志完成之后。
数据一致性和原子性:日志型文件系统保证了涉及多个block的写操作的数据一致性。此外,磁盘本身提供对一个block的操作的原子性保障,即对一个block的操作必须是原子的(不可分割的)。
优化
日志型文件系统虽然提高了数据一致性,但也会增加磁盘的I/O负载。以下是一些优化方法:
Batching(批处理):将多个日志操作进行聚合处理,减少I/O操作的次数。
Metadata Journal(元数据日志):只记录对inode和bitmap等元数据的更新,而不记录对user data(用户数据)的更新。这种模式有两种变体:
Writeback模式:允许user data的真实写操作发生在journal的写操作过程中的任何节点。这提高了性能,但如果在journal写操作之后、meta data的真实写操作之前发生崩溃,可能造成meta data和user data的不一致。不过,相比完全不用日志的模式,Writeback模式造成不一致的概率和危害都降低了。
Ordered模式:保证对user data的真实写操作发生在journal的写操作之前。这样,如果崩溃发生在user data的写操作之后、journal的写操作之前,将造成这一部分user data的丢失,但不会造成不一致的问题。如果崩溃发生在journal的写操作之后、meta data的真实写操作之前,则可以通过replay来还原。
Data Journal(数据日志):除了记录元数据的更新外,还记录对用户数据的更新。这种模式提供了最高的数据一致性保障,但对性能的损耗也最大。
现代的文件系统通常会提供多种模式的选择,供不同场景下的用户使用。在选择日志模式时,需要根据具体的应用场景和需求来权衡性能和稳健性。










