When working with SSDs in enterprise Linux environments, we often encounter a storage stack like this:
Physical SSD → md RAID → dm-crypt → LVM → Filesystem
Each layer adds complexity for TRIM operations. Here's how the components interact:
For proper TRIM support across all layers, you'll need:
- Kernel 3.8+ for mdraid TRIM passthrough
- LVM2 2.02.98+ for thin provisioning support
- cryptsetup 1.4.0+ for encrypted volumes
Here's the complete setup procedure:
1. RAID Configuration
# Create RAID array with discard support mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb --assume-clean
2. Encryption Setup
# Add discard flag to crypttab for SSD optimization # /etc/crypttab contents: ssd_crypt /dev/md0 none luks,discard
3. LVM Configuration
# /etc/lvm/lvm.conf modification: devices { issue_discards = 1 }
4. Filesystem Creation
# Create ext4 filesystem with discard option mkfs.ext4 -E discard /dev/vg0/lv_root
For regular maintenance, set up a cron job:
# /etc/cron.daily/fstrim #!/bin/sh /sbin/fstrim -v / /sbin/fstrim -v /boot
Make it executable:
chmod +x /etc/cron.daily/fstrim
Check if TRIM is working through all layers:
# Check filesystem support tune2fs -l /dev/mapper/vg0-lv_root | grep discard # Manually test TRIM fstrim -v /mnt/ssd --verbose
Common issues and solutions:
- TRIM not passing through RAID: Verify kernel version and check
/sys/block/md0/queue/discard_*
- Encryption layer blocking: Ensure
discard
is in crypttab, not fstab - Performance issues: Consider weekly TRIM instead of daily for heavy workloads
For systems without continuous TRIM support:
# Weekly TRIM via systemd timer # /etc/systemd/system/fstrim.timer [Unit] Description=Discard unused blocks once a week [Timer] OnCalendar=weekly AccuracySec=1h Persistent=true [Install] WantedBy=timers.target
When implementing SSD storage in enterprise Linux environments, the TRIM/discard operation becomes particularly challenging when multiple abstraction layers are involved. A typical production setup might look like this:
Physical SSD → md-RAID1 → dm-crypt → LVM → Filesystem
Since Linux kernel 3.8, the MD RAID subsystem gained proper TRIM support. For a complete solution, we need:
- Kernel ≥ 3.8 (3.10+ recommended for best stability)
- mdadm ≥ 3.3
- LVM2 ≥ 2.02.98
Here's how to configure TRIM through all layers:
1. MD RAID Configuration
# Create RAID array with discard support
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb --bitmap=internal --assume-clean
2. Encryption Layer (dm-crypt)
Edit /etc/crypttab
:
ssd_crypt /dev/md0 none luks,discard
3. LVM Configuration
Edit /etc/lvm/lvm.conf
:
devices {
issue_discards = 1
}
4. Filesystem Mount Options
In /etc/fstab
(example for ext4):
/dev/vg0/root / ext4 defaults,noatime 0 1
Create /etc/cron.daily/fstrim
:
#!/bin/sh
/sbin/fstrim -v /
/sbin/fstrim -v /boot
Make executable:
chmod +x /etc/cron.daily/fstrim
To test TRIM is working through all layers:
# Check discard support in each layer
lsblk --discard
# Manually test TRIM
fstrim -v / --verbose
For database workloads, consider these additional optimizations:
# MariaDB InnoDB configuration
innodb_flush_neighbors = 0
innodb_fill_factor = 90
innodb_io_capacity = 2000