Enabling SSD TRIM support on Linux can be interesting due to the many storage layers involved. TRIM must be enabled by enabling the relevant discard
option at least at the following levels (if they exist in a configuration):
- mdraid (manually in the case of RAID4/5/6)
- dm-crypt
- LVM
Additionally, the filesystem must either be configured with the discard
to issue TRIM commands automatically after filesystem operations that clear blocks, or a scheduled fstrim
must be performed during a maintenance window. With frequently LVM operations, discard-everything
may be a better choice.
But generally, if a device supports queued TRIM and the implementation is not broken in the SSD firmware, then enabling at the filesystem level as well should be a reasonable approach.
To set up a new SSD in Linux, generally Debian’s SSD Optimization wiki is a good place to start.
Here are some questions about interesting TRIM scenarios that I determined the answers to.
Linux hybrid mdraid, mixing SSD and HDD devices
Can a hybrid RAID be trimmed by the filesystem running on top of it? The long and short answer to this question is: actually, this works fine. The TRIM command is sent only to hardware devices which advertise support for it, so it won’t be sent to the HDD. If trimming the filesystem causes errors, check for TRIM support in other intermediate layers (LVM, dm-crypt, mdraid).
Linux software RAID4/5/6
The raid456 driver cannot apparently automatically query the underlying storage layers to determine whether the device zeroes data blocks that have been discarded, and failing to do this is considered unsafe.
So one must check manually the SSD devices using lsblk -D
for this feature, which is blacklisted for some buggy hardware:
valhalla:~# lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 512B 2G 1
??sda1 0 512B 2G 1
??sda2 0 512B 2G 1
? ??md0 0 512B 2G 1
??sda3 0 512B 2G 1
If the RAID underlying devices (check /proc/mdstat
) all have ones in the DISC-ZERO column, it is safe to enable the module parameter:
parm: devices_handle_discard_safely:Set to Y if all devices in each array reliably return zeroes on reads from discarded regions (bool)
Which is done by adding raid456.devices_handle_discard_safely=1
to one’s kernel command line in the bootloader configuration.
TRIMming all free space on a disk
Once everything is all set up, one may want to TRIM any unused space in case it was previously written to for whatever reason. This is easy to do as long as an LVM physical volume exists over the entire disk. Simply create a logical volume that uses up all the free space, then delete that volume:
lvcreate -l100%FREE -n blkdiscard SSD-VG
lvremove SSD-VG/blkdiscard