MrCalvin Asked: 2019-02-09 15:10:46 +0800 CST2019-02-09 15:10:46 +0800 CST 2019-02-09 15:10:46 +0800 CST 文件系统 (ext4) 如何“存储”TRIM 信息? 772 建议启用每周运行一次的 TRIM cron 作业。当调用 fstrim 命令时,文件系统会将 TRIM 信息发送到驱动器以丢弃已删除的数据(我希望我做对了) 到目前为止这么好,这个描述很多地方。 但是我找不到有关这些 TRIM 信息在 fstrim 命令之间的文件系统中“存储”方式/位置的任何信息? 是否可以以某种方式“清除”这些 TRIM 信息,以便 SSD 不会获得所有必须丢弃的页面/块的信息? 或者 fstrim 命令会比较文件系统和 SSD 的实际删除数据吗? ssd trim 1 个回答 Voted Best Answer frostschutz 2019-02-09T15:42:43+08:002019-02-09T15:42:43+08:00 我不知道 ext4 是否真的将它存储在任何地方。其他文件系统当然不会。 ext4 仅在当前会话中避免它已经修剪的内容 - 当它仍然安装时。一旦您重新启动或重新挂载文件系统,它就会再次修剪空白空间。 所以这可能是一个根本不存储的内存结构。我没有深入研究非常精细的源代码来找出答案。 一个小测试: # truncate -s 1G /dev/shm/foobar.img # losetup --find --show /dev/shm/foobar.img /dev/loop9 # mkfs.ext4 /dev/loop9 # mkdir /mnt/loop 给定一个 1G 的文件系统,让我们挂载和修剪它: # mount /dev/loop9 /mnt/loop/ # fstrim -v /mnt/loop /mnt/loop: 973.4 MiB (1020678144 bytes) trimmed # fstrim -v /mnt/loop /mnt/loop: 0 B (0 bytes) trimmed 所以它首先修剪所有......毕竟,这已经很可疑了:mkfs 也已经修剪过(哎哟),所以它应该知道它仍然是空的和修剪过的,对吧?好吧,如果它知道,它不在乎: # umount /mnt/loop # mount /dev/loop9 /mnt/loop # fstrim -v /mnt/loop /mnt/loop: 973.4 MiB (1020678144 bytes) trimmed 因此,重新安装后,它只会再次修剪所有可用空间。 创建和删除文件时,也不是精确的: # dd bs=1M count=10 if=/dev/zero of=/mnt/loop/zerofile 10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 0.0124641 s, 841 MB/s # sync # rm /mnt/loop/zerofile # fstrim -v /mnt/loop /mnt/loop: 117.5 MiB (123203584 bytes) trimmed 因此,写入 10M 会导致重新修剪 117M。它只是没有任何意义。 只有 SSD 本身才真正知道当前修剪了什么,没有修剪什么,当被要求修剪已经修剪的区域时,它应该什么都不做。所以没有伤害,也不需要真正将这些信息存储在文件系统中。
我不知道 ext4 是否真的将它存储在任何地方。其他文件系统当然不会。
ext4 仅在当前会话中避免它已经修剪的内容 - 当它仍然安装时。一旦您重新启动或重新挂载文件系统,它就会再次修剪空白空间。
所以这可能是一个根本不存储的内存结构。我没有深入研究非常精细的源代码来找出答案。
一个小测试:
给定一个 1G 的文件系统,让我们挂载和修剪它:
所以它首先修剪所有......毕竟,这已经很可疑了:mkfs 也已经修剪过(哎哟),所以它应该知道它仍然是空的和修剪过的,对吧?好吧,如果它知道,它不在乎:
因此,重新安装后,它只会再次修剪所有可用空间。
创建和删除文件时,也不是精确的:
因此,写入 10M 会导致重新修剪 117M。它只是没有任何意义。
只有 SSD 本身才真正知道当前修剪了什么,没有修剪什么,当被要求修剪已经修剪的区域时,它应该什么都不做。所以没有伤害,也不需要真正将这些信息存储在文件系统中。