Skip to content
Back to Blog
Linux

LVM, RAID, and ZFS: Linux Storage Management Guide

Configure LVM volumes, software RAID arrays, and ZFS pools on Linux for redundant, flexible, and high-performance storage.

Oct 2025
15 min read

Introduction

Storage management on Linux involves choosing between LVM (flexible volume management), RAID (redundancy), and ZFS (combined filesystem + volume manager with checksumming). This guide covers each approach with practical examples.

LVM (Logical Volume Manager)

LVM adds a layer of abstraction between physical disks and filesystems, enabling resizing, snapshots, and spanning across multiple disks.

LVM Components

TEXT
Physical Disks → PV (Physical Volume) → VG (Volume Group) → LV (Logical Volume) → Filesystem

Setting Up LVM

BASH
# Create physical volumes
pvcreate /dev/sdb /dev/sdc /dev/sdd

# Create volume group
vgcreate data-vg /dev/sdb /dev/sdc /dev/sdd

# View volume group
vgdisplay data-vg

# Create logical volumes
lvcreate -L 100G -n web-data data-vg
lvcreate -L 50G -n db-data data-vg
lvcreate -l 100%FREE -n backup-data data-vg  # Use all remaining space

# Create filesystems
mkfs.ext4 /dev/data-vg/web-data
mkfs.xfs /dev/data-vg/db-data

# Mount
mount /dev/data-vg/web-data /var/www

Extending LVM

BASH
# Add new disk
pvcreate /dev/sde
vgextend data-vg /dev/sde

# Extend logical volume
lvextend -L +50G /dev/data-vg/web-data

# Resize filesystem (ext4)
resize2fs /dev/data-vg/web-data

# XFS resize (can only grow, not shrink)
xfs_growfs /var/www

# One-liner extend + resize
lvextend -r -L +50G /dev/data-vg/web-data  # -r resizes filesystem automatically

LVM Snapshots

BASH
# Create snapshot (requires space in VG for COW data)
lvcreate -L 10G -s -n web-data-snap /dev/data-vg/web-data

# Mount snapshot read-only
mount -o ro /dev/data-vg/web-data-snap /mnt/snapshot

# Take database backup from snapshot (no locks needed on live data)
mysqldump --all-databases > /backup/mysql-$(date +%Y%m%d).sql

# Remove snapshot when done
umount /mnt/snapshot
lvremove /dev/data-vg/web-data-snap

Linux Software RAID (mdadm)

RAID provides redundancy and/or performance. mdadm manages software RAID in Linux.

RAID Levels

LevelDisksRedundancyReadWrite
RAID 02+NoneFastFast
RAID 121 disk failureFastSame
RAID 53+1 disk failureFastSlower
RAID 64+2 disk failuresFastSlowest
RAID 104+MultipleFastFast

Creating RAID Arrays

BASH
# RAID 1 (mirror)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

# RAID 5
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# RAID 10
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Check rebuild progress
watch cat /proc/mdstat

RAID Maintenance

BASH
# Check array status
mdadm --detail /dev/md0

# Save configuration
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# Mark disk as failed (simulate failure)
mdadm /dev/md0 --fail /dev/sdc

# Remove failed disk
mdadm /dev/md0 --remove /dev/sdc

# Add replacement disk
mdadm /dev/md0 --add /dev/sdf
# Watch rebuild
watch cat /proc/mdstat

ZFS

ZFS is the most sophisticated storage solution — it combines RAID, volume management, compression, deduplication, checksumming, and snapshots in one.

Installing ZFS (Ubuntu)

BASH
apt install zfsutils-linux

Creating ZFS Pools

BASH
# Mirror (RAID 1 equivalent)
zpool create data-pool mirror /dev/sdb /dev/sdc

# RAID-Z1 (RAID 5 equivalent)
zpool create data-pool raidz /dev/sdb /dev/sdc /dev/sdd

# RAID-Z2 (RAID 6 equivalent)
zpool create data-pool raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Check status
zpool status data-pool
zpool list

ZFS Datasets and Features

BASH
# Create datasets (like logical volumes)
zfs create data-pool/web
zfs create data-pool/database
zfs create data-pool/backups

# Enable compression (lz4 is fast, nearly free)
zfs set compression=lz4 data-pool

# Enable deduplication (expensive on RAM — needs 1GB RAM per 1TB data)
zfs set dedup=on data-pool/backups  # Only for backup data

# Set quotas and reservations
zfs set quota=100G data-pool/web
zfs set reservation=20G data-pool/database

ZFS Snapshots

BASH
# Create snapshot
zfs snapshot data-pool/web@before-upgrade

# List snapshots
zfs list -t snapshot

# Rollback to snapshot
zfs rollback data-pool/web@before-upgrade

# Send snapshot to remote server (replication)
zfs send data-pool/web@daily | ssh backup-server "zfs receive backup-pool/web"

# Incremental send
zfs send -i data-pool/web@yesterday data-pool/web@today |   ssh backup-server "zfs receive backup-pool/web"

ZFS Scrub (Data Integrity Check)

BASH
# Start scrub
zpool scrub data-pool

# Check scrub status
zpool status data-pool

# Schedule monthly scrub
echo "0 2 1 * * root /sbin/zpool scrub data-pool" >> /etc/cron.d/zfs-scrub