Traditionally with LVM snapshots you need to be especially careful when
choosing how big to make your snapshots; if it is too small it will fill
up and become invalid. If taking many snapshots with limited space
then it becomes quite difficult to decide which snapshots need more
space than others.
One approach has been to leave some extra space in the VG and let
dmeventd periodically poll and lvextend
the snapshot if necessary (I
covered this in a previous
post ). However, a
reader of mine has pointed out that this polling mechanism does not work
very well for small snapshots.
Fortunately, with the addition of thin logical volume support within LVM
(I believe initially in RHEL/CentOS 6.4 and/or Fedora 17), size is much
less important to consider when taking a snapshot. If you create a thin
LV and then “snapshot” the thin LV, what you actually end up with are
two thin LVs. They both use extents from the same pool and the size will
grow dynamically as needed.
As always, examples help. In my system I have a 20G sdb
. I’ll create a
VG, vgthin
, that uses sdb
and then a 10G thin pool, lvpool
, within
vgthin
.
\
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
[root@localhost ~]#
[root@localhost ~]# vgcreate vgthin /dev/sdb
Volume group "vgthin" successfully created
[root@localhost ~]#
[root@localhost ~]# lvcreate --thinpool lvpool --size 10G vgthin
Logical volume "lvpool" created
Next, I’ll create a thin LV (lvthin
), add a filesystem and mount it.
\
[root@localhost ~]# lvcreate --name lvthin --virtualsize 5G --thin vgthin/lvpool
Logical volume "lvthin" created
[root@localhost ~]#
[root@localhost ~]# mkfs.ext4 /dev/vgthin/lvthin
...
[root@localhost ~]# mkdir /mnt/origin
[root@localhost ~]# mount /dev/vgthin/lvthin /mnt/origin
[root@localhost ~]#
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lvpool vgthin twi-a-tz- 10.00g 1.27
lvthin vgthin Vwi-a-tz- 5.00g lvpool 2.54
I’ll go ahead and create the snapshot now, but just as a sanity check
I’ll create a file, A
, that exists before the snapshot. After the
snapshot I’ll create a file, B
. This file should NOT be visible in the
snapshot if it is working properly.
\
[root@localhost ~]# touch /mnt/origin/A
[root@localhost ~]#
[root@localhost ~]# lvcreate --name lvsnap --snapshot vgthin/lvthin
Logical volume "lvsnap" created
[root@localhost ~]#
[root@localhost ~]# mkdir /mnt/snapshot
[root@localhost ~]# mount /dev/vgthin/lvsnap /mnt/snapshot/
[root@localhost ~]#
[root@localhost ~]# touch /mnt/origin/B
[root@localhost ~]#
[root@localhost ~]# ls /mnt/origin/
A B lost+found
[root@localhost ~]# ls /mnt/snapshot/
A lost+found
Perfect! Snapshotting is working as expected. What are our
utilizations?
\
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lvpool vgthin twi-a-tz- 10.00g 2.05
lvsnap vgthin Vwi-aotz- 5.00g lvpool lvthin 4.10
lvthin vgthin Vwi-aotz- 5.00g lvpool 4.10
Since we just created the snapshot our current utilization for both
lvthin
and lvsnap
are the same. Take note also that the overall data
usage for the entire pool actually shows us that lvthin
and lvsnap
are sharing the blocks that were present at the time the snapshot was
taken. This will continue to be true as long as those blocks don’t
change.
A few more sanity checks.. If we add a 1G file into the filesystem on
lvthin
we should see only the usage of lvthin
increase.
\
[root@localhost ~]# cp /root/1Gfile /mnt/origin/
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lvpool vgthin twi-a-tz- 10.00g 12.06
lvsnap vgthin Vwi-aotz- 5.00g lvpool lvthin 4.10
lvthin vgthin Vwi-aotz- 5.00g lvpool 24.10
If we add a 512M file into the snapshot then we should see only the
usage of lvsnap
increase.
\
[root@localhost ~]# cp /root/512Mfile /mnt/snapshot/
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lvpool vgthin twi-a-tz- 10.00g 17.06
lvsnap vgthin Vwi-aotz- 5.00g lvpool lvthin 14.10
lvthin vgthin Vwi-aotz- 5.00g lvpool 24.10
And thats it.. Not that exciting, but it is dynamic allocation of
snapshots (did I also mention there is support for snapshots of
snapshots of snapshots?). As long as there is still space within the
pool the snapshot will grow dynamically.
Cheers
Dusty