LVM Add, Extend and Resize the FS (ext4) all online

Lets say we have a volume group called vg_hostname, in that volume group there are 3 logical volumes:

[root@hostname ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lv_home vg_hostname -wi-ao-- 60.00g
lv_root vg_hostname -wi-ao-- 50.00g
lv_swap vg_hostname -wi-ao-- 1.97g

lv_home is mounted as /home, is 60GB and, is full. We need to add more space to it but what if the volume group is full?

[root@hostname ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_mail2 2 3 0 wz--n- 120.00g 0

Luckily LVM allows us to add another physical volume to the volume group to get the space we need. So lets add a new 80GB disk, lets assume that this is /dev/vdb

First, we need to partition the device and set the partition as type LVM:
[root@hostname ~]# fdisk /dev/vdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x496ca2c7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Command (m for help): p

Disk /dev/vdb: 85.9 GB, 85899345920 bytes
16 heads, 63 sectors/track, 166440 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x496ca2c7

Device Boot Start End Blocks Id System

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-166440, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-166440, default 166440):
Using default value 166440

Command (m for help): p

Disk /dev/vdb: 85.9 GB, 85899345920 bytes
16 heads, 63 sectors/track, 166440 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x496ca2c7

Device Boot Start End Blocks Id System
/dev/vdb1 1 166440 83885728+ 83 Linux

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx 5 Extended 42 SFS 86 NTFS volume set da Non-FS data 6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt 9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT f W95 Ext'd (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT 1e Hidden W95 FAT1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): p Disk /dev/vdb: 85.9 GB, 85899345920 bytes 16 heads, 63 sectors/track, 166440 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x496ca2c7 Device Boot Start End Blocks Id System /dev/vdb1 1 166440 83885728+ 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.

Now we have a LVM partition as /dev/vdb1, next turn it into a usable physical volume:

[root@hostname ~]# pvcreate /dev/vdb1
Writing physical volume data to disk "/dev/vdb1"
Physical volume "/dev/vdb1" successfully created

Adding the new physical volume to our vg_hostname volume group is quite easy:
[root@hostname ~]# vgextend vg_mail2 /dev/vdb1

Now we have an extra 80GB available in our volume group!
[root@hostname ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_mail2 2 3 0 wz--n- 199.50g 80.00g

Next we need to extend our vg_home logical volume to get that 80GB usable for that "partition" and since we want to use all available space we set the `-l +100%FREE1 flag/value to expand the logical volume to all available free space:

[root@hostname ~]# lvextend -l +100%FREE /dev/vg_hostname/lv_home
Extending logical volume lv_home to 147.54 GiB
Logical volume lv_home successfully resized

Now our underlying device is 147.54GiB but our file system (ext4) is still the original 60GB, using resize2fs we can extend that ext4 filesystem to consume the new space:

[root@hostname ~]# resize2fs /dev/vg_hostname/lv_home
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vg_hostname/lv_home to 38675456 (4k) blocks.
The filesystem on /dev/vg_hostname/lv_home is now 38675456 blocks long.

And now, we've added 80GB to our /home mount without taking the system or mount point offline.

Leave a Reply