![USB 连接的 SSD 上的 TRIM 支持](https://linux22.com/image/1596591/USB%20%E8%BF%9E%E6%8E%A5%E7%9A%84%20SSD%20%E4%B8%8A%E7%9A%84%20TRIM%20%E6%94%AF%E6%8C%81.png)
我有一个通过 USB-SATA 适配器连接的 SSD(三星 860 EVO)(我尝试了两者这个和这个) 到 ARM 计算机 (Odroid N2) 运行 Armbian(Linux 4.9.180)。
我使用 LVM 对其进行了分区(简单设置:单个 PV、VG 和 LV;无加密)。但是当我挂载它时,我在 dmesg 中收到此警告:
[87990.092895] EXT4-fs (dm-0): mounting with "discard" option, but the device does not support discard
并且 fstrim 失败:
# fstrim /var/lib/postgresql
fstrim: /var/lib/postgresql: the discard operation is not supported
我检查了一下,hdpart 表明硬件应该支持 TRIM:
# hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
lsusb 和 dmesg 确认这是一个 UAS/SCSI 设备:
# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 3: Dev 5, If 0, Class=Mass Storage, Driver=uas, 5000M
# dmesg
[...]
[87893.325796] scsi host0: uas
[87893.337014] scsi 0:0:0:0: Direct-Access Samsung SSD 860 EVO 500G 3202 PQ: 0 ANSI: 6
[87893.394341] sd 0:0:0:0: Attached scsi generic sg0 type 0
[87893.394928] sd 0:0:0:0: [sda] 976773168 512-byte logical blocks: (500 GB/466 GiB)
[87893.394938] sd 0:0:0:0: [sda] 4096-byte physical blocks
[87893.395718] sd 0:0:0:0: [sda] Write Protect is off
[87893.395729] sd 0:0:0:0: [sda] Mode Sense: 53 00 00 08
[87893.396153] sd 0:0:0:0: [sda] Disabling FUA
[87893.396163] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[87893.396322] xhci-hcd xhci-hcd.0.auto: ERROR Transfer event for disabled endpoint or incorrect stream ring
[87893.396331] xhci-hcd xhci-hcd.0.auto: @00000000cf6128b0 00000000 00000000 1b000000 03078001
[87893.396593] sd 0:0:0:0: [sda] Optimal transfer size 33553920 bytes not a multiple of physical block size (4096 bytes)
[87893.401435] sda: sda1
[87893.404218] sd 0:0:0:0: [sda] Attached SCSI disk
[87990.092895] EXT4-fs (dm-0): mounting with "discard" option, but the device does not support discard
[87990.092901] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: discard
但 lsblk 指示设备不支持 DISCARD/TRIM(“在 DISC-GRAN 和 DISC-MAX 中 [...] 非零值表示支持 TRIM”):
# lsblk --discard
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 0B 0B 0
`-sda1 0 0B 0B 0
`-vg0-pg_data0 0 0B 0B 0
编辑:我尝试将磁盘+适配器连接到另一台计算机;结果相同(除了 dmesg 中没有错误)
我应该怎么做才能启用对 TRIM/DISCARD/fstrim 的支持?
答案1
我无法让这些特定的适配器传递 TRIM 命令,但我确实找到了解决方案。
首先,您需要一个使用 JMicron JMS578 芯片的适配器。我找到了两个:hardkernel 的 Bridge Board Plus(您需要“Plus”),或者这是我在亚马逊上找到的。
我只尝试了后者(对我来说更便宜、更快捷),但是odroid 的论坛报告说,同样的程序也适用于前者。
然后,您必须升级 JMS578 的固件(这些说明仅适用于 armhf 系统,但它可能适用于模拟器):
wget https://wiki.odroid.com/_media/odroid-xu4/software/jms578fwupdater.tgz
tar xzf jms578fwupdater.tgz
cd jms578fwupdater
./JMS578FwUpdate -d /dev/sda -f ./JMS578-Hardkenel-Release-v173.01.00.02-20190306.bin -b ./backup.bin
Hardkernel 的维基页面提供有关如何使用它以及其他功能的更多详细信息。