这两个系统都允许您通过不同的机制提供原子性/一致性:
-
当您修改某些内容时,卷影分页总是分配一个新的块,当一个块被覆盖时,它的旧副本将变为空闲的,因为任何其他活动的文件系统块都不会引用它。崩溃一致性来自于树上的递归元数据更新——更新叶块所在的位置(在修改过程中复制到其他位置),并且必须更新其父级(在修改过程中复制到其他位置),等等。当整个链到根目录时,所有修改的文件系统的新版本都变为可见的树的已更新。
-
日志记录允许您在适当的位置修改块,但您仍然必须将它们写入两次:一次写入日志,标记您的意图(并在需要时提供多更新原子性,例如实现将文件从一个目录移动到另一个目录),然后一次写入日志本身。由于您正在就地修改,对于同一块的覆盖,除了您覆盖的特定文件系统树块之外,通常不需要更新其他许多文件系统树块,因为在编写新版本的文件系统树块时,这些块不会改变位置。
最大的区别是,卷影分页/写时复制使在文件系统中实现快照变得非常容易——您所需要做的就是跟踪文件系统树根的旧版本,以及它当时引用的任何内容。在日志记录中,这要困难得多,因为任何块都可以在任何时候被覆盖,日志也不是无限的——通常会很快被覆盖,因为否则它将占用磁盘上的大量空间。
写时复制的最大缺点,尤其是对于旋转磁盘,可能是它会使数据变得非常零碎,因此在频繁更新的文件的大规模连续读取过程中需要更多的磁盘查找。zfs有这个问题,我认为稍后的一些写上拷贝系统解决了这个问题,通过让一些中间层将逻辑块地址映射到物理地址来允许对数据进行碎片整理。