独立验证 TRIM 确实适用于 SSD

独立验证 TRIM 确实适用于 SSD

我有一个我喜欢打开的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 压缩图像的大小与原始图像的大小大致相同。

我的推理正确吗?

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

答案1

你的逻辑并没有错。但只有满足某些条件才有效。

修剪命令,如指定ATA命令集,可能会也可能不会将其发行的扇区归零。
实际上,该标准关注的是 TRIM 发出后必须返回哪些数据1

本标准针对设备修剪的扇区指定了以下行为(参见 7.5.3.3):

a) 非确定性 - 响应从修剪扇区读取的数据可能会因每次读取而改变,直到主机写入该扇区;
b) 修剪后确定性读取(DRAT)——响应于读取修剪扇区而返回的数据不会改变,但可能与之前返回的数据不同; c
) 修剪后读取零(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)


测试注意事项:

正如所指出的弗罗斯特舒茨在注释中,之后的读取fstrim可能会从操作系统缓存返回数据,而不是从修剪的设备返回数据。例如,发生在这个问题
(我还要指出这个答案对于测试 TRIM 的替代方法的同一问题)。

在后续读取之间fstrim,您可能需要删除缓存,例如:

echo 3 | sudo tee /proc/sys/vm/drop_caches

根据您正在使用的分区的大小,不删除缓存可能足以导致您的测试失败。


注意您的设置:

mountdiscard选项启用连续 TRIM,即任何时候删除文件。它不是 所要求的fstrim。事实上,按需 TRIM 和连续 TRIM 是管理 TRIM 操作的两种不同方式。如需更多信息,我会指出固态硬盘Arch Linux Wiki 上有关于此事的详细报道。

答案2

SSD有内置硬件加密层吗?如果它有一个,那么 TRIMmed 块在原始硬件级别可能是全零(或可能全一),但由于计算机通过加密层看到它们,因此在通过所有加密层后,它们将显示为伪随机乱码。 - 通过解密过程将原始块归零。

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

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

答案3

丢弃与零不同。

如果您想使用 cryptsetup 归零,您可以缩小 fs,然后缩小 crypt 块,然后添加未使用的卷空间。

如果您想知道修剪是否有效,进行速度测试应该是大量使用后的一个指标。

https://linux.die.net/man/8/fstrim https://en.m.wikipedia.org/wiki/Trim_(计算)

答案4

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

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

相关内容