设备映射器快照支持¶
设备映射器允许您,无需大量数据复制,
创建任何块设备的快照,即块设备的可挂载、已保存状态,这些状态也可以写入而不会干扰原始内容;
创建设备“分支”(forks),即同一数据流的多个不同版本。
将块设备的快照合并回快照的源设备。
在前两种情况下,dm 只复制发生变化的数据块,并使用单独的写时复制 (COW) 块设备进行存储。
对于快照合并,COW 存储的内容会合并回源设备。
有三个 dm 目标可用:snapshot、snapshot-origin 和 snapshot-merge。
snapshot-origin <origin>
通常会有一个或多个快照基于它。读取将直接映射到后端设备。对于每次写入,原始数据将保存在每个快照的 <COW device> 中,以保持其可见内容不变,至少直到 <COW device> 填满为止。
snapshot <origin> <COW device> <persistent?> <chunksize> [<# feature args> [<arg>]*]
创建 <origin> 块设备的快照。大小为 <chunksize> 扇区的已更改数据块将存储在 <COW device> 上。写入只会写入 <COW device>。读取将来自 <COW device> 或来自 <origin>(对于未更改的数据)。<COW device> 通常会小于源设备,如果它填满,快照将变得无用并被禁用,返回错误。因此,监控可用空间量并在 <COW device> 填满之前进行扩展非常重要。
<persistent?> 是 P(持久)或 N(非持久——重启后不会保留)。O(溢出)可以作为持久存储选项添加,以允许用户空间宣传其支持在快照状态中看到“溢出”。因此,支持的存储类型是“P”、“PO”和“N”。
持久快照和瞬态快照的区别在于,瞬态快照需要保存到磁盘的元数据较少——它们可以由内核保留在内存中。
加载或卸载快照目标时,必须挂起相应的 snapshot-origin 或 snapshot-merge 目标。未能挂起源目标可能导致数据损坏。
可选特性
discard_zeroes_cow - 对快照设备发出的映射到整个数据块的丢弃操作将清零快照异常存储中相应的异常。
discard_passdown_origin - 对快照设备的丢弃操作会传递到 snapshot-origin 的底层设备。这不会导致复制到快照异常存储,因为 snapshot-origin 目标被绕过。
discard_passdown_origin 功能依赖于 discard_zeroes_cow 功能的启用。
snapshot-merge <origin> <COW device> <persistent> <chunksize> [<# feature args> [<arg>]*]
它接受与快照目标相同的表参数,但仅适用于持久快照。此目标承担“snapshot-origin”目标的角色,并且如果 <origin> 的“snapshot-origin”仍然存在,则不得加载此目标。
创建一个合并快照,通过交接过程,接管现有快照的 <COW device> 中存储的已更改数据块,并将这些数据块合并回 <origin>。一旦合并开始(在后台),<origin> 可以被打开,并且在 I/O 流向它时合并将继续。对 <origin> 的更改将被延迟,直到合并快照的相应数据块已合并。一旦合并开始,与“snapshot”目标关联的快照设备在访问时将返回 -EIO。
LVM2 如何使用快照¶
当您创建卷的第一个 LVM2 快照时,会使用四个 dm 设备:
包含源卷原始映射表的设备;
用作 <COW device> 的设备;
一个“快照”设备,结合了 #1 和 #2,这是可见的快照卷;
“原始”卷(使用原始源卷的设备号),其表被设备 #1 的“snapshot-origin”映射替换。
使用固定的命名方案,因此使用以下命令:
lvcreate -L 1G -n base volumeGroup
lvcreate -L 100M --snapshot -n snap volumeGroup/base
我们将得到以下情况(卷按上述顺序)
# dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11
# ls -lL /dev/mapper/volumeGroup-*
brw------- 1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw------- 1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw------- 1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw------- 1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
LVM2 如何使用 snapshot-merge¶
合并快照在合并期间承担“snapshot-origin”的角色。因此,“snapshot-origin”被“snapshot-merge”替换。“-real”设备未更改,“-cow”设备被重命名为 <origin name>-cow,以帮助 LVM2 在合并快照完成后进行清理。将 COW 设备移交给“snapshot-merge”的“snapshot”被停用(除非使用 lvchange --refresh);但如果它保持活动状态,它将简单地返回 I/O 错误。
快照将通过以下命令合并到其源中
lvconvert --merge volumeGroup/snap
我们现在将遇到这种情况
# dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-base-cow: 0 204800 linear 8:19 2097536
volumeGroup-base: 0 2097152 snapshot-merge 254:11 254:12 P 16
# ls -lL /dev/mapper/volumeGroup-*
brw------- 1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw------- 1 root root 254, 12 29 ago 18:16 /dev/mapper/volumeGroup-base-cow
brw------- 1 root root 254, 10 29 ago 18:16 /dev/mapper/volumeGroup-base
如何判断合并何时完成¶
snapshot-merge 和 snapshot 状态行以以下内容结尾:
<sectors_allocated>/<total_sectors> <metadata_sectors>
<sectors_allocated> 和 <total_sectors> 都包含数据和元数据。在合并过程中,分配的扇区数量越来越少。当包含数据的扇区数量为零时,即 <sectors_allocated> == <metadata_sectors> 时,合并完成。
这是一个实际示例(使用 lvm 和 dmsetup 命令的混合)
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
base volumeGroup owi-a- 4.00g
snap volumeGroup swi-a- 1.00g base 18.97
# dmsetup status volumeGroup-snap
0 8388608 snapshot 397896/2097152 1560
^^^^ metadata sectors
# lvconvert --merge -b volumeGroup/snap
Merging of volume snap started.
# lvs volumeGroup/snap
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
base volumeGroup Owi-a- 4.00g 17.23
# dmsetup status volumeGroup-base
0 8388608 snapshot-merge 281688/2097152 1104
# dmsetup status volumeGroup-base
0 8388608 snapshot-merge 180480/2097152 712
# dmsetup status volumeGroup-base
0 8388608 snapshot-merge 16/2097152 16
合并已完成。
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
base volumeGroup owi-a- 4.00g