文件系统快照与简单地制作文件副本有何不同?

Buf*_*lls 6 linux filesystems backup btrfs snapshot

通过做这个,

# btrfs subvolume snapshot /mnt/1 /mnt/1/snapshot
# tree /mnt/1
/mnt/1
??? a
??? snapshot
?   ??? a
?   ??? subv
??? subv
    ??? b

3 directories, 3 files
Run Code Online (Sandbox Code Playgroud)

我们可以在 btrfs 上从 /mnt/1 创建快照。

我的问题是:使用 snapshot 比使用 rsync 来简单备份文件系统有什么优势?

use*_*ser 8

快照可以看作是复制的一种特殊情况,但与复制不同。

我不太熟悉 Btrfs 的具体细节,但以下适用于 ZFS,Btrfs 从中汲取了很多灵感。显然Btrfs 快照实际上是读/写的这使得它们更类似于ZFS 文件系统克隆,但这并没有改变它们与文件副本的关系。

快照是文件系统状态的只读、时间点副本。

这是有效的,因为 Btrfs 和 ZFS 都是所谓的写时复制文件系统。每当更改数据块时,更改的数据都会写入磁盘上与原始副本不同的位置。这样做的主要好处是它大大提高了可靠性:因为需要覆盖的数据很少,导致数据丢失的问题的可能性大大降低。但是,还有其他优点。其中一项优势是您可以高效地进行文件系统级快照。一个主要的缺点是,当您的存储填满时,它往往会大大增加存储碎片,因为块分配器很难在任何地方找到物理存储副本。事实上,建议将 ZFS 池使用率保持在 80% 以下,大概不是因为这个确切原因。

快照基本上告诉文件系统代码“仍然需要这些块”。因此,它们不会被回收并可能被新数据覆盖。但是,它们仍然引用相同的旧数据块。

现在,这与简单地使用 rsync、cp、cat 或其他方式制作副本有何不同?这是不同的,因为在数据实际更改之前,不会制作数据的额外物理副本。

这就像立体声上的硬链接;访问不同名称的文件时,将使用数据的相同物理磁盘副本。不同之处在于,对于硬链接,对同名文件的更改会传播到所有其他副本,因为它们确实引用了相同的数据块。通过写时复制和快照,更改的块仅显示在更改的位置。(对于只读快照,这意味着在文件的“当前”版本中。)您还只需要重写实际已更改的块;剩下的块就留在原地。例如,对于包含 VM 磁盘映像的快照文件操作,这可能会对存储在磁盘上的数据量产生巨大影响

所以,回顾一下:

  • 快照仅需要更改块所需的磁盘空间。复制需要复制的数量乘以文件的大小。
  • 快照是只读的或读/写的,取决于文件系统设计。副本是按设计读/写的。
  • 副本是独立的。快照引用与文件当前版本相同的数据块,直到文件的当前版本更改(全部或部分)。