据我所知,BtrFS 快照实际上并不复制数据。我想,实际复制会在快照数据的每次更改时执行。
那么启用快照的 SSD 上的 BtrFS 分区是否会使 SSD 内存的磨损增加一倍?第一次写入用于新数据,第二次写入用于将差异记录到快照。
我已经使用带有快照的 BtrFS 作为/
分区文件系统已有相当长一段时间了,而且有几次它确实对我有帮助。但现在我要在SSD上安装系统。
答案1
长话短说
不会,它不会比使用不带快照的 BTRFS 更能缩短 SSD 的使用寿命。
解释
有几种不同的方法可以在软件中实现快照:
您存储所有正在快照的数据的精确副本。这不是很有效(无论是在空间还是时间方面),但这是存储数据的真实历史副本的唯一选择,并且实现起来非常简单。由于效率问题,它并未广泛用于快照,但这本质上是卷的完整备份的作用。
您存储数据的当前状态和历史状态之间的差异的副本。此方法在读取数据时存在性能问题,因为系统必须在请求的时间计算所请求数据的状态。这可以通过以下两种方式之一进行分层:
A。每个快照存储数据的当前状态和拍摄快照时数据的状态之间的差异。这是空间效率高的,但时间效率低(因为写出更改的时间与快照数量成线性比例)。快照的读取性能较差,但当前数据的读取性能还不错。这种方法没有被广泛使用,因为它实现起来有些棘手,而且写入性能很差,所以您最好只存储完整的副本。
b.拍摄的第一个快照存档当时数据的状态,后续快照仅存储自该副本以来的差异,当前状态是一种特殊情况,会随着用户更新而更改。仅当您仅修改现有数据而不添加或删除任何数据时,这才具有空间效率,但比 2a 更节省时间。大多数快照和当前数据的读取性能都很差,但第一个快照的读取性能很好。这就是增量备份的工作原理,在一种特殊的安排中,版本控制软件所做的就是每个差异都与之前的版本相对应,但它并没有广泛用于快照,因为下一个选项几乎在所有方面都更好。
快照是通过写时复制 (COW) 语义实现的。这是最节省空间的选项,平均而言,比方法 2 的两种变体都更节省时间。使用 COW 快照,任何给定的数据都存储一次,并且包含该数据的每个快照都会引用它。这解决了选项 1 和 2 的大部分问题。还有两种方法可以处理 COW 快照:
A。当当前版本中某条数据发生变化时,将旧数据复制到快照中,然后更新新数据。这会导致拍摄快照后对某个位置的首次写入出现性能问题,但后续写入正常,并且性能在其他方面还算合理。这就是 LVM 实现快照的方式,因为它很容易添加到尚未使用 COW 语义的现有数据集。
b.当当前版本中给定的数据发生更改时,在当前版本中创建该位置的新副本并将更改的数据存储在那里。这避免了选项 3a 的首次写入性能问题,但在删除快照时会产生性能损失(因为您必须验证每一位数据的引用以确定是否可以删除它)。这就是 ZFS 和 BTRFS 实现快照的方式(尽管 BTRFS 在某些非常特殊的情况下使用方法 3a)。
因为 BTRFS 使用方法 3b,所以在处理元数据时使用快照带来的唯一增加的开销,这应该只占 BTRFS 写入的实际数据的很小一部分(并且元数据更新无论如何都会发生,它们只是稍微小一点,而不需要快照)。