Debian Storage Management & LVM: Complete Administrator's Guide
Effective storage management is crucial for server administration. This comprehensive guide covers Logical Volume Management (LVM), RAID configurations, file system optimization, and advanced storage solutions on Debian servers, providing the knowledge needed to build flexible and reliable storage infrastructure.
Understanding Storage Architecture
Storage Stack Overview
Application Layer
|
File System Layer (ext4, XFS, Btrfs)
|
Volume Management Layer (LVM)
|
RAID Layer (mdadm)
|
Physical Storage Layer (HDD, SSD, NVMe)
Disk Identification
# List all block devices
lsblk -f
# Detailed disk information
sudo fdisk -l
# SMART status for drives
sudo smartctl -a /dev/sda
# List disk by ID
ls -la /dev/disk/by-id/
# List disk by UUID
ls -la /dev/disk/by-uuid/
# Check disk usage
df -h
# Check inode usage
df -i
LVM (Logical Volume Manager) Setup
Installing LVM
# Install LVM tools
sudo apt update
sudo apt install lvm2
# Load device mapper module
sudo modprobe dm-mod
# Verify LVM installation
sudo lvm version
Basic LVM Concepts
- Physical Volume (PV): Physical storage devices
- Volume Group (VG): Pool of physical volumes
- Logical Volume (LV): Virtual partitions created from VG
Creating LVM Setup
# 1. Create Physical Volumes
sudo pvcreate /dev/sdb /dev/sdc
sudo pvs # List physical volumes
sudo pvdisplay # Detailed PV information
# 2. Create Volume Group
sudo vgcreate vg_data /dev/sdb /dev/sdc
sudo vgs # List volume groups
sudo vgdisplay # Detailed VG information
# 3. Create Logical Volumes
sudo lvcreate -L 50G -n lv_web vg_data
sudo lvcreate -L 100G -n lv_database vg_data
sudo lvcreate -l 100%FREE -n lv_backup vg_data
sudo lvs # List logical volumes
sudo lvdisplay # Detailed LV information
# 4. Create File Systems
sudo mkfs.ext4 /dev/vg_data/lv_web
sudo mkfs.xfs /dev/vg_data/lv_database
sudo mkfs.ext4 /dev/vg_data/lv_backup
# 5. Mount Logical Volumes
sudo mkdir -p /mnt/{web,database,backup}
sudo mount /dev/vg_data/lv_web /mnt/web
sudo mount /dev/vg_data/lv_database /mnt/database
sudo mount /dev/vg_data/lv_backup /mnt/backup
# 6. Add to fstab for persistent mounting
echo "/dev/vg_data/lv_web /mnt/web ext4 defaults 0 2" | sudo tee -a /etc/fstab
echo "/dev/vg_data/lv_database /mnt/database xfs defaults 0 2" | sudo tee -a /etc/fstab
echo "/dev/vg_data/lv_backup /mnt/backup ext4 defaults 0 2" | sudo tee -a /etc/fstab
LVM Management Operations
# Extend Logical Volume
sudo lvextend -L +20G /dev/vg_data/lv_web
# OR use all free space
sudo lvextend -l +100%FREE /dev/vg_data/lv_web
# Resize file system
sudo resize2fs /dev/vg_data/lv_web # For ext4
sudo xfs_growfs /mnt/database # For XFS
# Reduce Logical Volume (ext4 only)
sudo umount /mnt/web
sudo e2fsck -f /dev/vg_data/lv_web
sudo resize2fs /dev/vg_data/lv_web 30G
sudo lvreduce -L 30G /dev/vg_data/lv_web
sudo mount /dev/vg_data/lv_web /mnt/web
# Add new disk to Volume Group
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
# Remove disk from Volume Group
sudo pvmove /dev/sdb # Move data off the disk
sudo vgreduce vg_data /dev/sdb
sudo pvremove /dev/sdb
LVM Snapshots
# Create snapshot
sudo lvcreate -L 5G -s -n lv_web_snapshot /dev/vg_data/lv_web
# Mount snapshot
sudo mkdir /mnt/web_snapshot
sudo mount /dev/vg_data/lv_web_snapshot /mnt/web_snapshot
# Restore from snapshot
sudo umount /mnt/web
sudo umount /mnt/web_snapshot
sudo lvconvert --merge /dev/vg_data/lv_web_snapshot
# Remove snapshot
sudo lvremove /dev/vg_data/lv_web_snapshot
LVM Thin Provisioning
# Create thin pool
sudo lvcreate -L 100G --thinpool thin_pool vg_data
# Create thin volumes
sudo lvcreate -V 50G --thin -n thin_web vg_data/thin_pool
sudo lvcreate -V 80G --thin -n thin_database vg_data/thin_pool
# Monitor thin pool usage
sudo lvs -a -o+lv_when_full,thin_percent,thin_pool
RAID Configuration
Software RAID with mdadm
# Install mdadm
sudo apt install mdadm
# Create RAID arrays
# RAID 0 (Striping - No redundancy)
sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
# RAID 1 (Mirroring)
sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
# RAID 5 (Striping with parity)
sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdf /dev/sdg /dev/sdh
# RAID 6 (Striping with double parity)
sudo mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdi /dev/sdj /dev/sdk /dev/sdl
# RAID 10 (Mirrored stripes)
sudo mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdm /dev/sdn /dev/sdo /dev/sdp
# Save RAID configuration
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
RAID Management
# Check RAID status
cat /proc/mdstat
sudo mdadm --detail /dev/md0
# Add spare disk
sudo mdadm --add /dev/md1 /dev/sdq
# Replace failed disk
sudo mdadm --fail /dev/md1 /dev/sdd
sudo mdadm --remove /dev/md1 /dev/sdd
sudo mdadm --add /dev/md1 /dev/sdr
# Monitor RAID
sudo mdadm --monitor --scan --daemonise
# Setup email alerts
sudo nano /etc/mdadm/mdadm.conf
# Add: MAILADDR admin@example.com
LVM on RAID
# Create PV on RAID device
sudo pvcreate /dev/md0
# Create VG on RAID
sudo vgcreate vg_raid /dev/md0
# Create LV on RAID
sudo lvcreate -L 100G -n lv_data vg_raid
File System Management
File System Types
ext4
# Create ext4 filesystem
sudo mkfs.ext4 -L data_volume /dev/vg_data/lv_data
# Tune ext4 parameters
sudo tune2fs -o journal_data_writeback /dev/vg_data/lv_data
sudo tune2fs -O ^has_journal /dev/vg_data/lv_data # Disable journal
sudo tune2fs -O has_journal /dev/vg_data/lv_data # Enable journal
# Check and repair
sudo e2fsck -f /dev/vg_data/lv_data
XFS
# Create XFS filesystem
sudo mkfs.xfs -L data_volume /dev/vg_data/lv_data
# XFS with specific options
sudo mkfs.xfs -f -d agcount=32 -l size=512m /dev/vg_data/lv_data
# Repair XFS
sudo xfs_repair /dev/vg_data/lv_data
# Defragment XFS
sudo xfs_fsr /mnt/data
Btrfs
# Install Btrfs tools
sudo apt install btrfs-progs
# Create Btrfs filesystem
sudo mkfs.btrfs -L data_volume /dev/vg_data/lv_data
# Mount with compression
sudo mount -o compress=zstd /dev/vg_data/lv_data /mnt/data
# Create subvolumes
sudo btrfs subvolume create /mnt/data/documents
sudo btrfs subvolume create /mnt/data/backups
# Create snapshot
sudo btrfs subvolume snapshot /mnt/data/documents /mnt/data/documents_snapshot
# Check filesystem
sudo btrfs check /dev/vg_data/lv_data
File System Performance Tuning
# Mount options for performance
sudo nano /etc/fstab
# SSD optimizations
/dev/vg_data/lv_web /mnt/web ext4 defaults,noatime,discard 0 2
# Database optimizations
/dev/vg_data/lv_database /mnt/database xfs defaults,noatime,nobarrier,logbufs=8 0 2
# Backup optimizations
/dev/vg_data/lv_backup /mnt/backup ext4 defaults,noatime,data=writeback 0 2
Advanced Storage Solutions
NFS Server Setup
# Install NFS server
sudo apt install nfs-kernel-server
# Configure exports
sudo nano /etc/exports
# NFS exports
/mnt/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/mnt/read_only 192.168.1.0/24(ro,sync,no_subtree_check)
# With specific options
/mnt/secure_share 192.168.1.100(rw,sync,no_subtree_check,sec=krb5p)
# Apply exports
sudo exportfs -ra
# Show current exports
sudo exportfs -v
# NFS server status
sudo systemctl status nfs-kernel-server
iSCSI Target Setup
# Install iSCSI target
sudo apt install tgt
# Configure iSCSI target
sudo nano /etc/tgt/conf.d/iscsi.conf
<target iqn.2024-02.com.example:storage.lun1>
backing-store /dev/vg_data/lv_iscsi
initiator-address 192.168.1.0/24
incominguser iscsiuser password
write-cache off
</target>
# Restart service
sudo systemctl restart tgt
# Show targets
sudo tgtadm --mode target --op show
Storage Monitoring Scripts
sudo nano /usr/local/bin/storage-monitor.sh
#!/bin/bash
# Storage Monitoring Script
LOG_FILE="/var/log/storage-monitor.log"
ALERT_EMAIL="admin@example.com"
THRESHOLD_PERCENT=80
echo "[$(date)] Starting storage monitoring" >> "$LOG_FILE"
# Check disk usage
df -h | grep -vE '^Filesystem|tmpfs|udev' | while read line; do
USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
PARTITION=$(echo $line | awk '{print $1}')
MOUNT=$(echo $line | awk '{print $6}')
if [ $USAGE -ge $THRESHOLD_PERCENT ]; then
MESSAGE="WARNING: $MOUNT ($PARTITION) is ${USAGE}% full"
echo "[$(date)] $MESSAGE" >> "$LOG_FILE"
echo "$MESSAGE" | mail -s "Disk Space Alert on $(hostname)" "$ALERT_EMAIL"
fi
done
# Check RAID status
if [ -f /proc/mdstat ]; then
if grep -q "_" /proc/mdstat; then
MESSAGE="CRITICAL: RAID degraded on $(hostname)"
echo "[$(date)] $MESSAGE" >> "$LOG_FILE"
mdadm --detail --scan >> "$LOG_FILE"
echo "$MESSAGE" | mail -s "RAID Alert" "$ALERT_EMAIL"
fi
fi
# Check LVM status
VG_MISSING=$(vgs --noheadings -o vg_missing_pv_count | grep -v "0")
if [ ! -z "$VG_MISSING" ]; then
MESSAGE="CRITICAL: LVM missing physical volumes"
echo "[$(date)] $MESSAGE" >> "$LOG_FILE"
vgs >> "$LOG_FILE"
echo "$MESSAGE" | mail -s "LVM Alert" "$ALERT_EMAIL"
fi
# Check SMART status
for disk in $(ls /dev/sd[a-z]); do
if smartctl -H $disk | grep -q "FAILED"; then
MESSAGE="CRITICAL: SMART failure predicted for $disk"
echo "[$(date)] $MESSAGE" >> "$LOG_FILE"
smartctl -a $disk >> "$LOG_FILE"
echo "$MESSAGE" | mail -s "SMART Alert" "$ALERT_EMAIL"
fi
done
echo "[$(date)] Storage monitoring completed" >> "$LOG_FILE"
Make executable and schedule:
sudo chmod +x /usr/local/bin/storage-monitor.sh
sudo crontab -e
# Add: */30 * * * * /usr/local/bin/storage-monitor.sh
Storage Performance Testing
# Install performance tools
sudo apt install fio hdparm
# Test disk read speed
sudo hdparm -tT /dev/sda
# Comprehensive I/O testing with fio
sudo nano /tmp/fio-test.ini
[global]
ioengine=libaio
direct=1
runtime=60
time_based
group_reporting
[random-read-4k]
rw=randread
bs=4k
numjobs=4
iodepth=32
size=1G
filename=/mnt/test/testfile
[random-write-4k]
rw=randwrite
bs=4k
numjobs=4
iodepth=32
size=1G
filename=/mnt/test/testfile
[sequential-read-1m]
rw=read
bs=1M
numjobs=1
iodepth=8
size=1G
filename=/mnt/test/testfile
[sequential-write-1m]
rw=write
bs=1M
numjobs=1
iodepth=8
size=1G
filename=/mnt/test/testfile
Run test:
sudo fio /tmp/fio-test.ini
Backup Strategies for Storage
LVM Backup Script
sudo nano /usr/local/bin/lvm-backup.sh
#!/bin/bash
# LVM Snapshot Backup Script
BACKUP_DIR="/backup/lvm-snapshots"
VG_NAME="vg_data"
LVS_TO_BACKUP="lv_web lv_database"
SNAPSHOT_SIZE="5G"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
for LV in $LVS_TO_BACKUP; do
echo "Backing up $LV..."
# Create snapshot
SNAPSHOT_NAME="${LV}_snapshot_${DATE}"
lvcreate -L $SNAPSHOT_SIZE -s -n $SNAPSHOT_NAME /dev/$VG_NAME/$LV
# Mount snapshot
MOUNT_POINT="/mnt/$SNAPSHOT_NAME"
mkdir -p $MOUNT_POINT
mount /dev/$VG_NAME/$SNAPSHOT_NAME $MOUNT_POINT
# Backup snapshot
tar -czf "$BACKUP_DIR/${LV}_${DATE}.tar.gz" -C $MOUNT_POINT .
# Cleanup
umount $MOUNT_POINT
rmdir $MOUNT_POINT
lvremove -f /dev/$VG_NAME/$SNAPSHOT_NAME
echo "Backup of $LV completed"
done
# Cleanup old backups (keep 7 days)
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
echo "LVM backup completed"
RAID Array Backup
sudo nano /usr/local/bin/raid-backup-config.sh
#!/bin/bash
# RAID Configuration Backup
BACKUP_DIR="/backup/raid-configs"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Backup RAID configuration
mdadm --detail --scan > "$BACKUP_DIR/mdadm.conf_${DATE}"
# Backup partition tables
for disk in $(ls /dev/sd[a-z]); do
DISK_NAME=$(basename $disk)
sfdisk -d $disk > "$BACKUP_DIR/partition_${DISK_NAME}_${DATE}.txt" 2>/dev/null
done
# Backup LVM configuration
vgcfgbackup -f "$BACKUP_DIR/lvm_backup_${DATE}"
# Create recovery script
cat > "$BACKUP_DIR/recovery_script_${DATE}.sh" << 'EOF'
#!/bin/bash
# RAID Recovery Script
echo "Restoring RAID configuration..."
mdadm --assemble --scan
echo "Restoring LVM..."
vgcfgrestore -f lvm_backup_*
echo "Recovery complete. Please verify and mount filesystems."
EOF
chmod +x "$BACKUP_DIR/recovery_script_${DATE}.sh"
echo "RAID configuration backup completed"
Storage Security
Disk Encryption with LUKS
# Install cryptsetup
sudo apt install cryptsetup
# Create encrypted volume
sudo cryptsetup luksFormat /dev/sdb
# Open encrypted volume
sudo cryptsetup luksOpen /dev/sdb encrypted_disk
# Create filesystem on encrypted volume
sudo mkfs.ext4 /dev/mapper/encrypted_disk
# Mount encrypted volume
sudo mkdir /mnt/encrypted
sudo mount /dev/mapper/encrypted_disk /mnt/encrypted
# Auto-mount at boot (with keyfile)
sudo dd if=/dev/urandom of=/root/keyfile bs=1024 count=4
sudo chmod 0400 /root/keyfile
sudo cryptsetup luksAddKey /dev/sdb /root/keyfile
# Add to /etc/crypttab
echo "encrypted_disk /dev/sdb /root/keyfile luks" | sudo tee -a /etc/crypttab
# Add to /etc/fstab
echo "/dev/mapper/encrypted_disk /mnt/encrypted ext4 defaults 0 2" | sudo tee -a /etc/fstab
Secure Wipe
# Secure wipe with dd
sudo dd if=/dev/urandom of=/dev/sdx bs=4M status=progress
# Using shred
sudo shred -vfz -n 3 /dev/sdx
# Using DBAN alternative
sudo apt install nwipe
sudo nwipe /dev/sdx
Troubleshooting Storage Issues
Common Issues and Solutions
LVM Issues
# Missing physical volume
sudo vgreduce --removemissing vg_data
# Corrupted metadata
sudo vgcfgrestore vg_data
# Cannot remove LV (device busy)
sudo fuser -km /mnt/mountpoint
sudo umount /mnt/mountpoint
sudo lvremove /dev/vg_data/lv_name
RAID Issues
# Rebuild RAID array
sudo mdadm --assemble --scan
# Force assembly
sudo mdadm --assemble --force /dev/md0 /dev/sd[bcd]
# Clear superblock
sudo mdadm --zero-superblock /dev/sdx
File System Issues
# Force fsck on next reboot
sudo touch /forcefsck
# Repair ext4
sudo e2fsck -fy /dev/vg_data/lv_data
# Repair XFS
sudo xfs_repair -L /dev/vg_data/lv_data
# Check all filesystems
sudo fsck -A
Best Practices
- Regular Monitoring: Implement automated monitoring for disk space, SMART status, and RAID health
- Backup Strategy: Always backup before major storage operations
- Documentation: Document your storage layout and configurations
- Testing: Test recovery procedures regularly
- Capacity Planning: Monitor growth trends and plan ahead
- Performance Baselines: Establish performance baselines for comparison
- Security: Encrypt sensitive data at rest
- Redundancy: Use RAID for critical data
Conclusion
Effective storage management is essential for maintaining reliable and performant Debian servers. This guide provides comprehensive coverage of LVM, RAID, file systems, and advanced storage solutions. Key points to remember:
- LVM provides flexibility for dynamic storage management
- RAID offers redundancy but is not a backup solution
- Choose the right file system for your workload
- Monitor storage health proactively
- Test recovery procedures before you need them
- Document your storage architecture
With proper planning and management, your storage infrastructure can provide years of reliable service.