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) → FilesystemSetting 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/wwwExtending 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 automaticallyLVM 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-snapLinux Software RAID (mdadm)
RAID provides redundancy and/or performance. mdadm manages software RAID in Linux.
RAID Levels
| Level | Disks | Redundancy | Read | Write |
|---|---|---|---|---|
| RAID 0 | 2+ | None | Fast | Fast |
| RAID 1 | 2 | 1 disk failure | Fast | Same |
| RAID 5 | 3+ | 1 disk failure | Fast | Slower |
| RAID 6 | 4+ | 2 disk failures | Fast | Slowest |
| RAID 10 | 4+ | Multiple | Fast | Fast |
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/mdstatRAID 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/mdstatZFS
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-linuxCreating 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 listZFS 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/databaseZFS 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