What is LVM
LVM stands for Logical Volume Management. It is a system of managing logical volumes, or filesystems, that is much more advanced and flexible than the traditional method of partitioning a disk into one or more segments and formatting that partition with a filesystem.
Why use LVM?
For a long time I wondered why anyone would want to use LVM when you can use gparted to resize and move partitions just fine. The answer is that lvm can do these things better, and some nifty new things that you just can’t do otherwise. I will explain several tasks that lvm can do and why it does so better than other tools, then how to do them. First you should understand the basics of lvm.
The Basics
There are 3 concepts that LVM manages:
- Volume Groups
- Physical Volumes
- Logical Volumes
A Volume Group is a named collection of physical and logical volumes. Typical systems only need one Volume Group to contain all of the physical and logical volumes on the system, and I like to name mine after the name of the machine. Physical Volumes correspond to disks; they are block devices that provide the space to store logical volumes. Logical volumes correspond to partitions: they hold a filesystem. Unlike partitions though, logical volumes get names rather than numbers, they can span across multiple disks, and do not have to be physically contiguous.
The Specifics
One of the biggest advantages LVM has is that most operations can be done on the fly, while the system is running. Most operations that you can do with gparted require that the partitions you are trying to manipulate are not in use at the time, so you have to boot from the livecd to perform them. You also often run into the limits of the msdos partition table format with gparted, including only 4 primary partitions, and all logical partitions must be contained within one contiguous extended partition.
Resizing Partitions
With gparted you can expand and shrink partitions, but only if they are not in use. LVM can expand a partition while it is mounted, if the filesystem used on it also supports that ( like the usual ext3/4 ). When expanding a partition, gparted can only expand it into adjacent free space, but LVM can use free space anywhere in the Volume Group, even on another disk. When using gparted, this restriction often means that you must move other partitions around to make space to expand one, which is a very time consuming process that can result in massive data loss if it fails or is interrupted ( power loss ).
Moving Partitions
Moving partitions with gparted is usually only necessary in the first place because of the requirement that partitions be physically contiguous, so you probably won’t ever need to do this with LVM. If you do, unlike gparted, LVM can move a partition while it is in use, and will not corrupt your data if it is interrupted. In the event that your system crashes or loses power during the move, you can simply restart it after rebooting and it will finish normally. When I got my SSD drive, I simply plugged it in, booted it up, and asked lvm to move my running root filesystem to the new drive in the background while I continued working. Another reason you might want to move is to replace an old disk with a new, larger one. You can migrate the system to the new disk while using it, and then remove the old one later.
Many Partitions
If you like to test various Linux distributions, or just different version of Ubuntu, or both, you can quickly end up with quite a few partitions. With conventional msdos partitions, this becomes problematic due to its limitations. With LVM you can create as many Logical Volumes as you wish, and it is usually quite easy since you usually have plenty of free space left. Usually people allocate the entire drive to one partition when they first install, but since extending a partition is so easy with LVM, there is no reason to do this. It is better to allocate only what you think you will need, and leave the rest of the space free for future use. If you end up running out of the initial allocation, adding more space to that volume is just one command that completes immediately while the system is running normally.
Snapshots
This is something you simply can not do without LVM. It allows you to freeze an existing Logical Volume in time, at any moment, even while the system is running. You can continue to use the original volume normally, but the snapshot volume appears to be an image of the original, frozen in time at the moment you created it. You can use this to get a consistent filesystem image to back up, without shutting down the system. You can also use it to save the state of the system, so that you can later return to that state if you mess things up. You can even mount the snapshot volume and make changes to it, without affecting the original.
Lets start
First check the partition available on our server
fdisk -l
As we can see we have partition table created for sda as sad1 and sda2. sdb is a new drive and no partitions have been created for it. Lets check what partition table is used to create lvm drive
lsblk
We can see sda2 is used to create 3 lvm drive centos-root, centos-swap and centos-home and sdb is new empty drive.
Lets create a partition for sdb drive
fdisk /dev/sdb
Now press m to list all options.
Press n to create a new partition table.
Choose partition type as p and partition number to 1. Select first sector as default 2048 and last sector as +5G. I have used 5G because I want to add only 5G from my current 10G sdb to LVM.
Now press l to see all partition types. We have to search for linux LVM and see its partition code as it is 8e.
Now press t and enter your partition code 8e
Now press w to write changes
Now run fdisk -l and you will see your partition created with LVM system.
Lets add newly created partition in lvm. First run pvdisplay and check the displayed information. In my case /dev/sda2 is added and volume group name is centos. We will add /dev/sdb1 to it.
[12:07][[email protected] ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <99.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25343
Free PE 1
Allocated PE 25342
PV UUID YdQIfT-nkCu-In0Z-JnFj-AEs3-anJs-plMXYP
pvcreate /dev/sdb1
[12:08][[email protected] ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
You can see above we have added sdb1 and it shows successfully added. Lets run pvdisplay again to check. We can see /dev/sdb1 is newly added physical volume with PV size of 5G.
[12:09][[email protected] ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <99.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25343
Free PE 1
Allocated PE 25342
PV UUID YdQIfT-nkCu-In0Z-JnFj-AEs3-anJs-plMXYP
"/dev/sdb1" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID X8gF3K-tMKx-EINI-Vbx5-ZT8B-dYQ0-kBGGIA
Now we will check volume group information using vgdisplay.
vgdisplay
[12:10][[email protected] ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size <99.00 GiB
PE Size 4.00 MiB
Total PE 25343
Alloc PE / Size 25342 / 98.99 GiB
Free PE / Size 1 / 4.00 MiB
VG UUID CwAUQa-3WWe-f8J3-Rhzy-qgSu-Sz8s-sbUtOM
Here we will not create a new volume we will just extend previously created volume group named centos using vgextend
vgextend centos /dev/sdb1
[12:14][[email protected] ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended
Now lets run vgdisplay again to check if sdb1 is added to it. You can see now we have 5.00 GiB of Free PE / Size.
[12:14][[email protected] ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 2
Act PV 2
VG Size 103.99 GiB
PE Size 4.00 MiB
Total PE 26622
Alloc PE / Size 25342 / 98.99 GiB
Free PE / Size 1280 / 5.00 GiB
VG UUID CwAUQa-3WWe-f8J3-Rhzy-qgSu-Sz8s-sbUtOM
Lets now check the logical volumes we have . We have 3 LV /dev/centos/swap, /dev/centos/home, /dev/centos/root. We will be extending /dev/centos/home whose size is 46.99 GiB.
lvdisplay
[12:16][[email protected] ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID QDO0Es-hJnI-7xIL-kbdS-bPnw-LJ7s-C7KWdf
LV Write Access read/write
LV Creation host, time localhost, 2020-04-10 00:53:46 +0000
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos/home
LV Name home
VG Name centos
LV UUID JVQgoI-hjzE-Ejyy-aBEN-erZR-pdiQ-jKUa4P
LV Write Access read/write
LV Creation host, time localhost, 2020-04-10 00:53:47 +0000
LV Status available
# open 1
LV Size 46.99 GiB
Current LE 12030
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID G0UXiw-Z106-H3o1-UIX9-S2FE-CmFj-xFfP5h
LV Write Access read/write
LV Creation host, time localhost, 2020-04-10 00:53:47 +0000
LV Status available
# open 1
LV Size 50.00 GiB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
In the below example we extending /dev/centos/home to 1G.
lvextend -L+1G /dev/centos/home
[12:17][[email protected] ~]# lvextend -L+1G /dev/centos/home
Size of logical volume centos/home changed from 46.99 GiB (12030 extents) to 47.99 GiB (12286 extents).
Logical volume centos/home successfully resized.
Now the last part is to resizing the volume. For xfs file systemd use below command
xfs_growfs /dev/centos/home
[12:26][[email protected] ~]# xfs_growfs /dev/centos/home
meta-data=/dev/mapper/centos-home isize=512 agcount=4, agsize=3079680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=12318720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6015, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 12318720 to 12580864
If you have ext4 filesystem use the below command
resize2fs /dev/centos/home