First, find out whether your device already supports TRIM
commands.
$ lsblk --discard
Non-zero values in the DISC-GRAN
and DISC-MAX
indicate support. If it looks like your external SSD doesn’t support trimming, then maybe it supports UNMAP
which is equivalent (UNMAP
is just in the SCSI command set vs TRIM
which is in the ATA command set). Assuming your external drive is /dev/sda
# apt install sg3-utils
# sg_vpd -a /dev/sda | grep -i unmap
If the last command has Unmap command supported (LBPU): 1
it means the drive supports the UNMAP
command. If it’s supported, and discard wasn’t supported, it’s likely the kernel didn’t detect the UNMAP
support. You can verify it by reading /sys/block/sda/device/scsi_disk/0\:0\:0\:0/provisioning_mode
$ cat /sys/block/sda/device/scsi_disk/0\:0\:0\:0/provisioning_mode
full
full
means no support. As we know our device supports unmap
we can manually instruct the kernel about it.
# echo "unmap" >/sys/block/sda/device/scsi_disk/0\:0\:0\:0/provisioning_mode
Now, lsblk --discard
should report that the drive supports trimming, and you can use fstrim
to trim it.
Making the change permanent
The changes above are ephemeral and will be reverted once you disconnect the drive. If you want to automatically apply those changes whenever your external drive is connected, we need to use udev rules.
Add the following rule to udev under /etc/udev/rules.d/90-usb-discard.rules
ACTION=="add|change", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="1932", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
Replace idVendor
and idProduct
above with the corresponding values for your device, as can be found in the output of lsusb
.
Reload the udev rules using
# udevadm control --reload