独立验证TRIM确实适用于SSD

Mar*_*ter 13 ssd ext4 cryptsetup trim fstrim

我有一个luksOpen的LUKS分区:/dev/sda1--allow-discards

cryptsetup --allow-discards luksOpen /dev/sda1 root
Run Code Online (Sandbox Code Playgroud)

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

grep /dev/mapper/root /proc/mounts
/dev/mapper/root / ext4 ro,relatime,block_validity,discard,delalloc,barrier,user_xattr,acl 0 0
Run Code Online (Sandbox Code Playgroud)

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

fstrim -v /
Run Code Online (Sandbox Code Playgroud)

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

如果我克隆图像 cat

cat /dev/sda1 > sda1.img
Run Code Online (Sandbox Code Playgroud)

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

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

我的推理正确吗?

为什么我的理论没有转化为实践?

fra*_*san 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
Run Code Online (Sandbox Code Playgroud)

我使用两个 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
 ...
Run Code Online (Sandbox Code Playgroud)

两个 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
Run Code Online (Sandbox Code Playgroud)

我可以确认,在发布之后fstrim,支持“TRIM 后确定性读取零”(RZAT)的驱动器似乎实际上几乎完全将相关分区归零。相反,另一个驱动器似乎已将释放空间的一小部分归零(或以其他方式替换为一些高度可压缩的模式)。

1 在线资源:INCITS 529:信息技术 - ATA/ATAPI 命令集 - 4 (ACS-4)


测试注意事项:

正如froschutz在评论中指出的那样,读后fstrim可能会从操作系统缓存中返回数据,而不是从修剪过的设备中返回数据。例如,这是在这个问题中发生的事情。
(对于测试 TRIM 的替代方法,我还会指出同一问题的答案)。

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

echo 3 | sudo tee /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

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


请注意您的设置:

discard安装选项,可以连续TRIM,即任何时候文件被删除。不需要它fstrim。实际上,按需 TRIM 和连续 TRIM 是管理 TRIM 操作的两种不同方式。有关更多信息,我会指向Arch Linux Wiki 上的固态驱动器,其中详细介绍了此事。


tel*_*coM 2

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

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

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