哪些文件系统在写入时会重用未更改的数据块?

哪些文件系统在写入时会重用未更改的数据块?

假设我打开并读取一个现有的N块文件,其中N > 1

然后我更改位于一个(1)块边界内的数据。

在写回实际数据时,可能会发生以下情况之一:

  1. N块被覆盖
  2. 1块被覆盖
  3. x块被覆盖,其中N > x > 1

在广泛使用的文件系统中,是否存在上述每个示例,以及它们是什么?

答案1

假设你只是触摸块,那么要么该块将被覆盖,要么不覆盖任何块。

第一种情况是当今广泛使用的绝大多数文件系统以及几乎所有历史文件系统的情况。示例包括 NTFS、FAT、ext4、XFS、HFS、HFS+ 和 UFS。本质上,这是最简单的选择,所有缺点都是众所周知的,并且很容易理解。

第二种情况是一些较新的文件系统所做的事情。值得注意的是,BTRFS、ZFS、NILFS2、F2FS,我相信 ReFS 和 APFS 都这样做(还有 Plan 9 From Bell Labs 的 Fossil 档案文件系统,我相信它可能是第一个这样做的)。它们的工作方式有点不同。它们不是直接覆盖现有块,而是写入一个新的、当前未使用的块,然后更新文件的元数据以指向该新副本,并释放旧副本。这有点复杂,但它确保写入要么发生要么不发生,而不是留下可能只部分完成的可能性。

但是,一旦您不再只处理一个块,事情就会变得复杂。根据系统的不同,您可能会或可能不会为写入分配新的块。您还可能因为应用程序行为而不是文件系统而分配新的块。在许多类 UNIX 系统中,应用程序将其要更新的文件的修改版本写入临时文件,然后通过重命名临时文件来替换旧文件,这是很常见的,因为这可以确保更新发生或不发生。

相关内容