Introduction
LVM (Logical Volume Manager) is a flexible way to handle disk space, since you can increase and decrease file systems, that is not possible to the same extent as in MBR (Master Boot Record) partitioning format.
NOTE: "It is generally recommended that you create a single partition that covers the whole disk to label as an LVM physical volume"
[https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/LVM_components.html#multiple_partitions]
The LVM is build up on three cornerstone.
- Physical Volume, PV
- Volume Group, VG
- Logical Volume, LV
Prerequisite
Create a new partition with type 0x8E Linux LVM.
$ fdisk -cu /dev/sda
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First sector (205826048-488397167, default 205826048):
Using default value 205826048
Last sector, +sectors or +size{K,M,G} (205826048-488397167, default 488397167): +1G
Command (m for help): t
Partition number (1-4): 3
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 3 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 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
Disk identifier: 0x7f3d8c0f
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 205826047 102400000 8e Linux LVM
/dev/sda3 205826048 207923199 1048576 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 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)
Syncing disks.
$ reboot
The Most Imported Commands
$ man 8 lvm
...
pvcreate - Initialize a disk or partition for use by LVM.
pvdisplay - Display attributes of a Physical Volume.
...
vgcreate - Create a Volume Group.
vgdisplay - Display attributes of Volume Groups.
vgextend - Add Physical Volumes to a Volume Group.
vgreduce - Reduce a Volume Group by removing one or more Physical Volumes.
...
lvcreate - Create a Logical Volume in an existing Volume Group.
lvdisplay - Display attributes of a Logical Volume.
lvextend - Extend the size of a Logical Volume.
lvreduce - Reduce the size of a Logical Volume.
Create Physical Volume (PV), Volumme Group (VG) and Logical Volume (LV)
First lets create a new physical volume on the prerequisite partition.
$ pvcreate /dev/sda3
Create volume group vg_test that span entire physical volume /dev/sda3
$ vgcreate vg_test /dev/sda3
Volume group "vg_test" successfully created
Create logical volumne with size 500 MB, named lv_test in volume group vg_test.
$ lvcreate -L 500M -n lv_test vg_test
The lvcreate will now create a device block file in /dev/vgName/lvName that we now can create a filesystem on and mount.
$ mkfs -t ext4 /dev/vg_test/lv_test
$ mkdir /data
$ mount /dev/vg_test/lv_test /data
Extends Logical Volume (LV)
Extend the logical volume lv_test with plus 500 MB.
$ lvextend -L +250M /dev/vg_test/lv_test
Rounding size to boundary between physical extents: 252.00 MiB
Extending logical volume lv_test to 752.00 MiB
Logical volume lv_test successfully resized
Now you need to grow the file system.
$ resize2fs -p /dev/vg_test/lv_test
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg_test/lv_test is mounted on /data; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 3
Performing an on-line resize of /dev/vg_test/lv_test to 770048 (1k) blocks.
The filesystem on /dev/vg_test/lv_test is now 770048 blocks long.
Verify/test the new size of /data.
$ df -h /data
Reduce Logical Volume (LV)
When reducing a file system, you need to unmount it first.
$ umount /data
Then reduce the actual filesystem.
$ e2fsck -f /dev/vg_test/lv_test
$ resize2fs -p /dev/vg_test/lv_test 512M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vg_test/lv_test to 524288 (1k) blocks.
Begin pass 3 (max = 94)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/vg_test/lv_test is now 524288 blocks long.
After the actual file system is reduced, we can now shrink the logical volume.
$ lvreduce -L 512M /dev/vg_test/lv_test
WARNING: Reducing active logical volume to 512.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_test? [y/n]: y
Reducing logical volume lv_test to 512.00 MiB
Logical volume lv_test successfully resized
Finally test/verify, by remounting and check disk space
$ mount /dev/vg_test/lv_test /data
$ df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_test-lv_test 496M 11M 461M 3% /data
Extends Volume Group (VG)
First create a new physical volume.
$ pvcreate /dev/sda4
Physical volume "/dev/sda4" successfully created
Now lets extends existing volume group 'vg_test' with our new physical volume.
$ vgextend vg_test /dev/sda4
Volume group "vg_test" successfully extended
And last test/verify.
$ vgdisplay vg_test
--- Volume group ---
VG Name vg_test
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 134.73 GiB
PE Size 4.00 MiB
Total PE 34492
Alloc PE / Size 128 / 512.00 MiB
Free PE / Size 34364 / 134.23 GiB
VG UUID ItBewY-gWvu-tzUx-JIEj-gJb2-d8Jh-HdANUb
Reduce Volume Group (VG)
Remove existing volume group 'vg_test' with physical volume /dev/sda4.
$ vgreduce vg_test /dev/sda4
Removed "/dev/sda4" from volume group "vg_test"
Test/verify
$ vgdisplay vg_test
--- Volume group ---
VG Name vg_test
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1020.00 MiB
PE Size 4.00 MiB
Total PE 255
Alloc PE / Size 128 / 512.00 MiB
Free PE / Size 127 / 508.00 MiB
VG UUID ItBewY-gWvu-tzUx-JIEj-gJb2-d8Jh-HdANUb
Reference
- lvm(8): lvm - LVM2 tools
- pvcreate(8): pvcreate - initialize a disk or partition for use by LVM
- vgcreate(8): vgcreate - create a volume group
- lvcreate(8): lvcreate - create a logical volume in an existing volume group
- vgextend(8): vgextend - add physical volumes to a volume group
- vgreduce(8): vgreduce - reduce a volume group
- lvextend(8): lvextend - extend the size of a logical volume
- lvreduce(8): lvreduce - reduce the size of a logical volume
- resize2fs(8): resize2fs - ext2/ext3/ext4 file system resizer