LVM Basics - Logical Volume Manager Guide

LVM (Logical Volume Manager) provides flexible storage management for Linux systems. This DevOps-focused guide covers PV, VG, LV management, snapshots, and automation for cloud and container environments. Master storage abstraction and dynamic volume management.

LVM Architecture Overview

Physical Volumes (PV) - /dev/sda1, /dev/sdb1
Volume Groups (VG) - datavg, appvg
Logical Volumes (LV) - /dev/datavg/applv, /dev/datavg/datalv
Filesystems - /mnt/data, /opt/app

LVM Tools Comparison

LVM Component Management Tools Purpose DevOps Use Case
Physical Volumes pvcreate, pvdisplay, pvs Manage physical disks Cloud disk attachment
Volume Groups vgcreate, vgextend, vgs Pool storage resources Storage pooling automation
Logical Volumes lvcreate, lvextend, lvs Create flexible volumes Dynamic volume provisioning
Snapshots lvcreate -s, lvconvert Point-in-time copies Backup and recovery
Thin Provisioning lvcreate --thin, lvconvert Overcommit storage Cost optimization
DevOps Quick Reference:
• Create PV: pvcreate /dev/sdb1
• Create VG: vgcreate datavg /dev/sdb1
• Create LV: lvcreate -L 20G -n applv datavg
• Extend LV: lvextend -L +5G /dev/datavg/applv
• Create snapshot: lvcreate -s -L 5G -n snap01 /dev/datavg/applv
• Thin pool: lvcreate -L 100G --thinpool thinpool datavg
• Resize FS: resize2fs /dev/datavg/applv (ext4)
• Always backup data before LVM operations

LVM Setup Workflow

LVM Creation Process

Prepare Disks
Create PV
Create VG
Create LV
Filesystem
Mount

Essential LVM Commands

Physical Volume Management

Manage physical disks and partitions for LVM.

pvcreate, pvdisplay, pvs, pvremove
# Create physical volume
sudo pvcreate /dev/sdb1
sudo pvcreate /dev/sdc1

# Display PV information
sudo pvdisplay
sudo pvs

# Detailed PV info
sudo pvdisplay /dev/sdb1

# Scan for PVs
sudo pvscan

# Remove PV from VG first
sudo pvmove /dev/sdb1
sudo vgreduce datavg /dev/sdb1
sudo pvremove /dev/sdb1

# Check PV health
sudo pvck /dev/sdb1

# Extend PV (if underlying disk grew)
sudo pvresize /dev/sdb1

# Show PV segments
sudo pvs --segments /dev/sdb1
Volume Group Management

Create and manage storage pools from physical volumes.

vgcreate, vgextend, vgs, vgdisplay
# Create volume group
sudo vgcreate datavg /dev/sdb1 /dev/sdc1

# Display VG information
sudo vgdisplay
sudo vgs

# Extend VG with new PV
sudo vgextend datavg /dev/sdd1

# Reduce VG (remove PV)
sudo vgreduce datavg /dev/sdb1

# Rename VG
sudo vgrename datavg appvg

# Activate/Deactivate VG
sudo vgchange -ay datavg  # Activate
sudo vgchange -an datavg  # Deactivate

# Scan for VGs
sudo vgscan

# Export/Import VG
sudo vgexport datavg
sudo vgimport datavg

# Check VG consistency
sudo vgck datavg
Logical Volume Management

Create and manage flexible logical volumes.

lvcreate, lvextend, lvs, lvdisplay
# Create logical volume
sudo lvcreate -L 20G -n applv datavg

# Create using all free space
sudo lvcreate -l 100%FREE -n datalv datavg

# Display LV information
sudo lvdisplay
sudo lvs

# Extend LV size
sudo lvextend -L +5G /dev/datavg/applv

# Reduce LV size (dangerous!)
sudo lvreduce -L -2G /dev/datavg/applv

# Remove LV
sudo lvremove /dev/datavg/applv

# Rename LV
sudo lvrename datavg applv newapplv

# Activate/Deactivate LV
sudo lvchange -ay /dev/datavg/applv
sudo lvchange -an /dev/datavg/applv

# Check LV health
sudo lvdisplay /dev/datavg/applv

LVM Configuration Guidelines

Environment VG Strategy LV Layout DevOps Recommendation
Web Server Single VG for all disks Separate LVs for /var, /opt Easy scaling, snapshot backups
Database Dedicated VG for data Raw LV for performance No filesystem overhead
Kubernetes VG per storage class Thin LVs for dynamic provisioning StorageClass integration
Cloud VG with multiple cloud disks LVs across availability zones High availability
Container Host VG for Docker/container storage Thin pool for overcommit Storage driver integration

