即使分区挂载有丢弃,fstrim 也会修剪超过一半的分区大小

Gra*_*eme 9 linux filesystems fstab trim

当我安装我的 SSD 时,我只是安装了discard它,并没有出汗。然而,今天我正在阅读有关使用它的利弊的信息,fstrim并决定运行该程序以了解实际需要多长时间(仍然使用 安装我的分区discard)。该命令在我的根分区和主分区上都花费了几分钟。对于我的主分区,我使用-v并得到了这个:

$ sudo fstrim -v /home
/home: 137494052864 bytes were trimmed
Run Code Online (Sandbox Code Playgroud)

这比分区上的可用空间量还多!

$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       206G   78G  118G  40% /home
Run Code Online (Sandbox Code Playgroud)

随后的运行在不到一秒的时间内完成,例如:

$ sudo fstrim -v /home
/home: 0 bytes were trimmed
Run Code Online (Sandbox Code Playgroud)

当然,如果我一直用 挂载分区discardfstrim不应该像这样修剪大量数据吗?该discard选项肯定已启用,以下是相关fstab行:

UUID=xxxxxxxx...    /          ext4   noatime,discard,errors=remount-ro  0      1
UUID=xxxxxxxx...    /home      ext4   noatime,discard,errors=remount-ro  0      2
Run Code Online (Sandbox Code Playgroud)

mount输出行:

/dev/disk/by-uuid/xxxxxxxx... on / type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)
/dev/sda2 on /home type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)
Run Code Online (Sandbox Code Playgroud)

SSD 是东芝 THNSNS256GMCP。为什么会发生这种情况?

Sté*_*las 12

这里有两件事:

  1. fstrim修剪文件系统中所有未分配的数据(好吧,并不是所有的数据,只有未分配的数据块,我不认为 inode 表的未使用部分或未完全使用的块的部分是修剪),无论是否discard使用。fstrim无法知道哪些未分配的块在过去已被“修剪”或尚未“修剪”,但它(实际上是内核,所有fstrim工作都在中完成FITRIM ioctl)确实会跟踪哪个块组 已经被修剪并且如果从那时起在该块组中没有任何未分配,则不会再次修剪它们,除非您请求具有较小最小范围长度的 FITRIM(通过检查 ext4 代码,它可能与其他文件系统),这解释了为什么您在下一次运行时得到 0。

    请注意,修剪已经修剪过的块没有害处。这只是再次告诉 SSD它可以随心所欲地使用它(例如擦除它以便它可以再次用于其他用途)。

  2. df输出中,“可用”值不考虑为“保留”的空间root,您会注意到 206 - 76 是 130G,而不是 118G。12G(约5%)预留。请参阅tunefs -m更改保留的数量。