在安装 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,但是从根节点获取的传统快照彼此独立运行,可以单独合并或删除。