Below steps are tested on Red Hat Enterprise Linux 7.
Being a system administrator we have to perform activities which leads to filesystem and data changes so it is always a good idea to keep a backup but taking a backup everytime might not be possible although backup is one of the option for a timely run like every night backup to protect our data but what if you know you are planning to perform some application upgrade which has thousands of files and you need an immediate fix so instead of copying all the files which needs huge amount of storage and alot of copy time we prefer to take a snapshot.
NOTE: LVM snapshot should NOT be mistaken with backup.
Small amount of change = very space efficient
I have a setup with below logical volumes
For the sake of this article we will create a snapshot of our 'data' partition. But before that lets check the existing content of our data partition
Our logical volume is mounted on /data directory
with below content
So the same is expected after performing a lvm snapshot merge.
use below command
Here,
Here we are creating a snapshot volume with 1G size (snap_data) for /dev/system/data logical volume
These snapshots are read write so you can mount this snapshot volume and check the data/content.
Check the content of the snapshot
We can get the details of the snapshot and the parent logical volume
As you see the new logical snapshot volume is visible in the above information
Let me put some dummy content with 1G size in the /data partition
Check the status of snapshot
As you see it shows 100% of the snapshot size is occupied which means now this snapshot is corrupted and cannot be used
Check this further using below commands
As you see once the snapshot size becomes full it becomes unusable so must be removed
NOTE: Automatic method is preferred as once the snapshot volume reaches 100% space, the snapshot will get corrupted as seen above.
After extending the snapshot volume
As you see the LVM COW table size (Copy On Write) size has increased from 1 Gb to 2 GB
For this article I will use above values
Next again we need to start from scratch which means create a new snapshot volume
Now lets again try to fill up the /data partition with some more data more than 1G
First attempt I will create dummy file with 512MB
Lets check the snapshot volume size, since the snapshot volume was 1G it easily was able to afford this change without extending its volume size
Next lets create one more dummy file with additional 512M of data
Now lets check the lvs status for snap_data, as you see the volume size increased to 1.5GB since we had asked lvm to extend to 50% if the threshold is reached
So this worked perfectly. But make sure the origin data size doesnot increases more than 1.5GB of rlse the snapshot will again get corrupted
Next once you are done it is time to restore your snapshot.
Since /data partition is in mounted state the snapshot merge failed, to perform this merge you have to perform manual lvm activation.
Unmount the 'data' partition
De-activate the data partition
Re-activate the same
Now validate you content of 'data' partition.
NOTE: If for some reason you cannot perform this re-activation, then this snapshot merge will happen during the next reboot of the node
On another terminal if you check we can see that the data partition has "O" attribute which means snapshot is merging with origin
and you are done here, our 'data' partition is back to its original state
Related Articles:
How to reduce LVM size in Linux step by step (online without reboot)
How to rename Logical Volume and Volume Group in Linux
How to remove logical and physical volume from Volume Group in Linux
How to extend/resize Logical Volume and Volume Group in Linux
Tutorial for Monitoring Tools SAR and KSAR with examples in Linux
How to configure Samba 4 Secondary Domain Controller
How to secure Apache web server in Linux using password (.htaccess)
How to register Red Hat Linux with RHN (Red Hat Network )
Red hat Enterprise Linux 5.5 Installation Guide (Screenshots)
15 tips to enhance security of your Linux machine
Why is Linux more secure than windows and any other OS
What is the difference between "su" and "su -" in Linux?
What is kernel-PAE in Linux?
What is swappiness and how do we change its value?
How to log iptables messages in different log file
What are the s and k scripts in the etc rcx.d directories
How to check all the currently running services in Linux
How to auto start service after reboot in Linux
What is virtual memory, paging and swap space?
Being a system administrator we have to perform activities which leads to filesystem and data changes so it is always a good idea to keep a backup but taking a backup everytime might not be possible although backup is one of the option for a timely run like every night backup to protect our data but what if you know you are planning to perform some application upgrade which has thousands of files and you need an immediate fix so instead of copying all the files which needs huge amount of storage and alot of copy time we prefer to take a snapshot.
NOTE: LVM snapshot should NOT be mistaken with backup.
How snapshot sizing works? How different is it from backup?
LVM snapshot are very much space efficient, by space efficient I mean when a snapshot is created for a logical volume with 10GB space the snapshot will take very less space (next to nothing) but as the content of the source volume increases the snapshot volume size will also increase accordingly. Hence a snapshot must be created but should not be kept for a long time as iy will end up eating alot of space. In such cases backup is the preferred option instead of snapshot.So how space efficient is the LVM snapshot?
Lots of change = not very space efficientSmall amount of change = very space efficient
IMPORTANT NOTE: In LVM we have a feature where a snapshot size can be extended but that does not means that any data modified after creating a snapshot will also be restored since the snapshot was extended at a later point of time.
Snapshot will revert back to the state of point where it was taken and any data modified after taking the snapshot will be overwritten.
Let us start with some examplesSnapshot will revert back to the state of point where it was taken and any data modified after taking the snapshot will be overwritten.
I have a setup with below logical volumes
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data system -wi-a----- 2.00g
opt system -wi-ao---- 2.00g
root system -wi-ao---- 2.00g
swap system -wi-ao---- 4.00g
tmp system -wi-ao---- 12.00g
var system -wi-ao---- 2.00g
For the sake of this article we will create a snapshot of our 'data' partition. But before that lets check the existing content of our data partition
Our logical volume is mounted on /data directory
# df -Th /data/
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/system-data ext4 2.0G 6.1M 1.8G 1% /data
with below content
# ll /data/
total 28
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir1
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir2
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir3
-rw-r--r-- 1 root root 0 Sep 13 2017 file1
-rw-r--r-- 1 root root 0 Sep 13 2017 file2
-rw-r--r-- 1 root root 0 Sep 13 2017 file3
drwx------ 2 root root 16384 Sep 13 03:17 lost+found
So the same is expected after performing a lvm snapshot merge.
use below command
To create a snapshot
# lvcreate -L 1G -s -n snap_data /dev/system/data
Using default stripesize 64.00 KiB.
Logical volume "snap_data" created.
Here,
-L means assign LogicalVolume Size
-s or (--snapshot) means create a snapshot volume
-n or (--name) means the name of the snapshot logical volume
Lastly (/dev/system/data) is the path of the logical volume whose snapshot has to be created
Here we are creating a snapshot volume with 1G size (snap_data) for /dev/system/data logical volume
These snapshots are read write so you can mount this snapshot volume and check the data/content.
# mount /dev/system/snap_data /mnt/
Check the content of the snapshot
# ll /mnt/
total 28
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir1
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir2
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir3
-rw-r--r-- 1 root root 0 Sep 13 2017 file1
-rw-r--r-- 1 root root 0 Sep 13 2017 file2
-rw-r--r-- 1 root root 0 Sep 13 2017 file3
drwx------ 2 root root 16384 Sep 13 03:17 lost+found
We can get the details of the snapshot and the parent logical volume
# lvs /dev/system/snap_data
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
snap_data system swi-aos--- 1.00g data 0.00
As you see the new logical snapshot volume is visible in the above information
IMPORTANT NOTE: Make sure the snapshot volume size is always equal to the origin volume if you feel that the origin volume is going to be left out for a long period and high amount of data will be written on the source partition as there are chances of snapshot getting corrupted if the origin volume size becomes larger than the snapshot volume size.
What if I start working on this origin partition and it gets filled up with more than 1GB of data?
Here my snapshot volume size is 1G while the actual volume size is 2G where only few MB is used# df -h /data/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/system-data 2.0G 6.1M 1.8G 1% /data
Let me put some dummy content with 1G size in the /data partition
# dd if=/dev/zero of=/data/dummy_file2 bs=1G count=1 oflag=dsync
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 98.5545 s, 10.9 MB/s
Check the status of snapshot
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data system owi-aos--- 2.00g
mgtserv system -wi-ao---- 2.00g
opt system -wi-ao---- 2.00g
root system -wi-ao---- 2.00g
snap_data system swi-I-s--- 1.00g data 100.00
swap system -wi-ao---- 4.00g
tmp system -wi-ao---- 12.00g
var system -wi-ao---- 2.00g
As you see it shows 100% of the snapshot size is occupied which means now this snapshot is corrupted and cannot be used
Check this further using below commands
# lvdisplay /dev/system/snap_data
--- Logical volume ---
LV Path /dev/system/snap_data
LV Name snap_data
VG Name system
LV UUID NwJSQu-NjIr-7Qn0-Wo0q-ig7d-3apy-eChdWD
LV Write Access read/write
LV Creation host, time nds18-rdssrv, 2017-09-13 04:23:35 -0400
LV snapshot status INACTIVE destination for data
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 64
COW-table size 1.00 GiB
COW-table LE 32
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:12
# dmsetup status
system-var: 0 4194304 linear
system-snap_data: 0 4194304 snapshot Invalid
# grep Snapshot /var/log/messages
Sep 13 03:32:19 nds18-rdssrv lvm[12168]: WARNING: Snapshot system-snap_data is now 80.02% full.
Sep 13 03:54:07 nds18-rdssrv lvm[1595]: WARNING: Snapshot system-snap_data is now 83.52% full.
Sep 13 04:29:52 nds18-rdssrv lvm[1606]: WARNING: Snapshot system-snap_data changed state to: Invalid and should be removed.
As you see once the snapshot size becomes full it becomes unusable so must be removed
# lvremove -f /dev/system/snap_data
Logical volume "snap_data" successfully removed
How can we avoid such scenarios?
We have an option to automatically extend the logical volume if the origin volume parition size reaches the threshold or manually extend the snapshot size before it becomes 100% occupied.NOTE: Automatic method is preferred as once the snapshot volume reaches 100% space, the snapshot will get corrupted as seen above.
For manually extending the snapshot volume
Before extending the snapshot volume# lvdisplay /dev/system/snap_data
--- Logical volume ---
LV Path /dev/system/snap_data
LV Name snap_data
VG Name system
LV UUID ETHmgE-sgz0-4o7Q-3GDQ-pUy4-CJPo-D3nlIe
LV Write Access read/write
LV Creation host, time nds18-rdssrv, 2017-09-13 05:21:37 -0400
LV snapshot status active destination for data
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 64
COW-table size 1.00 GiB
COW-table LE 32
Allocated to snapshot 0.00%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:12
# lvextend -L +1G /dev/system/snap_data
Size of logical volume system/snap_data changed from 1.00 GiB (32 extents) to 2.00 GiB (64 extents).
Logical volume system/snap_data successfully resized.
After extending the snapshot volume
# lvdisplay /dev/system/snap_data
--- Logical volume ---
LV Path /dev/system/snap_data
LV Name snap_data
VG Name system
LV UUID ETHmgE-sgz0-4o7Q-3GDQ-pUy4-CJPo-D3nlIe
LV Write Access read/write
LV Creation host, time nds18-rdssrv, 2017-09-13 05:21:37 -0400
LV snapshot status active destination for data
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 64
COW-table size 2.00 GiB
COW-table LE 64
Allocated to snapshot 0.00%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:12
As you see the LVM COW table size (Copy On Write) size has increased from 1 Gb to 2 GB
For automatically extending the snapshot volume
Open the below file and change snapshot_autoextend_threshold value from 100 to some other value lower than 100 and snapshot_autoextend_percent to the value you would like to extend the snapshot volume, more detail on this attrubute is provided in the logfile# vim /etc/lvm/lvm.conf
# Configuration option activation/snapshot_autoextend_threshold.
# Auto-extend a snapshot when its usage exceeds this percent.
# Setting this to 100 disables automatic extension.
# The minimum value is 50 (a smaller value is treated as 50.)
# Also see snapshot_autoextend_percent.
# Automatic extension requires dmeventd to be monitoring the LV.
#
# Example
# Using 70% autoextend threshold and 20% autoextend size, when a 1G
# snapshot exceeds 700M, it is extended to 1.2G, and when it exceeds
# 840M, it is extended to 1.44G:
# snapshot_autoextend_threshold = 70
#
snapshot_autoextend_threshold = 70
# Configuration option activation/snapshot_autoextend_percent.
# Auto-extending a snapshot adds this percent extra space.
# The amount of additional space added to a snapshot is this
# percent of its current size.
#
# Example
# Using 70% autoextend threshold and 20% autoextend size, when a 1G
# snapshot exceeds 700M, it is extended to 1.2G, and when it exceeds
# 840M, it is extended to 1.44G:
# snapshot_autoextend_percent = 20
#
snapshot_autoextend_percent = 50
For this article I will use above values
Next again we need to start from scratch which means create a new snapshot volume
# lvcreate -L 1G -s -n snap_data /dev/system/data
Now lets again try to fill up the /data partition with some more data more than 1G
First attempt I will create dummy file with 512MB
# dd if=/dev/zero of=/data/dummy_file2 bs=512M count=1 oflag=dsync
1+0 records in
1+0 records out
536870912 bytes (537 MB) copied, 16.3479 s, 32.8 MB/s
Lets check the snapshot volume size, since the snapshot volume was 1G it easily was able to afford this change without extending its volume size
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data system owi-aos--- 2.00g
mgtserv system -wi-ao---- 2.00g
opt system -wi-ao---- 2.00g
root system -wi-ao---- 2.00g
snap_data system swi-a-s--- 1.00g data 50.21
Next lets create one more dummy file with additional 512M of data
# dd if=/dev/zero of=/data/dummy_file bs=512M count=1 oflag=dsync
1+0 records in
1+0 records out
536870912 bytes (537 MB) copied, 28.1028 s, 19.1 MB/s
Now lets check the lvs status for snap_data, as you see the volume size increased to 1.5GB since we had asked lvm to extend to 50% if the threshold is reached
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data system owi-aos--- 2.00g
mgtserv system -wi-ao---- 2.00g
opt system -wi-ao---- 2.00g
root system -wi-ao---- 2.00g
snap_data system swi-a-s--- 1.50g data 66.94
swap system -wi-ao---- 4.00g
tmp system -wi-ao---- 12.00g
var system -wi-ao---- 2.00g
So this worked perfectly. But make sure the origin data size doesnot increases more than 1.5GB of rlse the snapshot will again get corrupted
How to restore/merge the snapshot?
Next once you are done it is time to restore your snapshot.
IMPORTANT NOTE: Before merging the snapshot make sure that the origin source is in unmounted state or else the merging will be postponed for a pending activation of the logical volume. Below are examples for both the scenario
If the origin source is in mounted state
To merge the snapshot use the below command# lvconvert --merge /dev/system/snap_data
Can't merge until origin volume is closed.
Merging of snapshot system/snap_data will occur on next activation of system/data.
Since /data partition is in mounted state the snapshot merge failed, to perform this merge you have to perform manual lvm activation.
Unmount the 'data' partition
# umount /data/
De-activate the data partition
# lvchange -an /dev/system/data
Re-activate the same
# lvchange -ay /dev/system/data
Now validate you content of 'data' partition.
# ll /data/
total 524320
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir1
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir2
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir3
-rw-r--r-- 1 root root 0 Sep 13 03:24 file1
-rw-r--r-- 1 root root 0 Sep 13 03:24 file2
-rw-r--r-- 1 root root 0 Sep 13 03:24 file3
drwx------ 2 root root 16384 Sep 13 03:17 lost+found
NOTE: If for some reason you cannot perform this re-activation, then this snapshot merge will happen during the next reboot of the node
If the origin is in un-mounted state
# lvconvert --merge /dev/system/snap_data
Merging of volume system/snap_data started.
data: Merged: 33.20%
data: Merged: 54.44%
data: Merged: 75.88%
data: Merged: 98.10%
data: Merged: 100.00%
On another terminal if you check we can see that the data partition has "O" attribute which means snapshot is merging with origin
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data system Owi-a-s--- 2.00g 49.74
mgtserv system -wi-ao---- 2.00g
opt system -wi-ao---- 2.00g
root system -wi-ao---- 2.00g
swap system -wi-ao---- 4.00g
tmp system -wi-ao---- 12.00g
var system -wi-ao---- 2.00g
and you are done here, our 'data' partition is back to its original state
# ll /data/
total 524320
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir1
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir2
drwxr-xr-x 2 root root 4096 Sep 13 03:24 dir3
-rw-r--r-- 1 root root 0 Sep 13 03:24 file1
-rw-r--r-- 1 root root 0 Sep 13 03:24 file2
-rw-r--r-- 1 root root 0 Sep 13 03:24 file3
drwx------ 2 root root 16384 Sep 13 03:17 lost+found
Related Articles:
How to reduce LVM size in Linux step by step (online without reboot)
How to rename Logical Volume and Volume Group in Linux
How to remove logical and physical volume from Volume Group in Linux
How to extend/resize Logical Volume and Volume Group in Linux
Follow the below links for more tutorials
Configure Red Hat Cluster using VMware, Quorum Disk, GFS2, OpenfilerTutorial for Monitoring Tools SAR and KSAR with examples in Linux
How to configure Samba 4 Secondary Domain Controller
How to secure Apache web server in Linux using password (.htaccess)
How to register Red Hat Linux with RHN (Red Hat Network )
Red hat Enterprise Linux 5.5 Installation Guide (Screenshots)
15 tips to enhance security of your Linux machine
Why is Linux more secure than windows and any other OS
What is the difference between "su" and "su -" in Linux?
What is kernel-PAE in Linux?
What is swappiness and how do we change its value?
How to log iptables messages in different log file
What are the s and k scripts in the etc rcx.d directories
How to check all the currently running services in Linux
How to auto start service after reboot in Linux
What is virtual memory, paging and swap space?