Here is a quick walkthrough showing you how to expand an LVM volume or partition in Linux by first resizing logical volume followed by resizing the file system to take advantage of the additional space.
Note: In this example, we are working in Ubuntu, some commands may differ in different Linux distributions.
DISCLAIMER: Make sure that you have proper backups in place before starting out with the resize procedure on your VMs! Create any backups necessary to ensure that if something goes wrong you can always go back to a previous working state. Losing any information or wiping out your disks is all your fault if this happens. Using this procedure is all at your own responsibility.
If you are unsure about LVM and its components I will suggest you read a bit upon it. There are tons of articles, for example on Digital Ocean.
Process
This process can be easy to do with LVM as it can be done on the fly with no downtime needed, you can perform it on a mounted volume without interruption. In order to increase the size of a logical volume, the volume group that it is in must-have free space available. It goes as follows.
- Add more space from the hardware level. Either raid controller, or hypervisor.
- Resize your partition to contain the extra space
- Resize the PV in LVM
- Expand the LV in LVM
- Resize filesystem
To view the free space of your volume group, run pgdisplay command as shown below and look at the “Free PE / Size” field, in this case non-free.
root@www:~# pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name server1-vg
PV Size 99.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 25343
Free PE 0
Allocated PE 25343
PV UUID cgPMYF-PkeW-1iaS-FxUZ-Ky9r-Zoa8-ktpEk5
Since we have added more space from the hardware level need to grow the partition. This is done by deleting it and create a new one that is starting from the same sectors but where the new partition uses more sectors than before. In the output beneath we can see how to extend the partition.
root@www:~# fdisk -l /dev/sdb
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb97da1a0
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 207620095 207618048 99G 83 Linux
root@www:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +99.9G
Created a new partition 1 of type 'Linux' and of size 99.9 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
root@www:~# partprobe
The disk partition is now extended. We need to inform LVM to grow its PV
root@www:~# pvresize /dev/sdb1
Physical volume "/dev/sdb1" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
Now we can verify that there is available space to grow LV.
root@www:~# pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name server1-vg
PV Size 99.88 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25568
Free PE 225
Allocated PE 25343
PV UUID cgPMYF-PkeW-1iaS-FxUZ-Ky9r-Zoa8-ktpEk5
Lastly, we grow the LV and extend the filesystem.
root@www:~# lvextend -l +100%FREE /dev/mapper/server1--vg-root
Size of logical volume server1-vg/root changed from 196.51 GiB (50307 extents) to 197.39 GiB (50532 extents).
Logical volume root successfully resized.
root@www:~# resize2fs /dev/mapper/server1--vg-root
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mapper/server1--vg-root is mounted on /; on-line resizing required
old_desc_blocks = 13, new_desc_blocks = 13
The filesystem on /dev/mapper/server1--vg-root is now 51744768 (4k) blocks long.
Conclusion
We have now successfully expanded a file system and corresponding LVM logical volume without any downtime. This was done by first expanding the partition of the disk, then the logical volume and finally performing an online resize of the file system.
No servers were harmed doing this procedure 🙂