Logical Volume Management (LVM) is very powerful device mapper framework that provides logical volume management for Linux systems.
In this post I'll just present you the minimal commands that are required to make use of the storage that is added to OS. In my last post, I've written about how to add storage to guest OS running on a VirtualBox. It can be compared to the storage addition done at OS level in companies. Once the storage is provided to the OS (be it a single disk added or a chunk from SAN, etc.,), we will look at how to make the storage available at the Linux OS for usage.
The process will involve the below steps
- Create Linux LVM partition using fdisk
- Create physical volume
- Create Volume group
- Create Logical Volume
- Create file system (ext4 used in this example)
- Mount the FS
- Make the FS mount permanent
Explanation of commands (highlighted lines) used are provided as comment lines prior to the commands in the demo. A few notable result lines are also highlighted.
[root@12r1-rac2 ~]# #check for available File systems [root@12r1-rac2 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 25G 6.0G 18G 26% / tmpfs 2.0G 0 2.0G 0% /dev/shm /dev/sda3 9.8G 5.9G 3.4G 64% /u01 /dev/sda2 12G 4.9G 6.3G 44% /u02 Oracle 500G 267G 234G 54% /media/sf_Oracle [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #List disks available, o/p truncated for better viewing [root@12r1-rac2 ~]# fdisk -l Disk /dev/sdd: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x5f998c79 Device Boot Start End Blocks Id System /dev/sdd1 1 652 5237158+ 83 Linux ... ... ... Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00056a91 Device Boot Start End Blocks Id System /dev/sda1 * 1 3264 26214400 83 Linux /dev/sda2 3264 4830 12579840 83 Linux /dev/sda3 4830 6136 10485760 83 Linux /dev/sda4 6136 6528 3147776 5 Extended /dev/sda5 6136 6528 3145728 82 Linux swap / Solaris Disk /dev/sde: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xf306e413 Device Boot Start End Blocks Id System /dev/sde1 1 652 5237158+ 83 Linux Disk /dev/sdf: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x9e53da19 Device Boot Start End Blocks Id System [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Format the newly added disk. [root@12r1-rac2 ~]# #I'm creating 2 primary partitions with 15GB each in total of 30GB disk [root@12r1-rac2 ~]# #Using n,p,1,1,+15G,n,p,2(default),1960(default),3916(default),w as input [root@12r1-rac2 ~]# #This step can be skipped if you want to partition while initializing using pvcreate [root@12r1-rac2 /]# fdisk /dev/sdf 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): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-3916, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): +15G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (1960-3916, default 1960): Using default value 1960 Last cylinder, +cylinders or +size{K,M,G} (1960-3916, default 3916): Using default value 3916 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@12r1-rac2 /]# [root@12r1-rac2 ~]# #List the available disks. Newly created disks are visible, o/p truncated for better viewing [root@12r1-rac2 ~]# fdisk -l Disk /dev/sdd: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x5f998c79 Device Boot Start End Blocks Id System /dev/sdd1 1 652 5237158+ 83 Linux Disk /dev/sdc: 5368 MB, 5368709120 bytes ... ... ... /dev/sda3 4830 6136 10485760 83 Linux /dev/sda4 6136 6528 3147776 5 Extended /dev/sda5 6136 6528 3145728 82 Linux swap / Solaris Disk /dev/sde: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xf306e413 Device Boot Start End Blocks Id System /dev/sde1 1 652 5237158+ 83 Linux Disk /dev/sdf: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x9e53da19 Device Boot Start End Blocks Id System /dev/sdf1 1 1959 15735636 83 Linux /dev/sdf2 1960 3916 15719602+ 83 Linux [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Change the partition type of /dev/sdf1, /dev/sdf2 to Linux LVM [root@12r1-rac2 ~]# #Using t,1,8e,t,2,8e,w as input [root@12r1-rac2 ~]# fdisk /dev/sdf 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): t Partition number (1-4): 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): 8e Changed system type of partition 2 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #List the available disks, o/p truncated for better viewing [root@12r1-rac2 ~]# fdisk -l Disk /dev/sdd: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x5f998c79 Device Boot Start End Blocks Id System /dev/sdd1 1 652 5237158+ 83 Linux Disk /dev/sdc: 5368 MB, 5368709120 bytes ... ... ... Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xf306e413 Device Boot Start End Blocks Id System /dev/sde1 1 652 5237158+ 83 Linux Disk /dev/sdf: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x9e53da19 Device Boot Start End Blocks Id System /dev/sdf1 1 1959 15735636 8e Linux LVM /dev/sdf2 1960 3916 15719602+ 8e Linux LVM [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Currently LVM is not configured in the system and hence no o/p for the below 3 commands [root@12r1-rac2 ~]# pvs [root@12r1-rac2 ~]# vgs [root@12r1-rac2 ~]# lvs [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Create physical volumes using available disks. (also used to format block device if not formatted already) [root@12r1-rac2 ~]# pvcreate /dev/sdf1 /dev/sdf2 Physical volume "/dev/sdf1" successfully created Physical volume "/dev/sdf2" successfully created [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #List the physical volumes, you can use 'pvdisplay' command to view detailed information [root@12r1-rac2 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdf1 lvm2 --- 15.01g 15.01g /dev/sdf2 lvm2 --- 14.99g 14.99g [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Create Volume Group (named vg18c) using the available PVs [root@12r1-rac2 ~]# vgcreate vg18c /dev/sdf1 /dev/sdf2 Volume group "vg18c" successfully created [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #List available VGs, #PV denotes 2 PVs associated with this VG. [root@12r1-rac2 ~]# #Use 'vgdisplay' command to view detailed information [root@12r1-rac2 ~]# vgs VG #PV #LV #SN Attr VSize VFree vg18c 2 0 0 wz--n- 29.99g 29.99g [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Create Logical Volume from the available VG [root@12r1-rac2 ~]# # -L is size and -n is name. Last variable is the VG, the LV will be created from. [root@12r1-rac2 ~]# lvcreate -L 12G -n 18cgrid vg18c Logical volume "18cgrid" created. [root@12r1-rac2 ~]# lvcreate -L 12G -n 18cdb vg18c Logical volume "18cdb" created. [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #List the LVs. Use 'lvdisplay' to view detailed information [root@12r1-rac2 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert 18cdb vg18c -wi-a----- 12.00g 18cgrid vg18c -wi-a----- 12.00g [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Now create File system of type ext4 with the available LV using mkfs command [root@12r1-rac2 ~]# mkfs -t ext4 /dev/vg18c/18cdb mke2fs 1.43-WIP (20-Jun-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 786432 inodes, 3145728 blocks 157286 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=3221225472 96 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done [root@12r1-rac2 ~]# mkfs -t ext4 /dev/vg18c/18cgrid mke2fs 1.43-WIP (20-Jun-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 786432 inodes, 3145728 blocks 157286 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=3221225472 96 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# mkdir /oradir1 /oradir2 [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Mount the FS using mount command [root@12r1-rac2 ~]# mount /dev/vg18c/18cgrid /oradir1 [root@12r1-rac2 ~]# mount /dev/vg18c/18cdb /oradir2 [root@12r1-rac2 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 25G 6.0G 18G 26% / tmpfs 2.0G 629M 1.4G 32% /dev/shm /dev/sda3 9.8G 5.9G 3.4G 64% /u01 /dev/sda2 12G 4.9G 6.3G 44% /u02 Oracle 500G 267G 234G 54% /media/sf_Oracle /dev/mapper/vg18c-18cgrid 12G 30M 12G 1% /oradir1 /dev/mapper/vg18c-18cdb 12G 30M 12G 1% /oradir2 [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# #Edit the fstab to make the mount permanent across reboots. [root@12r1-rac2 ~]# vi /etc/fstab [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# [root@12r1-rac2 ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Tue Oct 20 01:50:26 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=b149969c-329d-48d7-ace0-ea7ac6671964 / ext4 defaults 1 1 UUID=aa9b0bed-4eab-407d-8c0f-c2739a7678fb /u01 ext4 defaults 1 2 UUID=2ab60579-5059-4c1e-9db1-7ac8d9a5ac77 /u02 ext4 defaults 1 2 UUID=6ebf30ec-79d9-4c54-8e44-ce7f47190fdd swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/mapper/vg18c-18cgrid /oradir1 ext4 defaults 0 0 /dev/mapper/vg18c-18cdb /oradir2 ext4 defaults 0 0 [root@12r1-rac2 ~]# [root@12r1-rac2 ~]#
[root@12r1-rac2 /]# #Make sure to umount the file system. [root@12r1-rac2 /]# umount /dev/mapper/vg18c-18cgrid [root@12r1-rac2 /]# umount /dev/mapper/vg18c-18cdb [root@12r1-rac2 /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 25G 5.1G 19G 22% / tmpfs 2.0G 633M 1.4G 32% /dev/shm /dev/sda3 9.8G 5.9G 3.4G 64% /u01 /dev/sda2 12G 4.9G 6.3G 44% /u02 Oracle 500G 268G 233G 54% /media/sf_Oracle [root@12r1-rac2 /]# [root@12r1-rac2 /]# #Remove the logical volume [root@12r1-rac2 /]# lvremove /dev/mapper/vg18c-18cgrid Do you really want to remove active logical volume 18cgrid? [y/n]: y Logical volume "18cgrid" successfully removed [root@12r1-rac2 /]# lvremove /dev/mapper/vg18c-18cdb Do you really want to remove active logical volume 18cdb? [y/n]: y Logical volume "18cdb" successfully removed [root@12r1-rac2 /]# [root@12r1-rac2 /]# [root@12r1-rac2 /]# #Remove the volume group [root@12r1-rac2 /]# vgremove vg18c Volume group "vg18c" successfully removed [root@12r1-rac2 /]# [root@12r1-rac2 /]# [root@12r1-rac2 /]# #Remove the Physical volumes created [root@12r1-rac2 /]# pvremove /dev/sdf1 /dev/sdf2 Labels on physical volume "/dev/sdf1" successfully wiped Labels on physical volume "/dev/sdf2" successfully wiped [root@12r1-rac2 /]# [root@12r1-rac2 /]#