Advanced LVM Features

LVM Snapshots

Create point-in-time copies for backup and testing.

lvcreate -s, lvconvert
# Create snapshot
sudo lvcreate -s -L 5G -n app-snap /dev/datavg/applv

# List snapshots
sudo lvs -o lv_name,origin,snap_percent

# Mount snapshot read-only
sudo mount -o ro /dev/datavg/app-snap /mnt/snapshot

# Restore from snapshot
sudo lvconvert --merge /dev/datavg/app-snap

# Automatic snapshot with cron
#!/bin/bash
sudo lvcreate -s -L 2G -n $(date +%Y%m%d)-backup /dev/datavg/applv

# Monitor snapshot usage
sudo lvs -o lv_name,snap_percent,data_percent

# Remove old snapshots
sudo lvremove /dev/datavg/old-snapshot

# Snapshot best practices:
# - Size appropriately for changes
# - Monitor usage to avoid 100% full
# - Use for consistent backups
# - Test restore procedures
Thin Provisioning

Overcommit storage with thin pools and volumes.

lvcreate --thin, lvconvert
# Create thin pool
sudo lvcreate -L 100G --thinpool thinpool datavg

# Create thin volume
sudo lvcreate -V 50G --thin -n thinvol1 datavg/thinpool

# Extend thin pool
sudo lvextend -L +50G datavg/thinpool

# Monitor thin usage
sudo lvs -o lv_name,data_percent,metadata_percent

# Create thin snapshot
sudo lvcreate -s --thinpool datavg/thinpool -n thin-snap datavg/thinvol1

# Convert existing to thin
sudo lvconvert --type thin datavg/applv

# Thin provisioning tips:
# - Monitor pool usage closely
# - Set alerts for low space
# - Overcommit carefully (1.5-2x typical)
# - Use for dev/test environments

# Docker thin pool setup
sudo lvcreate -L 100G --thinpool docker-thinpool datavg
# /etc/docker/daemon.json:
{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.thinpooldev=/dev/mapper/datavg-docker--thinpool"
  ]
}
LVM in Containers & Cloud

Integrate LVM with modern infrastructure.

Various integration methods
# Kubernetes LVM StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: lvm-fast
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

# LVM CSI Driver (external)
# Install lvm-csi driver for dynamic provisioning

# Docker LVM storage driver
# /etc/docker/daemon.json
{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.directlvm_device=/dev/sdb",
    "dm.thinp_percent=95",
    "dm.thinp_metapercent=1",
    "dm.thinp_autoextend_threshold=80"
  ]
}

# Cloud init for LVM setup
#!/bin/bash
# Auto-configure LVM on cloud instance
pvcreate /dev/sdb
vgcreate datavg /dev/sdb
lvcreate -l 100%FREE -n datalv datavg
mkfs.ext4 /dev/datavg/datalv
mkdir -p /mnt/data
echo '/dev/datavg/datalv /mnt/data ext4 defaults 0 0' >> /etc/fstab
mount -a

# LVM with Ansible automation
- name: Create LVM volume
  lvol:
    vg: datavg
    lv: applv
    size: 20G
    state: present

Practical DevOps Scenarios

Real-World LVM Automation Scripts

# 1. Automated LVM Setup for Cloud
#!/bin/bash
VG_NAME="datavg"
LV_NAME="datalv"
MOUNT_POINT="/mnt/data"
DISKS=("/dev/sdb" "/dev/sdc")

echo "Setting up LVM..."
for disk in "${DISKS[@]}"; do
    # Create partition if needed
    echo -e "n\np\n1\n\n\nt\n8e\nw" | fdisk $disk
    pvcreate "${disk}1"
done

# Create VG with all disks
vgcreate $VG_NAME ${DISKS[@]/%/.1}

# Create LV with all space
lvcreate -l 100%FREE -n $LV_NAME $VG_NAME

# Create filesystem and mount
mkfs.ext4 /dev/$VG_NAME/$LV_NAME
mkdir -p $MOUNT_POINT
echo "/dev/$VG_NAME/$LV_NAME $MOUNT_POINT ext4 defaults 0 0" >> /etc/fstab
mount -a

echo "LVM setup complete"

# 2. LVM Snapshot Backup System
#!/bin/bash
VG_NAME="datavg"
LV_NAME="applv"
SNAP_SIZE="5G"
RETENTION_DAYS=7

# Create snapshot
SNAP_NAME="backup-$(date +%Y%m%d-%H%M%S)"
lvcreate -s -L $SNAP_SIZE -n $SNAP_NAME /dev/$VG_NAME/$LV_NAME

