LVM Snapshots

Howto create a LVM Snapshot

Creating LVM Snapshots

A very useful feature of LVM is its ability to take what is known as a snapshot of a Logical Volume. This means that you make a copy or point in time copy of an existing Logical Volume. Snapshots are an easy way to quickly copy another Logical Volume. Snapshots give you the ability to restore a Logical Volume back to a recorded point in time. For example, if you are about to make some changes to your system, you could create a snapshot. This would then allow you to roll the changes back if you were not happy.

To create a Snapshot you would use the "lvcreate" command with the "-s" parameter.

Before we go any further it is worth confirming that your system supports the "snapshot-merge" functionality. The easiest way to check this is to issue the "dmsetup targets" command. Then from the output you should look for an entry that states "snapshot-merge". See example below taken from a SLES 11 sp2 server:

ls001a:/ # dmsetup targets
mirror           v1.12.1
snapshot-merge   v1.1.0
snapshot-origin  v1.7.1
snapshot         v1.10.0
striped          v1.4.0
linear           v1.1.0
error            v1.0.1

Example Snapshot Command:

lvcreate -n lvcopy -s /dev/vg01/lv01 -L 100M

The above command would create a new Logical Volume called "lvcopy". This Logical Volume would be a copy of the Logical Volume "lv01". The snapshot size in the example above is 100MB. Although this is a lot smaller then the size of the Logical Volume "lv01", this is perfectly OK as a snapshot only needs to be around 10% - 20% of the size of the original Logical Volume. Although the snapshot is smaller, it will appear to be the same size as the original Logical Volume when it is mounted. A snapshot only contains changes made to the original Logical Volume. In other words the bulk of your data is still held in the original Logical volume and only deviations from this are held in the snapshot.

Example of a Snapshot

Before we make any changes or issue the snapshot command, it is always a good idea to look at the current state of your Physical Volumes, Logical Volumes and Volume Groups. To do this we can issue the "pvs", "vgs" and "lvs" commands:

ls001a:/ # pvs
  PV         VG       Fmt  Attr PSize   PFree
  /dev/sda2  system   lvm2 a-    15.84g    1.68g
  /dev/sdb2  lint01vg lvm2 a-    40.00g 1020.00m
  /dev/sdb5  vg01     lvm2 a-   968.00m  168.00m

ls001a:/ # vgs
  VG       #PV #LV #SN Attr   VSize   VFree
  lint01vg   1   1   0 wz--n-  40.00g 1020.00m
  system     1   4   0 wz--n-  15.84g    1.68g
  vg01       1   1   0 wz--n- 968.00m  168.00m

ls001a:/ # lvs
  LV         VG       Attr   LSize    Origin Snap%  Move Log Copy%  Convert
  lint01lv01 lint01vg -wi-ao   39.00g
  home       system   -wi-ao    5.00g
  root       system   -wi-ao    6.73g
  tst        system   -wi-ao 1000.00m
  swap       system   -wi-ao    1.46g
  lv01       vg01     -wi-ao  800.00m

The Logical Volume we will take a snapshot of is called "lv01" and it is associated with the Volume Group "vg01".

To determine where our mount point is for our device "/dev/vg01/lv01" we can issue the mount command to list currently mounted filesystems:

/dev/mapper/vg01-lv01 on /john type ext3 (rw)

From the output taken from the mount command we can see that the mount point "/john" is used with "/dev/mapper/vg01-lv01".

For our example, we are going to navigate to the directory "/john" by issuing the command cd /john

From this directory, we are now going to copy some files across for our test:

ls001a:/john # cp -R /home/john .

ls001a:/john # ls -l
total 20
drwxr-xr-x 5 root root  4096 Apr 15 09:44 john
drwx------ 2 root root 16384 Apr 15 09:38 lost+found

For our example I have copied the directory /home/john to our current directory "/john". Our next step is to create a snapshot

Create a Snapshot

Next we need to issue our command to create the snapshot: lvcreate -n lvcopy -s /dev/vg01/lv01 -L 100M

ls001a:/john # lvcreate -n lvcopy -s /dev/vg01/lv01 -L 100M
  Logical volume "lvcopy" created

To view our new Logical Volume "lvcopy", we can issue the command "lvs":

