使用usb 3.0机箱的Trim和SSD不起作用 – 不支持UASP?

我在外部usb 3.0机箱中安装了一个SSD磁盘(Micron C400-MTFDDAC128MAM)。 现在我想在Ubuntu 12.04的笔记本电脑中使用这个磁盘作为第二个磁盘。 磁盘正在运行,但我想使用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 

我之前使用过这个磁盘作为内部磁盘并且修剪工作正常,请帮助我谢谢。

这里有一些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协议)?

亲切的问候

Luckyrings

您的SSD向hdparm报告以支持TRIM(hdparm -I =直接从驱动器发送请求标识信息)。

但是,TRIM由驱动控制器控制。

外部硬盘闭合的USB3硬盘控制器很可能不支持TRIM(大多数外部控制器不支持)。

在这种情况下,即使您的SSD支持它,也不会获得任何TRIMfunction。

这是一个软件问题,Linux似乎目前不支持TRIM通过USB。 问题是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 passthrough。 有一个标准命令可以执行此操作,但某些机箱具有专有命令。 事实上, hdparm -I使用ATA passthrough从设备获取信息。 可以使用相同的passthrough直接向设备发出TRIM,但Linux驱动程序目前不会这样做。 它必须检测到SCSI磁盘实际上是支持ATA直通的SCSI-to-ATA转换器,并使用DISCARDs的passthrough而不是本机SCSI命令。

如果您的机箱未正确翻译UNMAP,您至少可以使用hdparm手动修剪整个驱动器(这使用SCSI协议的ata-passthrough并在我的UASP硬盘坞上正常工作)。 但您必须手动计算扇区,因为hdparm一次只支持修剪65535个扇区。 我写了一个简短的脚本来做数学:

 #!/usr/bin/env python3 import sys remaining = int(sys.argv[1]) i = 0 while remaining > 0: add = min(65535, remaining) print("%d:%d" % (i, add)) remaining -= add i += add 

将它保存为sectors.py并执行chmod +x sectors.py 。 它产生了一个可用于hdparm --trim-sector-ranges-stdin的扇区块列表。 现在执行hdparm -I /dev/sdX (以root身份执行)并坚持使用如下所示的行:

 LBA48 user addressable sectors: 62533296 

这是设备扇区数量(因为您可以计算出这是我经常用于测试的~32 GB SSD)。

将数字复制到以下命令:

 ./sectors.py SECTOR_COUNT | sudo hdparm --trim-sector-ranges-stdin --please-destroy-my-drive /dev/sdX 

警告:这将擦除整个驱动器!

完成后,运行sync并等待几秒钟。 现在,您可以使用hdparm -z /dev/sdX重新读取分区表,或者只需重启设备。 恭喜,您现在拥有“全新”SSD。