What is the difference between a journaling vs a log structured file system?
来源:Quora同名问题——Ravi的回答
journaling File system
简单来说,文件系统先把一系列的写操作写到一个循环日志(circular log)里面,这个循环日志与磁盘数据分开。
文件系统中的journaling分成以下两部分:
metadata journaling
只有metadata(例如inode信息等)会存在log中,metadata journaling包括以下步骤:
- 修改文件数据(内存->磁盘)
- 在log中更新文件对应的inode
- 复制inode信息(log->磁盘)
好处是保证metadata的一致性,缺点是未保证数据的一致性,同时带来了两次inode的写(log和磁盘)。
physical journaling
与metadata非常类似,就是把文件的内容写到log中,好处很直观,保证了文件数据的一致性,缺点是带来了大量的写开销。
Log-structured File System
虽然在journaling中也有一个log,但是这两个文件系统是不一样的,log-structured文件系统把整个磁盘看做一个append only log,永远都是顺序追加到log的最后。所以这样我们会发现对于写操作永远都是顺序的。
对于那些修改后的文件以及删除的文件,我们自然不希望它们继续占着位置,所以一个高效的垃圾回收和空间管理机制是必须的。
如果不幸文件系统崩溃了,那么不同于fsck命令,LFS对整个硬盘存储了checkpoint,checkpoint中存储了第一个segment和最后一个segment的地址,segments之间通过指针连起来。segment是空闲空间的管理单位。
这里需要提到一个写时复制(copy-on-write)的技术。COW运用在很多地方,比如linux中fork子进程,以及我们要说到的文件系统。我们这里的COW特指在对文件数据进行修改的时候不会在原位置上直接操作。同时需要保证原子写。
关于LFS的详细信息,可以看:历史与概述