Here we show you how to shrink an LVM volume or partition in Linux by first resizing the file system followed by resizing the logical volume.
See here if you’re instead trying to do the opposite and expand an LVM volume.
Note: In this example we are working in CentOS 7, some commands may differ in different Linux distributions. As of CentOS 7 the default file system is XFS which is not currently possible to shrink, this example is working with the ext4 file system.
In this example we will work through shrinking logical volume /var/centos/var from 10GB to 5GB.
Overview of Logical Volume Manager (LVM)
Before working through the resizing process it’s important you first understand some basic concepts around physical volumes, volume groups, logical volumes, and the file system.
- Physical Volume (PV): This can be created on a whole physical disk (think /dev/sda) or a Linux partition.
- Volume Group (VG): This is made up of at least one or more physical volumes.
- Logical Volume (LV): This is sometimes referred to as the partition, it sits within a volume group and has a file system written to it.
- File System: A file system such as ext4 will be on the logical volume.
LVM Resize – How to decrease or shrink the logical volume
To decrease the size of an LVM partition you must first decrease the file system within in order to avoid possible data corruption. As there is the potential for this to happen if you enter the command incorrectly, it is strongly recommended that you have a full backup of your data before proceeding. Shrinking a logical volume will give you more space in the volume group, meaning that you could instead extend another logical volume with this new found space.
The first step will depend on if you’re looking to shrink a LVM root volume, or non-root volume.
Shrinking a root volume
The root volume would typically be the logical volume that is mounted to /. You cannot unmount this to shrink it as it’s in use by the running operating system meaning that you will have to first boot from a Live CD to complete this. Once booted into the Live CD, you may first need to run the below command to pick up LVM volumes, however this usually happens during boot so may not be required, if in doubt just run it.
vgchange -a y
Shrinking a non-root volume
Alternatively if the volume you are shrinking is a non-root volume, that is any other volume not mounted to the root of the file system, you can unmount the volume as shown below to proceed. Please note that when you unmount the volume the data will not be available, so you may need to schedule down time and stop running applications that use data from it prior to unmounting. Unmount by specifying either the logical volume or the location it’s currently mounted to, in the below example we specify the logical volume which can be found in /dev/(vg-name)/(lv-name).
umount /dev/centos/var
All following steps now apply to both a root or non-root volume.
Before being able to attempt to shrink the size of an LVM volume, you must first run a file system check on it. If you don’t do this, you will get an error message and will not be able to proceed. This is a required step as resizing a file system in a bad state could cause data corruption. The -f flag makes the check run even if the file system appears clean, while -y assumes yes to all questions and will respond if asked to fix a problem.
e2fsck -fy /dev/centos/var
Next you need to shrink the file system, to be safe we’re going to shrink the file system lower than what the logical volume will shrink to. This is because we don’t want to accidentally shrink the logical volume to a size lower than the file system in the next step, as this can result in corruption and data loss. Don’t worry, we’ll reclaim the space at the end.
The command below will shrink the file system so that it is only 4G in size total, note that what ever size you specify to shrink to you must have in free space within the file system otherwise you must first delete data.
resize2fs /dev/centos/var 4G
Once the file system has been reduced, we can shrink the size of the logical volume with the lvreduce command. Reduce this to the size that you want the volume to be, as specified by the -L flag. Instead if you want to reduce by a specified size, simply put a – in front of the size. Both are shown below for completeness, however you only need to run one.
To reduce to 5G
lvreduce -L 5G /dev/vg/disk-name
To reduce by 5G
lvreduce -L -5G /dev/vg/disk-name
Once you execute the lvreduce command you will get a warning advising the size you have chosen to reduce to so use this as a chance to confirm you’re shrinking the logical volume to a size that is NOT smaller than the size you previously shrunk the file system to. Once you have confirmed it’s fine to proceed enter ‘y’ and press enter.
After the logical volume has been lowered to the required size, run resize2fs on the volume as this will extend the file system to use all available space within the logical volume. This makes use of all remaining free space so that none is wasted from when we previously shrunk the file system to a lower size than the logical volume.
resize2fs /dev/centos/var
At this point all that’s left to do is mount the volume. If this was a root volume and you’re working within a Live CD, simply boot back into your primary Linux operating system.
If this was a non-root volume and you unmounted it to complete the reduction, simply mount it back. You can do this with ‘mount -a’ assuming you have the configuration already set in /etc/fstab, otherwise specify the logical volume and where it should mount to. Here we’re manually mounting to /mnt just for testing.
mount /dev/centos/var /mnt
After you’ve either booted back to primary operating system or completed the mount, check the space shown with the ‘df’ command to confirm it has been decreased as expected.
[root@CentOS7 /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 9.8G 1.4G 8.5G 14% / devtmpfs 908M 0 908M 0% /dev tmpfs 914M 0 914M 0% /dev/shm tmpfs 914M 8.6M 905M 1% /run tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/sda1 497M 96M 402M 20% /boot /dev/mapper/centos-var 4.8G 20M 4.6G 1% /mnt
In this example /dev/centos/var is correctly showing as shrunk down from the original 10G.
Summary
We have now successfully shrunk a file system and corresponding LVM logical volume. Root volumes can only be shrunk by unmounting the file system which requires booting into a Live CD to complete the work. For non-root volumes the file system must first be unmounted so that you can shrink the volume. First the file system was checked, then reduced. The logical volume itself was then reduced. It is strongly recommended to have a backup before attempting this to avoid data loss through mistakes.
Hi,
Thanks for all the useful articles on LVM.
Here I believe a small mistake is with:
e2fsck -fy /dev/centos/var
as the FS was unmounted earlier, it should be applied against the /dev//
I think it should be fine, we’re unmounting where ever /dev/vg/lv is mounted to, /dev/vg/lv itself should still exist though.
hello when downsizing you can use
lvresize –size 5G –resizefs /path/to/device
it will downsize the LV and call the resize routine for FS as well in one command
Hi,
An excellent and very helpful article.
Thanks for all the info.
How does the CentOS installer check available free space on systems where all disks are managed using LVM?
Thanks a lot!
Works on Debian 10 as well. Only thing I noticed is the file date/time is all reset to the time you did the resize. Not a big deal for the LVM’s I need but may be a deal breaker for some.
Hi,
An excellent and very helpful article.
Thanks for all the info.
This page has two examples with conflicting advice. Your second example appears to be reducing by a negative amount. Is this correct?
To reduce by 5G
lvreduce -L 5G /dev/vg/disk-name
To reduce by 5G
lvreduce -L -5G /dev/vg/disk-name
The command
lvreduce -L 5G /dev/vg/disk-name
reduces the partition to 5GB new_size=5GB
whereas
lvreduce -L -5G /dev/vg/disk-name
reduces the partition by 5GB (new_size=original_size-5GB)
Thank you for a such a good examples, works perfectly!
No problem!
Se fue a la B con el resize de / (root) (ojo al disminuir el tamaño. Es preferible que el este punto de montaje /, sea definido desde el principio en un tamaño estricto y funcional.
I am lost at “/dev/centos/var” already.
How to check my system /dev location? I have Ubuntu.
root@mint:/home/mint# pvs
PV VG Fmt Attr PSize PFree
/dev/sde2 system lvm2 a– <465.26g 0
root@mint:/home/mint# vgs
VG #PV #LV #SN Attr VSize VFree
system 1 2 0 wz–n- <465.26g 0
root@mint:/home/mint# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root system -wi-a—– <449.74g
swap system -wi-a—– <15.52g
What should I do to decrease the size of "root" / "system"?
Not working for me – is it because it is `ext4`?
# lvresize –size=32G –resizefs /dev/mapper/auth–vg-home
File system ext4 found on auth-vg/home.
File system device usage is not available from libblkid.