为什么 LV 的冻结快照会不断变化?

为什么 LV 的冻结快照会不断变化?

在安装 gcc-8.3.0 之前,我使用以下命令对根(“/”)LV 进行快照:

lvcreate -L 20G -s vgsys/lvroot -n lvroot_gcc7

然后,我安装了 gcc-8.3.0,并对根 LV 进行了另一个快照,如下所示:

lvcreate -L 25G -s vgsys/lvroot -n lvroot_gcc8

现在,我的系统如下所示:

root# lvs
LV          VG    Attr       LSize  Pool Origin Data%  Meta%  Move Log         Cpy%Sync Convert   
lvhome      vgsys -wi-ao---- 80.00g                
lvroot      vgsys owi-aos--- 64.00g                                   
lvroot_gcc7 vgsys swi-a-s--- 20.00g      lvroot 5.26  
lvroot_gcc8 vgsys swi-a-s--- 25.00g      lvroot 0.00

我使用这个系统一段时间后,发现的使用百分比(数据%)在lvroot_gcc7不断变化,就像lvroot_gcc8

现在,这是我的系统状态:

LV          VG    Attr       LSize  Pool Origin Data%  Meta%  Move Log    Cpy%Sync Convert
lvhome      vgsys -wi-ao---- 80.00g                
lvroot      vgsys owi-aos--- 64.00g                                   
lvroot_gcc7 vgsys swi-a-s--- 20.00g      lvroot 6.05                  
lvroot_gcc8 vgsys swi-a-s--- 25.00g      lvroot 0.86

顺便说一句,每次我拍摄快照之前,我都会使用 Kubuntu 18.04.2 安装介质 USB 棒重新启动系统,并且lvroot在未安装时始终拍摄快照。

为什么创建lvroot_gcc7后仍然在变化?lvroot_gcc8

我的理解是,在我创建了 lvroot 的第一个快照之后,在创建第二个快照之前,如果 lvroot 中的数据要被覆盖,那么它会先被读出并写入第一个快照。但是在我创建了第二个快照之后,要被覆盖的数据应该被读出并写入第二个快照仅有的,除非第二个快照无效或空间不足,否则旧数据将被复制到第一个快照。这是 LVM 系统跟踪 LV 变化的方式。同一个原始 LV 的许多快照以这种方式组成一个链接。如果我的理解正确,第一个快照在创建第二个快照后就被冻结了,因此如果第二个快照有足够的可用空间来跟踪 lvroot 的变化,则不应该对第一个快照进行任何写入操作,并且第一个快照的已用大小应该不是不断变化。

答案1

LVM 快照是写时复制的。这意味着当您创建快照时,您会立即拥有一个快照,但它会通过写时复制算法保持不变:当写入时lvroot,首先读取要写入的数据,然后将其写入快照。这样,您就可以保留原始数据。这显然会占用空间,这就是快照需要足够空间的原因。

这是正常现象。这也意味着每个快照的性能会降低。

我还想提醒您,lvroot在启动时可能会实际安装快照而不是原始文件。通常,/etc/fstab快照中包含 UUID,用于唯一标识文件系统。但是,快照的文件系统 UUID 是相同的,因此可能会意外安装错误的文件系统。

您可以通过--permission r在创建快照时添加来缓解这种情况。这样,当您使用错误的快照时,您会立即知道,因为您会收到有关它是只读的错误。

至于您对问题的补充:我从未使用过 AB 描述的 Thinpools,但是从根节点获取的传统快照彼此独立运行,可以单独合并或删除。

相关内容