******* UPDATED GUIDE 2024 **********
LVM2 RAID6 with SSD Caching: A Complete Setup Guide
This guide walks you through setting up an LVM2 RAID 6 array with SSD caching, ensuring optimal performance and persistence after system reboots.
Key Terminology
- PV (Physical Volume): Base storage devices (e.g., HDDs, SSDs).
- VG (Volume Group): A pool of PVs used to create LVs.
- LV (Logical Volume): The usable storage, similar to partitions.
- RAID Types: LVM supports RAID levels 0, 1, 4, 5, 6, 10. RAID 6 offers dual parity for better fault tolerance.
This guide assumes:
- 8 HDDs for RAID 6.
- 2 SSDs for a mirrored (RAID 1) cache pool.
- A Linux system with LVM2 installed.
- /dev/sda is the OS
- replace any [b-h] reference with your drive identifiers. Adjust instructions to fit your setup.
Step 1: Install Required Tools
Ensure LVM2 and thin-provisioning-tools are installed (required for cache persistence after reboot on Debian/Ubuntu):
sudo apt-get install lvm2 thin-provisioning-tools
Step 2: Prepare the Drives
-
Clean all drives by removing partitions or existing data:
sudo wipefs -a /dev/sd[b-h] /dev/nvme0n1 /dev/nvme1n1 -
Initialize the HDDs as physical volumes (PVs):
sudo pvcreate /dev/sd[b-h] -
Verify PV creation:
sudo pvscan
Step 3: Create a Volume Group
-
Create a volume group (VG) using the HDDs:
sudo vgcreate Library /dev/sd[b-h] -
Confirm the VG creation:
sudo vgs
Step 4: Create the RAID 6 Logical Volume
-
Create a RAID 6 logical volume (LV):
sudo lvcreate --type raid6 -i 6 -l 100%FREE -n LibraryVolume Library--type: RAID type.-i: Number of data stripes (HDDs minus parity drives).-l: Allocate all available space.-n: Name of the LV.
-
Verify the LV creation:
sudo lvs
Step 5: Add SSDs for Caching
-
Convert SSDs into PVs:
sudo pvcreate /dev/nvme0n1 /dev/nvme1n1 -
Extend the VG to include the SSDs:
sudo vgextend Library /dev/nvme0n1 /dev/nvme1n1
Step 6: Create a Cache Pool
-
Create a mirrored (RAID 1) cache LV:
sudo lvcreate --type raid1 -m 1 -L 225G -n cache1 Library /dev/nvme0n1 /dev/nvme1n1 -
Create the metadata LV for the cache:
sudo lvcreate --type raid1 -m 1 -L 225M -n cache1meta Library /dev/nvme0n1 /dev/nvme1n1 -
Combine the cache and metadata LVs into a cache pool:
sudo lvconvert --type cache-pool --poolmetadata Library/cache1meta Library/cache1 -
Attach the cache pool to the RAID 6 LV:
sudo lvconvert --type cache --cachepool Library/cache1 --cachemode writethrough Library/LibraryVolumewritethrough: Writes data to both the cache and RAID simultaneously (default, safer).writeback: Writes data to the cache first for better performance (riskier).
Step 7: Format and Mount the Logical Volume
-
Format the LV with your desired filesystem:
sudo mkfs.ext4 /dev/Library/LibraryVolume -
Mount the volume:
sudo mkdir /mnt/Library sudo mount /dev/Library/LibraryVolume /mnt/Library -
Add the LV to
/etc/fstabfor automatic mounting:echo "/dev/Library/LibraryVolume /mnt/Library ext4 defaults 0 2" | sudo tee -a /etc/fstab
Step 8: Verify the Setup
-
Check the disk layout:
lsblk -
Example output:
NAME SIZE TYPE MOUNTPOINT ... LibraryVolume 21.9T lvm /mnt/Library ...
Best Practices
-
Monitor your setup using:
sudo lvs sudo vgs sudo pvs -
Backup critical data, especially when using
writebackmode. -
Use tools like
iotoporiostatto monitor I/O performance.
By following this guide, you can set up an efficient and persistent LVM2 RAID 6 array with SSD caching, leveraging the latest tools and best practices for data safety and performance.
Here is an example of lsblk after I set it up all those years ago. You will notice that my array includes /dev/sda. This is because at the time my OS lived on /dev/sdi.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3.7T 0 disk
└─sda1 8:1 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_0 253:0 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_0 253:1 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdb 8:16 0 3.7T 0 disk
└─sdb1 8:17 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_1 253:2 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_1 253:3 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdc 8:32 0 3.7T 0 disk
└─sdc1 8:33 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_2 253:4 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_2 253:5 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdd 8:48 0 3.7T 0 disk
└─sdd1 8:49 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_3 253:6 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_3 253:7 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sde 8:64 0 3.7T 0 disk
└─sde1 8:65 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_4 253:8 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_4 253:9 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdf 8:80 0 3.7T 0 disk
└─sdf1 8:81 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_5 253:10 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_5 253:11 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdg 8:96 0 3.7T 0 disk
└─sdg1 8:97 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_6 253:12 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_6 253:13 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdh 8:112 0 3.7T 0 disk
└─sdh1 8:113 0 3.7T 0 part
├─Library-LibraryVolumeLMV_corig_rmeta_7 253:14 0 4M 0 lvm
│ └─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-LibraryVolumeLMV_corig_rimage_7 253:15 0 3.7T 0 lvm
└─Library-LibraryVolumeLMV_corig 253:27 0 21.9T 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
sdi 8:128 0 223.6G 0 disk
└─sdi1 8:129 0 223.6G 0 part /
nvme1n1 259:0 0 238.5G 0 disk
├─Library-cache1_cdata_rmeta_1 253:19 0 4M 0 lvm
│ └─Library-cache1_cdata 253:21 0 225G 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
├─Library-cache1_cdata_rimage_1 253:20 0 225G 0 lvm
│ └─Library-cache1_cdata 253:21 0 225G 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
├─Library-cache1_cmeta_rmeta_1 253:24 0 4M 0 lvm
│ └─Library-cache1_cmeta 253:26 0 228M 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-cache1_cmeta_rimage_1 253:25 0 228M 0 lvm
└─Library-cache1_cmeta 253:26 0 228M 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
nvme0n1 259:1 0 238.5G 0 disk
├─Library-cache1_cdata_rmeta_0 253:17 0 4M 0 lvm
│ └─Library-cache1_cdata 253:21 0 225G 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
├─Library-cache1_cdata_rimage_0 253:18 0 225G 0 lvm
│ └─Library-cache1_cdata 253:21 0 225G 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
├─Library-cache1_cmeta_rmeta_0 253:22 0 4M 0 lvm
│ └─Library-cache1_cmeta 253:26 0 228M 0 lvm
│ └─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
└─Library-cache1_cmeta_rimage_0 253:23 0 228M 0 lvm
└─Library-cache1_cmeta 253:26 0 228M 0 lvm
└─Library-LibraryVolumeLMV 253:16 0 21.9T 0 lvm /mnt/Library
. I try to have a read cache for my iscsi steam library