fstrim会修剪一半以上的分区大小,即使已丢弃的分区已安装


8

当我安装我的SSD时,我只是安装在discard它上面,没有汗水。但是,今天我正在阅读使用fstrim替代方法的优缺点,并决定运行该程序以了解实际花费的时间(仍然在装有的分区中discard)。该命令在我的根分区和主分区上都花费了几分钟。对于我的家庭分区,我使用-v了以下代码:

$ sudo fstrim -v /home
/home: 137494052864 bytes were trimmed

这超过了分区上的可用空间!

$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       206G   78G  118G  40% /home

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

$ sudo fstrim -v /home
/home: 0 bytes were trimmed

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

UUID=xxxxxxxx...    /          ext4   noatime,discard,errors=remount-ro  0      1
UUID=xxxxxxxx...    /home      ext4   noatime,discard,errors=remount-ro  0      2

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)

SSD是东芝THNSNS256GMCP。为什么会这样?

Answers:


12

这里有两件事:

  1. fstrim修剪掉文件系统中所有未分配的数据(嗯,不是真正的所有数据,只有未分配的数据块,我认为inode表中未使用的部分或未完全使用的块的部分都不是修剪),无论是否discard使用过。fstrim无法知道哪些未分配块已被“修剪”或在过去尚未被“修剪”,但是它(实际上是内核,所有fstrim工作都在中完成FITRIM ioctl)但是可以跟踪哪个块组 此后,如果该块组中没有任何未分配的内容,则将对其进行修剪,并且将不会再次对其进行修剪,除非您请求的FITRIM的最小扩展区长度较小(从检查ext4代码开始,否则其他代码可能有所不同)文件系统),这说明了为什么您下次运行会得到0。

    请注意,修剪修剪的图块无害。这只是在再次告诉SSD ,它可以用它做任何想做的事情(例如擦除它,以便可以将其再次用于其他用途)。

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

1
因此,如果fstrim不知道已经修剪了什么,为什么第二次报告0个字节?当然,这一定来自磁盘,但是为什么它会在第一次报告如此大的变化?磁盘肯定会与使用discardtrim已使用无关。
Graeme 2014年

1
@Graeme,啊,好点。fstrim使用FITRIM ioctl,由内核完成所有工作并将结果报告给fstrim。我想内核会跟踪已经修剪过的内容,但是它只有在启动后才能这样做。将调查并更新答案。
斯特凡Chazelas

1
好的,是的,内核必须跟踪自启动以来已修剪的内容。如果我重新启动并执行其他操作fstrim,则会得到大致相同的输出。
Graeme

@Graeme,请参阅我的编辑。
斯特凡Chazelas

1
fstrim只是发出适当的命令ioctl,其他所有事情都由文件系统决定,而文件系统的行为则大不相同。ext4试图避免一遍又一遍地修剪相同的东西,xfs不在乎并修剪所有免费的东西,其他人可能会做其他事情-如果他们甚至完全支持它...如果无法预测,请向文件系统投诉。
弗罗斯特斯2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.