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
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 |
• 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
Essential LVM Commands
Manage physical disks and partitions for LVM.
# 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
Create and manage storage pools from physical volumes.
# 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
Create and manage flexible logical volumes.
# 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
Create point-in-time copies for backup and testing.
# 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
Overcommit storage with thin pools and volumes.
# 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"
]
}
Integrate LVM with modern infrastructure.
# 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 withvgchange -ay - LV Not Active: Check with
lvdisplay, activate withlvchange -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
vgcfgrestorefrom backup - Missing PV: Use
pvscan,vgreduce --removemissing - Failed Disk: Replace disk, recreate PV, restore from backup
• 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
• 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.