我有一个我喜欢打开的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
告诉存储设备这些块未被使用。我不认为这会让他们归零。