16. Storage Management
Learning Objectives
- LVM (Logical Volume Manager) configuration and management
- Understanding and configuring RAID levels
- Filesystem selection and optimization
- Disk encryption with LUKS
Table of Contents
- Storage Fundamentals
- LVM
- RAID
- Filesystems
- Disk Encryption
- Monitoring and Maintenance
- Practice Exercises
1. Storage Fundamentals
1.1 Storage Layers
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Storage Layer Structure β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Application β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β VFS (Virtual File System) β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β Filesystem (ext4, XFS, Btrfs) β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β Block Device (LVM, RAID, LUKS) β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β Disk Driver β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β Physical Disk (HDD, SSD, NVMe) β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Block device list
lsblk
lsblk -f # Include filesystem
# Detailed disk information
fdisk -l
parted -l
# SMART information (disk health)
smartctl -a /dev/sda
# Disk UUIDs
blkid
# Disk usage
df -h
df -i # inode usage
1.3 Partition Management
# fdisk (MBR)
fdisk /dev/sdb
# n - new partition
# d - delete partition
# p - print partition table
# w - write and exit
# parted (GPT recommended)
parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 50%
(parted) mkpart primary ext4 50% 100%
(parted) print
(parted) quit
# gdisk (GPT)
gdisk /dev/sdb
2. LVM
2.1 LVM Concept
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LVM Structure β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Logical Volume (LV) β
β βββββββββββ βββββββββββ βββββββββββ β
β β lv1 β β lv2 β β lv3 β β Create filesystem β
β β (root) β β (home) β β (data) β β
β βββββββββββ΄ββββββββββ΄ββββββββββ β
β β β
β βΌ β
β Volume Group (VG) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β vg0 β β
β β β Combine multiple PVs β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β Physical Volume (PV) β
β βββββββββββ βββββββββββ βββββββββββ β
β β /dev/ β β /dev/ β β /dev/ β β Physical disks β
β β sda1 β β sdb1 β β sdc1 β β
β βββββββββββ βββββββββββ βββββββββββ β
β β
β Advantages: β
β β’ Dynamic volume resizing β
β β’ Combine multiple disks β
β β’ Snapshot support β
β β’ Online expansion β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.2 Creating LVM
# 1. Create Physical Volume (PV)
pvcreate /dev/sdb1
pvcreate /dev/sdc1
# Check PV
pvs
pvdisplay /dev/sdb1
# 2. Create Volume Group (VG)
vgcreate vg_data /dev/sdb1 /dev/sdc1
# Check VG
vgs
vgdisplay vg_data
# 3. Create Logical Volume (LV)
lvcreate -L 10G -n lv_home vg_data
lvcreate -l 100%FREE -n lv_data vg_data # Use all remaining space
# Check LV
lvs
lvdisplay /dev/vg_data/lv_home
# 4. Create filesystem and mount
mkfs.ext4 /dev/vg_data/lv_home
mkdir /mnt/home
mount /dev/vg_data/lv_home /mnt/home
# Add to /etc/fstab
echo '/dev/vg_data/lv_home /home ext4 defaults 0 2' >> /etc/fstab
2.3 Extending LVM
# Add new disk to VG
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1
# Extend LV
lvextend -L +5G /dev/vg_data/lv_home
# Or use all free space
lvextend -l +100%FREE /dev/vg_data/lv_home
# Extend filesystem
# ext4
resize2fs /dev/vg_data/lv_home
# XFS (grow only)
xfs_growfs /mnt/home
# Extend LV + filesystem together
lvextend -r -L +5G /dev/vg_data/lv_home
2.4 Shrinking LVM
# β οΈ Warning: Backup data first!
# Shrink ext4 (unmount required)
umount /mnt/home
e2fsck -f /dev/vg_data/lv_home
resize2fs /dev/vg_data/lv_home 8G
lvreduce -L 8G /dev/vg_data/lv_home
mount /dev/vg_data/lv_home /mnt/home
# XFS cannot be shrunk!
2.5 LVM Snapshots
# Create snapshot
lvcreate -L 1G -s -n snap_home /dev/vg_data/lv_home
# Check snapshot
lvs
lvdisplay /dev/vg_data/snap_home
# Mount snapshot (verify before restore)
mount -o ro /dev/vg_data/snap_home /mnt/snapshot
# Restore from snapshot
lvconvert --merge /dev/vg_data/snap_home
# May require reboot
# Remove snapshot
lvremove /dev/vg_data/snap_home
3. RAID
3.1 RAID Levels
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RAID Level Comparison β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β RAID 0 (Striping) β
β βββββββ¬ββββββ¬ββββββ¬ββββββ β
β β A1 β A2 β A3 β A4 β Pros: Best performance β
β β B1 β B2 β B3 β B4 β Cons: No fault tolerance β
β βββββββ΄ββββββ΄ββββββ΄ββββββ Capacity: 100% β
β Disk1 Disk2 Disk3 Disk4 β
β β
β RAID 1 (Mirroring) β
β βββββββ¬ββββββ β
β β A1 β A1 β Pros: Perfect replication β
β β B1 β B1 β Cons: 50% capacity β
β βββββββ΄ββββββ Capacity: 50% β
β Disk1 Disk2 β
β β
β RAID 5 (Striping + Parity) β
β βββββββ¬ββββββ¬ββββββ β
β β A1 β A2 β Ap β Pros: Performance + fault (1 disk) β
β β B1 β Bp β B2 β Cons: Parity calculation on write β
β β Cp β C1 β C2 β Capacity: (n-1)/n β
β βββββββ΄ββββββ΄ββββββ Minimum 3 disks β
β Disk1 Disk2 Disk3 β
β β
β RAID 6 (Double Parity) β
β βββββββ¬ββββββ¬ββββββ¬ββββββ β
β β A1 β A2 β Ap β Aq β Pros: 2 disk fault tolerance β
β β B1 β Bp β Bq β B2 β Cons: Slower writes β
β βββββββ΄ββββββ΄ββββββ΄ββββββ Capacity: (n-2)/n β
β β
β RAID 10 (1+0, Striped Mirrors) β
β βββββββ¬ββββββ βββββββ¬ββββββ β
β β A1 β A1 β β A2 β A2 β Pros: Performance + reliabilityβ
β β B1 β B1 β β B2 β B2 β Cons: 50% capacity β
β βββββββ΄ββββββ βββββββ΄ββββββ Minimum 4 disks β
β Mirror 1 Mirror 2 β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.2 Configuring RAID with mdadm
# Install mdadm
apt install mdadm
# Create RAID 1
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# Create RAID 5
mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdd1 /dev/sde1 /dev/sdf1
# Create RAID 10
mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1
# Check RAID status
cat /proc/mdstat
mdadm --detail /dev/md0
# Save configuration
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u
# Create filesystem
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/raid
3.3 RAID Management
# Simulate disk failure
mdadm --manage /dev/md0 --fail /dev/sdb1
# Remove failed disk
mdadm --manage /dev/md0 --remove /dev/sdb1
# Add new disk
mdadm --manage /dev/md0 --add /dev/sdk1
# Add spare disk
mdadm --manage /dev/md0 --add-spare /dev/sdl1
# Check rebuild status
cat /proc/mdstat
watch -n 1 cat /proc/mdstat
# Stop/start RAID
mdadm --stop /dev/md0
mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1
3.4 RAID Expansion
# Add disk to RAID 5/6
mdadm --grow /dev/md1 --raid-devices=4 --add /dev/sdm1
# Expand size and filesystem
mdadm --grow /dev/md1 --size=max
resize2fs /dev/md1
4. Filesystems
4.1 Filesystem Comparison
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Filesystem Comparison β
ββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββ€
β β ext4 β XFS β Btrfs β
ββββββββββββββββΌβββββββββββββββΌβββββββββββββββΌβββββββββββββββββββ€
β Max Volume β 1 EB β 8 EB β 16 EB β
β Max File β 16 TB β 8 EB β 16 EB β
β Journaling β Yes β Yes β CoW β
β Online Grow β Yes β Yes β Yes β
β Online Shrinkβ No β No β Yes β
β Snapshots β (LVM) β (LVM) β Yes (native) β
β Compression β No β No β Yes β
β Checksums β Metadata β No β Yes (all) β
β Best For β General/Bootβ Large/DB β NAS/Snapshots β
ββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββ
4.2 ext4 Management
# Create
mkfs.ext4 /dev/sdb1
mkfs.ext4 -L "DATA" /dev/sdb1 # With label
# Create with options
mkfs.ext4 -b 4096 -i 16384 -O ^has_journal /dev/sdb1
# Check information
tune2fs -l /dev/sdb1
# Change settings
tune2fs -L "NEW_LABEL" /dev/sdb1 # Label
tune2fs -c 30 /dev/sdb1 # fsck after 30 mounts
tune2fs -i 1m /dev/sdb1 # fsck after 1 month
tune2fs -O ^has_journal /dev/sdb1 # Disable journal
# Filesystem check
e2fsck -f /dev/sdb1
e2fsck -p /dev/sdb1 # Auto-fix
# Defragment (online)
e4defrag /dev/sdb1
4.3 XFS Management
# Create
mkfs.xfs /dev/sdb1
mkfs.xfs -L "DATA" -f /dev/sdb1
# Check information
xfs_info /dev/sdb1
xfs_info /mnt/data # If mounted
# Change label
xfs_admin -L "NEW_LABEL" /dev/sdb1
# Grow filesystem (online)
xfs_growfs /mnt/data
# Filesystem check (unmount required)
xfs_repair /dev/sdb1
xfs_repair -n /dev/sdb1 # Check only
# Defragment (online)
xfs_fsr /mnt/data
4.4 Btrfs Management
# Create
mkfs.btrfs /dev/sdb1
mkfs.btrfs -L "DATA" -m raid1 -d raid1 /dev/sdb1 /dev/sdc1
# Check information
btrfs filesystem show
btrfs filesystem df /mnt/btrfs
# Create subvolume
btrfs subvolume create /mnt/btrfs/subvol1
# Snapshot
btrfs subvolume snapshot /mnt/btrfs/subvol1 /mnt/btrfs/snap1
btrfs subvolume snapshot -r /mnt/btrfs/subvol1 /mnt/btrfs/snap_ro # Read-only
# List subvolumes
btrfs subvolume list /mnt/btrfs
# Delete snapshot
btrfs subvolume delete /mnt/btrfs/snap1
# Enable compression
mount -o compress=zstd /dev/sdb1 /mnt/btrfs
# Add disk
btrfs device add /dev/sdd1 /mnt/btrfs
btrfs balance start /mnt/btrfs
# Scrub (data integrity check)
btrfs scrub start /mnt/btrfs
btrfs scrub status /mnt/btrfs
5. Disk Encryption
5.1 LUKS Encryption
# Create LUKS volume
cryptsetup luksFormat /dev/sdb1
# Enter passphrase
# Open LUKS
cryptsetup open /dev/sdb1 encrypted_disk
# Creates /dev/mapper/encrypted_disk
# Create filesystem
mkfs.ext4 /dev/mapper/encrypted_disk
# Mount
mount /dev/mapper/encrypted_disk /mnt/encrypted
# Unmount and close
umount /mnt/encrypted
cryptsetup close encrypted_disk
5.2 LUKS Management
# LUKS information
cryptsetup luksDump /dev/sdb1
# Add key (max 8)
cryptsetup luksAddKey /dev/sdb1
# Remove key
cryptsetup luksRemoveKey /dev/sdb1
# Use key file
dd if=/dev/urandom of=/root/keyfile bs=1024 count=4
chmod 400 /root/keyfile
cryptsetup luksAddKey /dev/sdb1 /root/keyfile
# Open with key file
cryptsetup open /dev/sdb1 encrypted_disk --key-file /root/keyfile
5.3 Auto-mount on Boot
# /etc/crypttab
# <name> <device> <key file> <options>
encrypted_disk /dev/sdb1 /root/keyfile luks
# /etc/fstab
/dev/mapper/encrypted_disk /mnt/encrypted ext4 defaults 0 2
5.4 LUKS + LVM
# Create encrypted PV
cryptsetup luksFormat /dev/sdb1
cryptsetup open /dev/sdb1 crypt_pv
# Configure LVM
pvcreate /dev/mapper/crypt_pv
vgcreate vg_encrypted /dev/mapper/crypt_pv
lvcreate -l 100%FREE -n lv_data vg_encrypted
# Filesystem
mkfs.ext4 /dev/vg_encrypted/lv_data
6. Monitoring and Maintenance
6.1 Disk Status Monitoring
# SMART monitoring
smartctl -H /dev/sda # Health status
smartctl -a /dev/sda # Full information
smartctl -t short /dev/sda # Short test
smartctl -l selftest /dev/sda # Test results
# smartd daemon configuration
# /etc/smartd.conf
/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03)
# Daily 2am short test | Saturday 3am long test
# I/O statistics
iostat -x 1
# Disk queue
cat /sys/block/sda/queue/nr_requests
6.2 Filesystem Maintenance
# Regular check (ext4)
tune2fs -c 30 /dev/sda1 # fsck after 30 mounts
tune2fs -i 1m /dev/sda1 # fsck every month
# Reserved blocks (ext4)
tune2fs -m 1 /dev/sda1 # Reduce to 1% (default 5%)
# TRIM (SSD)
fstrim -v / # Manual TRIM
systemctl enable fstrim.timer # Periodic TRIM
# Disk usage analysis
du -sh /*
ncdu /
6.3 Backup Strategy
# Full disk backup with dd
dd if=/dev/sda of=/backup/sda.img bs=64M status=progress
# Compressed backup
dd if=/dev/sda bs=64M | gzip > /backup/sda.img.gz
# Clone partition
dd if=/dev/sda1 of=/dev/sdb1 bs=64M status=progress
# File backup with rsync
rsync -avz --delete /data/ /backup/data/
# Consistent backup with LVM snapshot
lvcreate -L 1G -s -n snap_backup /dev/vg/lv_data
mount -o ro /dev/vg/snap_backup /mnt/snap
rsync -avz /mnt/snap/ /backup/
umount /mnt/snap
lvremove -f /dev/vg/snap_backup
7. Practice Exercises
Exercise 1: LVM Configuration
# Requirements:
# 1. Create VG from 2 disks
# 2. Create 3 LVs (root 20G, home 50G, data remaining)
# 3. Format as ext4, xfs, ext4 respectively
# 4. Configure permanent mount in fstab
# Write commands:
Exercise 2: RAID 5 Configuration
# Requirements:
# 1. Configure RAID 5 with 4 disks
# 2. Set 1 as spare
# 3. Simulate failure and recovery
# Write commands:
Exercise 3: Encrypted LVM
# Requirements:
# 1. Encrypt disk with LUKS
# 2. Configure LVM on encrypted volume
# 3. Auto-mount on boot (using key file)
# Write configuration files and commands:
Exercise 4: Btrfs Snapshot Management
# Requirements:
# 1. Create Btrfs volume
# 2. Design subvolume structure
# 3. Establish snapshot policy (daily, weekly)
# 4. Test restore from snapshot
# Write script:
Next Steps
References
β Previous: Container Internals | Table of Contents