====== Logical Volume Management (LVM) ====== **General Information** LVM provides a way to create virtual disks and containers in order to provide flexibility with parition sizes and extending/shrinking space without shutting a system down. **Checklist** * Distro(s): Any * Other: The hard disk being formatted is not in use/blank. These steps will erase all data on the target disk. ---- ====== Expanding or New ====== Whether expanding or creating new storage, the summarized steps are: * Add virtual disk to VM * Scan SCSI Bus (if needed) * Format the Disk with a partition * Create physical volume using the new disk's partition ---- ===== Add/Expand Disk ===== Add or expand the disk to the system either physically or virtually if a VM. ---- ==== Add Disk: Scan SCSI Bus ==== If adding a disk to a virtual machine and the new disk does not show up: \\ **One Liner Method**echo "- - -" > /sys/class/scsi_host/$(grep mpt /sys/class/scsi_host/host?/proc_name | grep -o -E '(host[0-9])')/scan \\ **Manual Method** * Find the host bus numbergrep mpt /sys/class/scsi_host/host?/proc_name * Example return value:/sys/class/scsi_host/host2/proc_name:mptspi * "host2" is the important value * Used the returned host# to scan the SCSI busecho "- - -" > /sys/class/scsi_host/host#/scan * Example from returned valueecho "- - -" > /sys/class/scsi_host/host2/scan * The hyphens represent controller,channel,lun, so – - – indicates all controllers, all channels, and all luns should be scanned. ==== Expand Disk: Re-Scan SCSI Bus ==== If you have expanded an existing disk, rescan the scsi busecho 1 > /sys/class/scsi_device//rescan Where "" is your disk such as "sda". ---- ===== Format the disk ===== /dev/sdb is used in this example. Use gdisk in order for GPT instead of MBR. (seriously, don't use fdisk...let MBR die already) gdisk /dev/sdb ==== Create a New Empty GUID Partition Table ==== Once in gdisk: * Use option "o" to create a new empty GUID Partition table. (GPT) * "w" to write table entries ==== Create the LVM Partition ==== * Go back into gdisk. (gdisk /dev/sdb) * "n" to create a new partition * Choose the defaults for partition number, start, and end blocks to fill the entire disk * Use code "8e00" for Linux LVM * "w" to write changes and exit ---- ===== Create a Physical Volume ===== About: Think of physical volumes as your "virtual disks" to use in LVM. Create a physical volume using the parition that the LVM is on. pvcreate [device2-path] [deviceX-path] Example: pvcreate /dev/sdb1 ---- **Continue on to either Expanding Storage or Creating New Storage.** ---- ====== Expanding Storage ====== Expanding storage steps. ===== Expand: Summarized Steps ===== To expand storage for a logical volume, the summarized steps are: Performed above in "Expanding or New": * Add virtual disk to VM * Re-Scan SCSI Bus (if needed) * Format the Disk with a partition * Create physical volume using the new disk's partition Remaining Steps: * Extend the volume group using the new physical volume * Extend the logical volume * Verify new LVM layout * Grow the file system * Cleanup (if a pvmove of the logical volume was done to a new disk) * Verify old physical volume is not used * Reduce the volume group by removing the physical volume * Remove the physical volume LVM label * Delete virtual disk from virtual management UI ---- ===== Extend the Volume Group ===== - Add the new physical disk to the existing volume groupvgextend vglocal /dev/sdb1 ---- ===== Extend Logical Volume ===== - Extend the logical volume that needs the space (/home will be used in this example) - **Option 1(Preferred)**: Move the physical extents of the logical volume to the new disk, so all of it resides on the same VMDK, and then use all of that new disk's space. - There may be a performance hit if a logical volume is spanned across multiple VMDKs, so this method is preferred.pvmove --name lvhome /dev/sda2 /dev/sdb1 lvextend --resizefs /dev/vglocal/lvhome /dev/sdb1 - Option 2: Give the logical volume all of the space from the newly added physical volumelvextend --resizefs --extents +100%PVS /dev/vglocal/lvhome /dev/sdb1 - Option 3: Give the logical volume a specific amount of additional free space from a specific physical volumelvextend --resizefs --size +10G /dev/vglocal/lvhome /dev/sdb1 - Option 4: Give the logical volume all of the free space available to the volume group (potentially across multiple physical volumes)lvextend --resizefs --extents +100%FREE /dev/vglocal/lvhome ==== Extending a Logical Swap Volume ==== Extending a swap volume is slightly different, as the "--resizefs" flag will not work. - Example: Specify the total size of the logical swap volumelvextend --size 8G /dev/vglocal/lvswap /dev/sdb1 - Disable all swapswapoff -a - Create a new swap area, overwriting the originalmkswap /dev/vglocal/lvswap - Enable swapswapon -a - Verifyswapon -s ---- ===== Verify New LVM Layout ===== - Verify LVM Allocation - Logical Volume: lvs - Volume Group: vgs - Physical Volumes: pvs **Logical Volume Location(s) on Physical Volumes** If you would like to see what logical volumes reside where, a nice command to view physical extent to logical volume mappings is:pvdisplay -m ---- ===== Grow File System ===== **Skip if you used the "--resizefs" flag to lvextend above.** - Grow the file system - Ext2/3/4resize2fs /dev/vglocal/lvhome - XFSxfs_growfs /dev/vglocal/lvhome - Verify filesystem spacedf -h ---- ===== Cleanup ===== If you have just moved all of the data of a logical volume off of an old physical volume, the old physical volume can go away if it is no longer in use. Examples below: You have just moved everything off of /dev/sdc1 to a new disk and can now remove the old disk (/dev/sdc). ==== Verify Old Physical Volume Not Used ==== pvs -o +pv_used ==== Reduce Volume Group ==== vgreduce vgname olddisk vgreduce vglocal /dev/sdc1 ==== Remove Physical Volume ==== pvremove olddisk pvremove /dev/sdc1 ==== Delete Virtual Disk ==== Login to the virtualization user interface and delete the old disk from inventory. \\ **Errors During LVM Commands** * If you see errors during LVM commands like this after a device delete from vmwareroot@llsrlscd01 home $ pvs /dev/sdc: read failed after 0 of 4096 at 0: Input/output error /dev/sdc: read failed after 0 of 4096 at 17179803648: Input/output error /dev/sdc: read failed after 0 of 4096 at 17179860992: Input/output error /dev/sdc: read failed after 0 of 4096 at 4096: Input/output error /dev/sdc1: read failed after 0 of 4096 at 17178755072: Input/output error /dev/sdc1: read failed after 0 of 4096 at 17178812416: Input/output error /dev/sdc1: read failed after 0 of 4096 at 0: Input/output error /dev/sdc1: read failed after 0 of 4096 at 4096: Input/output error PV VG Fmt Attr PSize PFree /dev/sda2 vglocal lvm2 a-- 19.50g 3.50g /dev/sdd1 vglocal lvm2 a-- 250.00g 0 /dev/sde1 vglocal lvm2 a-- 40.00g 0 * Fix by rebooting the system orecho 1 > /sys/block/sdX/device/delete * Where "sdX" is the device, such as 'sdc' in the above example. ---- ====== Creating New Storage ====== ===== Create New: Summarized Steps ===== To create new storage for a logical volume, the summarized steps are: Performed above in "Expanding or New": * Add virtual disk to VM * Re-Scan SCSI Bus (if needed) * Format the Disk with a partition * Create physical volume using the new disk's partition Remaining Steps: * Create a volume group * Create a logical volume * Create a file system on the logical volume * Mount the logical volume ---- ===== Create a Volume Group ===== About: Volume groups aggregate physical volumes into a usable pool of disk space. vgcreate Example: vgcreate vgstorage /dev/sdb1 ---- ===== Create a Logical Volume ===== About: Logical volumes use the disk space made available via a volume group. lvcreate --size --name Example: Create a 100G logical volume lvcreate --size 100G --name lvbackups vgstorage Example: Create a logical volume that uses 100% of the volume group free extents lvcreate --extents 100%FREE --name lvbackups vgstorage ---- ===== Create the file system on the logical volume ===== About: So far, the only things being created were pretty much containers. Create the actual file system below. mkfs -t -L