您的逻辑是不正确的。但这仅在满足某些条件的情况下才有效。
如ATA命令集中所指定的TRIM命令,可以将针对其发出的扇区置零,也可以不置零。
实际上,该标准着重于TRIM发布后必须返回哪些数据1:
该标准为设备调整的扇区规定了以下行为(请参见7.5.3.3):
a)非确定性的-响应于从修整扇区读取的数据可能会因每次读取而改变,直到主机写入该扇区为止;
b)确定性的修整后读取(DRAT)-响应于修整后的扇区的读取而返回的数据没有更改,但可能与先前返回的数据不同;和
c)中读取后零点TRIM(RZAT) -响应返回给修剪扇区的读出的数据是零。
[...]对于DRAT和非确定性存储设备,响应已成功修剪的LBA的读取命令而返回的数据:
a)可能是指定LBA先前返回的数据;
b)可以是由存储设备生成的模式;和
c)是以前没有写入由主机不同的LBA的数据。
因此,设备返回的内容fstrim
取决于其实现的功能。除非它支持RZAT,否则从调整后的设备读取的数据将仅为零的假设不成立。
您可以使用以下方法hdparm
进行检查:
sudo hdparm -I /dev/sdX | grep -i trim
我执行使用两个SSD的一些测试,sda
和sdb
。同一制造商,不同型号,具有不同的ATA一致性:
$ sudo hdparm -i /dev/sdb
...
Drive conforms to: Unspecified: ATA/ATAPI-3,4,5,6,7
...
$ sudo hdparm -i /dev/sda
...
Drive conforms to: unknown: ATA/ATAPI-2,3,4,5,6,7
...
两种SSD对TRIM的支持不同:
$ sudo hdparm -I /dev/sda | grep -i trim
* Data Set Management TRIM supported (limit 1 block)
$ sudo hdparm -I /dev/sdb | grep -i trim
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
我可以确认,在发行之后fstrim
,支持“在TRIM之后确定性读取零”的驱动器(RZAT)似乎实际上将相关分区完全清零了。相反,另一个驱动器似乎只将释放空间的一小部分清零(或以某种高度可压缩的模式替换)。
1 在线来源:INCITS 529:信息技术-ATA / ATAPI命令集-4(ACS-4)
测试注意事项:
正如frostschutz在评论中指出的那样,“ 读后”fstrim
可能会从操作系统缓存而不是从修剪后的设备返回数据。例如,这是此问题中发生的事情。
(对于测试TRIM的替代方法,我也将指向相同问题的答案)。
在fstrim
两次读取之间以及随后的读取之间,您可能需要删除缓存,例如:
echo 3 | sudo tee /proc/sys/vm/drop_caches
根据您正在使用的分区的大小,不删除缓存可能足以使测试失败。
请注意您的设置:
在discard
安装选项,可以连续TRIM,即任何时候文件被删除。不需要fstrim
。实际上,按需TRIM和连续TRIM是管理TRIM操作的两种不同方法。有关更多信息,我将指向Arch Linux Wiki上的固态驱动器,其中对此问题进行了详细介绍。
dmsetup table | grep allow_discards