我在外部 USB 3.0 机箱中安装了一个 SSD 磁盘(Micron C400-MTFDDAC128MAM)。现在我想将此磁盘用作装有 Ubuntu 12.04 的笔记本电脑中的第二个磁盘。磁盘可以正常工作,但我想使用 TRIM 支持,但该支持无法按预期工作。
检查 TRIM 支持:
user@server:~$ sudo hdparm -I /dev/sdc | grep -i TRIM
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read data after TRIM
磁盘已使用以下选项安装:
/dev/sdc1 on /media/MICRON type ext4 (rw,nosuid,nodev,uhelper=udisks)
但是当我手动运行 TRIM 命令时,出现错误:
user@server:~$ sudo fstrim -v /media/MICRON/
fstrim: /media/MICRON/: FITRIM ioctl failed: Operation not permitted
我之前将此磁盘用作内部磁盘并且 TRIM 正在运行。
以下是一些 USB 详细信息:
[ 1039.248050] usb 4-1: new SuperSpeed USB device number 4 using xhci_hcd
[ 1039.265597] scsi8 : usb-storage 4-1:1.0
[ 1041.547879] scsi 8:0:0:0: Direct-Access C400-MTF DDAC128MAM 0509 PQ: 0 ANSI: 5
[ 1041.549134] sd 8:0:0:0: Attached scsi generic sg2 type 0
[ 1041.550511] sd 8:0:0:0: [sdc] 250069680 512-byte logical blocks: (128 GB/119 GiB)
[ 1041.550778] sd 8:0:0:0: [sdc] Write Protect is off
[ 1041.550785] sd 8:0:0:0: [sdc] Mode Sense: 23 00 00 00
[ 1041.552520] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.552528] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.554029] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.554035] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.678373] sdc: sdc1
[ 1041.679982] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.679991] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.679997] sd 8:0:0:0: [sdc] Attached SCSI disk
如何查明大容量存储设备是否使用应支持 TRIM 的 UASP(USB 连接 SCSI 协议)?
答案1
这是一个软件问题,Linux 目前似乎不支持通过 USB 进行 TRIM。问题是 USB 存储设备使用 SCSI 命令集,而 SSD 驱动器实现 ATA 命令集。USB 外壳必须在这些命令集之间提供转换器。在 ATA 中称为 TRIM 的操作在 SCSI 中称为 UNMAP,在 Linux 内核中称为 DISCARD。当 Linux 收到修剪设备的命令时,它会查找要发送到设备的正确命令。由于 USB 存储设备看起来像 SCSI 磁盘,因此 Linux 会尝试使用 UNMAP 或其他几个可能的 SCSI 命令。原则上,USB 外壳中的转换器通常可以将 UNMAP 请求转换为相应的 ATA TRIM,尽管可能存在棘手的情况。实际上,外壳不会这样做,而是指示设备不支持 UNMAP。但是,许多外壳会实现 SCSI 命令以直接向设备发出 ATA 命令。这称为 ATA 直通。有一个标准命令可以执行此操作,但有些外壳有专有命令。实际上,hdparm -I
使用 ATA 直通从设备获取信息。可以使用相同的直通功能直接向设备发出 TRIM,但 Linux 驱动程序目前无法做到这一点。它必须检测 SCSI 磁盘是否实际上是支持 ATA 直通的 SCSI 到 ATA 转换器,并使用直通功能执行 DISCARD,而不是执行本机 SCSI 命令。
答案2
现在市场上有支持微调的 USB 外壳,这个问题值得更新答案。例如,如果您的外壳使用 JMICRON JMS583 芯片,则它支持微调。
我将仅包含使其工作所需的步骤(如果它受支持),但如果您想要更详细的演练,请参阅下面的源链接。
- 获取供应商和产品 ID
lsusb
- 使用以下内容创建
/etc/udev/rules.d/50-usb-ssd-trim.rules
,但将供应商和产品 ID 更改为与步骤 1 中找到的 ID 相匹配:
ACTION=="add|change", ATTRS{idVendor}=="152d", ATTRS{idProduct}=="0583", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
- 重新加载 udev 配置
sudo service udev force-reload
- 确保您没有安装 USB 外壳,然后重新插入 USB 外壳。
- 您可以检查是否支持
lsblk --discard /dev/sda
看:https://www.glump.net/howto/desktop/enable-trim-on-an-external-ssd-on-linux
答案3
您的 SSD 向 hdparm 报告以支持 TRIM(hdparm -I = 直接从驱动器请求识别信息)。
然而,TRIM 由驱动控制器控制。
外部 HDD 封堵器的 USB3 硬盘控制器很可能不支持 TRIM(大多数外部控制器不支持)。
在这种情况下,即使您的 SSD 支持,您也无法获得任何 TRIM 功能。
答案4
如果您的设备不支持修剪,也许在固件更新后会支持。
例如 ASMedia ASM1051E 可以使用固件“140509_A1_82_40.bin”
你可以从那里得到它https://www.usbdev.ru/files/asmedia/asmt2115firmware/
Flasher 工具来自这里https://www.usbdev.ru/files/asmedia/asm105mptool/
您需要 Windows 来刷新固件。
启动 flasher 后,单击顶部的钥匙符号并输入 asmedia 作为密码。屏幕解锁后。您现在可以选择固件并更改一些其他设置,例如 HDD 的序列号。然后按左下角的播放按钮。它显示失败,但拔下并重新插入后,我看到了新的 FW 版本。
然后在 /etc/udev/rules.d/50-usb-ssd-trim.rules 中添加 udev 规则
ACTION=="add|change", ATTRS{idVendor}=="174c", ATTRS{idProduct}=="55aa", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
并重新启动,最终修剪工作完成。
使用旧 FW:
sudo fstrim -v /
fstrim: /: FITRIM ioctl failed: Ein-/Ausgabefehler der Gegenstelle (remote)
使用固件“140509_A1_82_40.bin”
sudo fstrim -v /
/: 44,8 MiB (46931968 bytes) trimmed
检查是否有效(改编自)https://wiki.ubuntuusers.de/SSD/TRIM/Testen/
yes | sudo dd iflag=fullblock bs=1M count=1 of=trim.test
查找文件在磁盘上的确切位置
filefrag -s -v trim.test
Filesystem type is: ef53
File size of trim.test is 1048576 (256 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 255: 125184.. 125439: 256: last,eof
trim.test: 1 extent found
找出哪个磁盘文件:
Dateisystem 1K-Blöcke Benutzt Verfügbar Verw% Eingehängt auf
/dev/mapper/sda2_crypt 122768060 1294164 116453544 2% /
直接从磁盘读取内容
sudo dd bs=4096 skip=125184 count=256 if=/dev/mapper/sda2_crypt | hexdump -C
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |y.y.y.y.y.y.y.y.|
*
256+0 Datensätze ein
256+0 Datensätze aus
1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,0683545 s, 15,3 MB/s
00100000
立即删除、同步和修剪
sudo rm trim.test
sync
sudo fstrim -v ./
验证前删除缓存
echo 1 | sudo tee /proc/sys/vm/drop_caches
再次执行
sudo dd bs=4096 skip=125184 count=256 if=/dev/mapper/sda2_crypt | hexdump -C
现在你应该在加密驱动器上看到很多输出,例如
000070a0 e3 2d ee 86 3f c3 58 12 7e 89 94 27 ba 7c d8 57 |.-..?.X.~..'.|.W|
000070b0 58 5f 61 2a d1 37 63 77 8e 54 29 c5 a5 55 2c 66 |X_a*.7cw.T)..U,f|
000070c0 54 ab 00 07 c8 2c 64 5a b1 24 d0 73 23 1c 9e 0d |T....,dZ.$.s#...|
000070d0 3d 39 3e 43 36 54 d8 55 1d c7 79 bd b4 17 13 93 |=9>C6T.U..y.....|
000070e0 b1 75 a6 34 d4 2a c2 0c 13 c6 ff df ed 78 d7 42 |.u.4.*.......x.B|
在未加密的驱动器上,你会看到
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
如果修剪不起作用,你会再次看到
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |y.y.y.y.y.y.y.y.|
*
--> 已验证 trim 是否与 USB 外壳配合使用