独立验证TRIM确实适用于SSD


13

我有一个LUKS分区/dev/sda1,我喜欢打开--allow-discards

cryptsetup --allow-discards luksOpen /dev/sda1 root

然后,我ext4使用以下discard选项挂载文件系统:

grep /dev/mapper/root /proc/mounts
/dev/mapper/root / ext4 ro,relatime,block_validity,discard,delalloc,barrier,user_xattr,acl 0 0

然后,我修剪已安装分区上的可用空间:

fstrim -v /

使用df,我看到/有80%的可用空间。这意味着在上/dev/sda1,磁盘的80%是二进制零。

如果我用克隆图像 cat

cat /dev/sda1 > sda1.img

并使用压缩图像xz,我希望磁盘上的所有零都将被压缩。由于磁盘上20%的数据是加密的,因此它看起来应该像随机的并且是不可压缩的。因此,xz压缩的图像应为aprox。原始大小的20%。

但是,所得的xz压缩图像与原始原始图像的大小大致相同。

我的推理正确吗?

为什么我的理论不能转化为实践?


2
unix.stackexchange.com/a/85880/30851以及dmsetup table | grep allow_discards
frostschutz

Answers:


8

您的逻辑是不正确的。但这仅在满足某些条件的情况下才有效。

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的一些测试,sdasdb。同一制造商,不同型号,具有不同的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上的固态驱动器,其中对此问题进行了详细介绍。


即使TRIM将SSD重新读取为零,Linux也可能在TRIM之后从其缓存返回非零数据。这是我在那边的unix.stackexchange.com/a/85880/30851的 yes-trim-test的问题,但也可能与读取TRIM之前和之后的原始数据有关。因此,如果您期望时没有得到零,请删除缓存以防万一。
frostschutz

@frostschutz好点!我以某种方式假设,因为OP提到了“根”卷,所以对于很大一部分无法容纳在内存中来说,它太大了。但是在测试过程中,缓存肯定碰巧妨碍了我的工作,直到我开始删除它之前,它都惨败了。我将更新我的答案。
fra

2

SSD是否具有内置的硬件加密层?如果它具有1,则TRIMmed块在原始硬件级别可能是全零(或可能是全1),但是由于计算机通过加密层看到了它们,因此在全部通过之后它们将显示为伪随机乱码。 -通过解密过程将原始块清零。

这样的硬件加密层将具有一些优点:

  • 它将提供非常快速的安全擦除功能:只需让驱动器销毁硬件加密层中使用的原始密钥并将其替换为新密钥,就大多数实际目的而言,所有数据都将立即无法恢复。
  • 由于到达原始硬件级别的所有数据都将被加密,因此可以保证看起来是伪随机的,因此在很大程度上是同质的。这可能有助于避免出现热点/冷点,并大大简化了磨损估算。


0

df 报告可用空间并不意味着空间为零。

trim告诉存储设备这些块未使用。我认为这不会使他们归零。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.