直接回答:日志文件系统借鉴数据库的预写式日志(WAL)思想:把一次操作的元数据变更先作为事务追加写入日志区,提交后再写回实际位置(checkpoint)。崩溃重启时只需重放日志中已提交的事务,fsck 从全盘扫描变成几秒的重放。

展开解析:动机是一次文件写入涉及多处元数据更新(inode、块位图、目录项),断电在任意中间点都会留下不一致。ext4 提供三种日志模式:data=journal 把数据本身也写日志,最安全但写放大近一倍;data=ordered(默认)强制数据先于元数据落盘,元数据进日志,能保证崩溃后不会读到别人的旧数据块;data=writeback 只保元数据,性能最好但崩溃后文件可能含脏块。注意顺序保证依赖存储设备的写屏障(barrier/FLUSH),磁盘自带易失缓存是重要变量。

实践要点:日志保的是文件系统结构一致性,不保证应用层数据完整——应用仍要靠 fsync/fdatasync 把页缓存真正刷下去,数据库的 redo log 与之配合才构成端到端的崩溃恢复。另外日志带来写放大,对写入极重的负载可关注日志位置和大小调优。

追问方向:fsync 为什么慢、它到底保证到哪一层?data=ordered 为什么能防止脏数据泄露?COW 文件系统(btrfs、ZFS)为什么不需要传统意义上的日志?