Linux 上是否有任何类型的文件系统或卷管理器支持 COW 快照,但它不是为新快照写入新块,而是复制旧的、未更改的块,并对新写入进行就地替换?我不知道这种系统设计技术是否有正式名称,但它是一种逆 COW。
具体来说,用 LVM 的语言来说,我希望有一个将多个物理卷组合成一个卷组的系统。将有一个读/写逻辑卷包含文件系统数据块的最新副本。您可以添加一个新的物理卷并分配它来存储读/写逻辑卷的只读(从用户空间的角度)历史快照。当您向读/写逻辑卷进行写入时,旧数据副本将复制到只读物理卷,而新副本将就地写入读/写卷。
此设计的目的是让您一次干净地删除旧快照、其所有数据及其物理卷,而几乎不需要额外的复制。如果您使用 LVM 快照或 COW 文件系统以正常方式执行此操作,则您的旧磁盘具有所有未 COWed 旧数据的副本,而不仅仅是 COWed 旧数据,并且您必须复制所有未更改的数据删除磁盘之前。
答案1
LVM 基于范围:动态分配的磁盘小区域,而不是类似分区的大区域。快照或逻辑卷将引用其卷中的一堆这些范围,但这从根本上与原始逻辑卷的工作方式没有什么不同。您可以随时删除旧快照,它只会释放其唯一所有者的所有范围(在新状态下更改的卷的部分),而无需复制内容。
从物理上来说,在一个非常新的磁盘上,这些范围可能会按照您认为的顺序布置在物理卷上,但这只是在这种微不足道的情况下。删除快照更有可能释放一组碎片,就像删除卷的活动状态一样。因此,从实际角度来看,如果您有 LVM,那么您想要的和通过删除快照获得的没有什么区别。
答案2
根据lvm2 文档在快照上,这里使用两种 dm 目标类型:
快照来源
[...]对于每次写入,原始数据将保存在每个快照的<COW device>中[...]
这是“将原始数据复制到COW磁盘,覆盖主磁盘”的舞蹈。
快照
[...] 写入操作只会发送到 <COW device>。 [...]
不言自明。没有完成任何副本。
为了创建快照,lvm2 将其设置如下:
- 包含源卷的原始映射表的设备;
- 用作<COW设备>的设备;
- 一个“快照”设备,组合#1和#2,这是可见的快照卷;
- “原始”卷(使用原始源卷使用的设备号),其表被来自设备 #1 的“快照源”映射替换。
这意味着我们有两个可见的安装座。其中之一是#3,我们刚刚拍摄的快照。另一个是#4,这是我们拍摄快照的挂载点。
对#3(快照挂载)的任何写入都会直接转到 COW 设备,因为它是目标snapshot
。这是假设快照以读/写方式安装的。
对#4(原始安装)的任何写入都会将原始数据复制到 COW 设备并将新数据写入到位。这是因为它是一个snapshot-origin
目标。
因此,回答我的问题:如果您拍摄了只读快照,并让 lvm2 在您计划删除的物理卷上创建其 COW 设备,您将得到我所要求的行为。似乎也lvcreate
支持这种情况:
创建原始 LV 的 COW 快照 LV
lvcreate --type snapshot --size 大小 LV PV
要控制新 LV 将使用哪些 PV,请在命令行末尾指定一个或多个 PV 作为位置参数。 lvcreate 将仅从指定的 PV 分配物理盘区。
这似乎意味着命令行上指定的 PV 将容纳 COW 设备(上面的#2)。