ls001a:/john/john # lvs
  LV         VG       Attr   LSize    Origin Snap%  Move Log Copy%  Convert
  lint01lv01 lint01vg -wi-ao   39.00g
  home       system   -wi-ao    5.00g
  root       system   -wi-ao    6.73g
  tst        system   -wi-ao 1000.00m
  swap       system   -wi-ao    1.46g
  lv01       vg01     owi-ao  800.00m
  lvcopy     vg01     swi-a-  100.00m lv01     0.01

From the above output we can see our snapshot "lv01" along with how much space is being used under the heading "Snap%".

If we wanted to view the contents of our snapshot, then we can mount it in the normal manner. In the example below, we created a mount point called "snapshot":

ls001a:/ # mkdir snapshot
ls001a:/ # mount /dev/vg01/lvcopy /snapshot

ls001a:/ # df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/system-root          6.7G  4.8G  1.6G  76% /
devtmpfs                         2.0G  180K  2.0G   1% /dev
tmpfs                            2.0G  188K  2.0G   1% /dev/shm
/dev/sda1                        152M   36M  109M  25% /boot
/dev/mapper/system-home          4.0G  153M  3.6G   4% /home
/dev/mapper/lint01vg-lint01lv01   39G  437M   37G   2% /MySQL
/dev/mapper/system-tst           985M   18M  918M   2% /tst
/dev/mapper/vg01-lv01            788M   17M  731M   3% /john
/dev/mapper/vg01-lvcopy          788M   17M  731M   3% /snapshot

If you look at the output from the "df -h" command, we can see that "/john" and "/snapshot" are identical in size.

Now lets make some change to the original Logical Volume area "/john".

ls001a:/john/john # ls -l
total 92
-rw------- 1 root root  1633 Apr 15 09:44 .bash_history
-rw-r--r-- 1 root root  1187 Apr 15 09:44 .bashrc
-rw-r--r-- 1 root root  1637 Apr 15 09:44 .emacs
drwxr-xr-x 2 root root  4096 Apr 15 09:44 .fonts
-rw-r--r-- 1 root root 18251 Apr 15 09:44 .gnu-emacs
-rw-r--r-- 1 root root   861 Apr 15 09:44 .inputrc
drwxr-xr-x 2 root root  4096 Apr 15 09:44 .mozilla
-rw-r--r-- 1 root root  6043 Apr 15 09:44 .muttrc
-rw-r--r-- 1 root root  1028 Apr 15 09:44 .profile
-rw------- 1 root root  3173 Apr 15 09:44 .viminfo
-rw-r--r-- 1 root root   849 Apr 15 09:44 .vimrc
-rw-r--r-- 1 root root  1940 Apr 15 09:44 .xim.template
-rwxr-xr-x 1 root root  1446 Apr 15 09:44 .xinitrc.template
drwxr-xr-x 2 root root  4096 Apr 15 09:44 bin
-rw-r--r-- 1 root root    28 Apr 15 09:44 list.txt
-rwxr-xr-x 1 root root   132 Apr 15 09:44
-rw-r--r-- 1 root root  1660 Apr 15 09:44 test1.txt
-rw-r--r-- 1 root root  1660 Apr 15 09:44 test2.txt

ls001a:/john/john # rm -fr bin

Unmount Original LV

From the directory path "/john/john" we have deleted the "bin" directory with the command "rm -fr bin". If we require this directory to be reinstated, we can now use our snapshot.

First, we need to unmount the target Logical Volume with the command " umount /dev/vg01/lv01".

ls001a:/ # umount /dev/vg01/lv01

lvconvert --merge

Now we can reinstate our original Logical Volume to our point in time snapshot. To accomplish this we use the command lvconvert with the "--merge" option.

Command to be issued: lvconvert --merge /dev/vg01/lvcopy

ls001a:/ # lvconvert --merge /dev/vg01/lvcopy
  Merging of volume lvcopy started.
  lv01: Merged: 0.1%
  lv01: Merged: 0.0%
  Merge of snapshot into logical volume lv01 has finished.
  Logical volume "lvcopy" successfully removed

After the "lvconvert" has run, our snapshot is automatically removed. Our Logical Volume "lv01" should now be back to its state when we ran our snapshot. we can now mount our LV again with the command mount /dev/vg01/lv01 /john

Our missing directory "/john/john/bin" will now be back.

If you see an error "Can't merge over open original volume", then you may need to issue the following commands to deactivate and reactivate your LV:

ls001a:/ # lvchange -an /dev/VolumeGroup/LogicalVolume
ls001a:/ # lvchange -ay /dev/VolumeGroup/LogicalVolume