设备映射器快照支持
==============================

Device-mapper允许您,无需大量数据复制:

*)创建任何块设备的快照。这种快照可挂载、可存储块设备状态,且在不干扰原内容的情况下实现可读写。
*)创建设备“复制件”。即对相同数据流制作多种不同版本。
*)将块设备的快照合并回快照的原点设备。

在前两种情况下,dm只复制修改过的数据块,并使用一个独立的写时复制块设备来存储。
对于快照合并,COW存储的内容将合并回原始设备。

dm有三种可用的目标设备:
快照,快照源和快照合并。

*)snapshot-origin <origin>

通常会有一个或多个基于它的快照。
读取将直接映射到设备。对于每次写,原始数据将复制到每个快照的<COW设备>中,保持快照源可见内容不变,至少在<COW设备>填满之前。


*)snapshot <origin> <COW device> <persistent?> <chunksize>

创建<origin>块设备的快照。
改变过的扇区数据将存储在<COW设备>上。
写只会修改cow设备上的数据。
读取将从<COW设备>获取,或从<origin>获取未更改的数据。
<COW设备>通常是小于原设备,如果它被填满,快照将失效,被禁用,返回错误。所以监控cow设备剩余空间很重要,在cow设备空间耗尽之前扩展<COW设备>。

<persistent?>  P(持久)或N(不持久-重启后失效)。O(溢出)可以添加为持久存储选项,
允许用户空间在快照状态报告对“溢出”查看的支持。因此支持的存储类型有“P”,“PO”和“N”。

持久性存储和暂时性存储之间的差异是:暂时性存储的快照具有更少的必须保存在磁盘上的数据-它们可以被内核保存在内存。

在加载或卸载快照目标时,相应的快照源或快照合并目标必须被暂停。对原始目标的暂停失败,可能会导致数据损坏。


* snapshot-merge <origin> <COW device> <persistent> <chunksize>

获取与快照目标相同的表参数,除非它只使用持久性快照。该目标承担了“snapshot-origin”目标的角色,在“snapshot-origin”依然以原设备而存在时禁止加载。

创建合并快照,通过切换过程,将这些块合并回<origin>。合并启动后(在后台),<origin>可能会被打开,当I/O流向它时合并将继续。
此时对<origin>的更改将推迟到合并完成。
一旦合并启动了与之关联的快照设备,在访问时将返回-EIO。


LVM2如何使用快照
============================
创建卷的第一个LVM2快照时,将使用四个dm设备:

1)包含源卷原始映射表的设备;
2)用于制作<COW设备>的设备;
3)“快照”设备,组合#1和#2,这是可见快照卷;
4)“原始”卷(使用原始的源卷的设备号),其表由来自设备#1的源快照映射替代。

使用固定的命名方案,因此使用以下命令:

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如何使用快照合并
==================================
合并快照假定“快照原点”的作用
合并。因此,“快照原点”被替换为
“快照合并”。“-real”设备没有改变,“-cow”
设备重命名为<origin name> -cow以帮助LVM2清理
完成后合并快照。交出它的“快照”
“快照合并”的COW设备已停用(除非使用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


如何确定合并何时完成
===========================================
快照合并和快照状态行以:
  <sectors_allocated> / <total_sectors> <metadata_sectors>

<sectors_allocated>和<total_sectors>都包括数据和元数据。
在合并期间,分配的扇区数量变小
小。当持有数据的扇区数量时,合并已完成
为零,换句话说<sectors _allocated> == <metadata_sectors>。

这是一个实际的例子(使用lvm和dmsetup命令的混合):

#lvs
  LV VG Attr LSize原点捕捉%移动日志副本%转换
  base volumeGroup owi-a- 4.00g
  snap volumeGroup swi-a- 1.00g base 18.97

#dmsetup status volumeGroup-snap
0 8388608快照397896/2097152 1560
                                  ^^^^元数据扇区

#lvconvert --merge -b volumeGroup / snap
  开始合并音量快照。

#lvs volumeGroup / snap
  LV VG Attr LSize原点捕捉%移动日志副本%转换
  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原点捕捉%移动日志副本%转换
  base volumeGroup owi-a- 4.00g