# Backup snapshot to remote
mount -o ro /dev/$VG_NAME/$SNAP_NAME /mnt/snapshot
tar czf /backup/app-$(date +%Y%m%d).tar.gz -C /mnt/snapshot .
umount /mnt/snapshot

# Remove snapshot
lvremove -f /dev/$VG_NAME/$SNAP_NAME

# Cleanup old backups
find /backup -name "app-*.tar.gz" -mtime +$RETENTION_DAYS -delete

# 3. LVM Monitoring and Alerting
#!/bin/bash
THRESHOLD=80

# Check VG free space
VG_FREE=$(vgs --units g --noheadings -o vg_free datavg | sed 's/[^0-9.]//g')
if (( $(echo "$VG_FREE < 10" | bc -l) )); then
    echo "ALERT: Low space in datavg - ${VG_FREE}G remaining"
fi

# Check thin pool usage
THIN_USAGE=$(lvs --noheadings -o data_percent datavg/thinpool | sed 's/[^0-9.]//g')
if (( $(echo "$THIN_USAGE > $THRESHOLD" | bc -l) )); then
    echo "ALERT: Thin pool usage ${THIN_USAGE}% exceeds threshold"
fi

# 4. LVM Extension Automation
#!/bin/bash
VG_NAME="datavg"
LV_NAME="applv"
NEW_DISK="/dev/sdd"

echo "Extending LVM with $NEW_DISK..."
pvcreate $NEW_DISK
vgextend $VG_NAME $NEW_DISK
lvextend -l +100%FREE /dev/$VG_NAME/$LV_NAME
resize2fs /dev/$VG_NAME/$LV_NAME
echo "LVM extension complete"

# 5. LVM Disaster Recovery Prep
#!/bin/bash
VG_NAME="datavg"
BACKUP_DIR="/backup/lvm-config"

mkdir -p $BACKUP_DIR
# Backup LVM metadata
vgcfgbackup $VG_NAME
cp /etc/lvm/backup/$VG_NAME $BACKUP_DIR/

# Backup partition tables
for disk in /dev/sd?; do
    sfdisk -d $disk > $BACKUP_DIR/$(basename $disk).part 2>/dev/null
done

# Backup fstab and mount points
cp /etc/fstab $BACKUP_DIR/
lsblk -f > $BACKUP_DIR/disk-layout.txt

echo "LVM configuration backed up to $BACKUP_DIR"

# 6. LVM Health Check Script
#!/bin/bash
echo "=== LVM Health Check ==="
echo "Physical Volumes:"
pvs
echo -e "\nVolume Groups:"
vgs
echo -e "\nLogical Volumes:"
lvs
echo -e "\nSnapshots:"
lvs -o lv_name,origin,snap_percent | grep snap
echo -e "\nThin Pools:"
lvs -o lv_name,data_percent,metadata_percent | grep thin

Troubleshooting Common LVM Issues

Configuration Problems

  • VG Not Found: Use vgscan, activate with vgchange -ay
  • LV Not Active: Check with lvdisplay, activate with lvchange -ay
  • Snapshot Full: Monitor with lvs -o snap_percent, extend or remove

Performance Issues

  • Slow I/O: Check disk health, consider striped LVs, monitor kernel I/O stats
  • Thin Pool Exhaustion: Monitor usage, extend pool, set up alerts
  • Snapshot Impact: Limit concurrent snapshots, monitor performance

Recovery Scenarios

  • Metadata Corruption: Use vgcfgrestore from backup
  • Missing PV: Use pvscan, vgreduce --removemissing
  • Failed Disk: Replace disk, recreate PV, restore from backup
DevOps Best Practices:
• Always backup LVM metadata with vgcfgbackup
• Monitor thin pool usage to prevent exhaustion
• Use snapshots for consistent application backups
• Test LVM recovery procedures regularly
• Document VG/LV layouts and dependencies
• Set up monitoring for LV usage and growth
• Use meaningful names for VGs and LVs
• Consider performance implications of snapshot counts
Performance Tips:
• Use striped LVs across multiple PVs for better performance
• Place metadata on fast storage for thin pools
• Monitor iostat for disk performance issues
• Consider LVM cache for frequently accessed data
• Use appropriate filesystem options for your workload
• Test snapshot performance impact before production use
• Regular filesystem checks and defragmentation

Key DevOps Takeaways

LVM provides powerful storage abstraction that's essential for modern DevOps environments. By mastering PV, VG, and LV management, you can create flexible, scalable storage solutions that integrate seamlessly with containers, cloud platforms, and automation tools. Remember that while LVM offers great flexibility, it also requires careful monitoring and management to prevent issues.

Next Step: Explore advanced LVM topics like LVM caching, RAID integration, LVM with encryption, and automated LVM provisioning with tools like Terraform and Ansible.