为什么 fstrim 似乎不修剪 btrfs (+ecrypts) 上的数据块?

Mar*_*cus 4 filesystems btrfs ecryptfs trim fstrim

我有一个带有多个分区的 SSD 磁盘。其中之一是有一个 btrfs 卷,安装为/home,其中包含一个 ecryptfs 主目录。

当我修剪卷时,似乎 fstrim 不会修剪此类卷上的数据块 - 为什么?您可以在下面看到有关设置的所有信息,以及我遵循的步骤,以及注释。

$ cat /etc/fstab

UUID=xxx /               ext4    errors=remount-ro 0       1
UUID=yyy /media/vfio     ext4    defaults          0       2
UUID=zzz /home           btrfs   defaults          0       2
Run Code Online (Sandbox Code Playgroud)

$ mount | grep sda

/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda1 on /media/vfio type ext4 (rw,relatime,stripe=32721,data=ordered)
/dev/sda2 on /home type btrfs (rw,relatime,ssd,space_cache,subvolid=5,subvol=/)
Run Code Online (Sandbox Code Playgroud)

$ ls -la /home /home/myuser/.Private # summary

/home:
.ecryptfs
myuser

/home/myuser/.Private -> /home/.ecryptfs/myuser/.Private
Run Code Online (Sandbox Code Playgroud)

$ df -h

Filesystem              Size  Used Avail Use% Mounted on
/dev/sda5                16G   11G  4,7G  69% /
/dev/sda1                93G   52G   36G  60% /media/vfio
/dev/sda2               828G  542G  286G  66% /home
/home/myuser/.Private   828G  542G  286G  66% /home/myuser
Run Code Online (Sandbox Code Playgroud)

我第一次在所有卷上执行 fstrim。

$ fstrim -va

/home/myuser: 286,4 GiB (307518836736 bytes) trimmed
/home: 286,4 GiB (307485450240 bytes) trimmed
/media/vfio: 40,4 GiB (43318886400 bytes) trimmed
/: 5,4 GiB (5822803968 bytes) trimmed
Run Code Online (Sandbox Code Playgroud)

/home由于额外的 ecryptfs 挂载,似乎 fstrim 在树上运行了两次。这没问题(我可以通过运行具有特定挂载点的 fstrim 来避免它)。问题是修剪/home没有按预期工作,因为每次运行都会找到并修剪相同数量的数据。

这通过进一步运行显示。

$ fstrim -v / (还行吧):

/: 0 B (0 bytes) trimmed
Run Code Online (Sandbox Code Playgroud)

$ fstrim -v /home (这不行):

/home: 286,4 GiB (307478061056 bytes) trimmed
Run Code Online (Sandbox Code Playgroud)

请注意, sda2 ( /home) 修剪需要一些时间才能运行,因此它实际上正在执行某些操作。

fro*_*utz 6

担心 fstrim 报告的大小是一种常见的误解。

真的没什么意思。 只是忽略它。

fstrim只发出适当的ioctl,其他一切都是文件系统的决定,文件系统的行为非常不同。例如,ext4尽量避免一遍又一遍地修剪相同的东西,所以你会看到0 bytes trimmed. xfs不关心和修剪所有免费的东西,所以你总是会看到<roughly free space> bytes trimmed. 其他文件系统可能会做其他事情,这完全取决于文件系统如何选择实现FITRIM系统调用逻辑,如果它被实现的话。

只要修剪的数据量不大于可用空间,无论fstrim(文件系统,真的)报告什么,您都应该没问题。

最后,只有 SSD 本身才真正知道当前修剪了什么,没有修剪什么。修剪已经修剪过的块不会造成任何伤害。

不要根据x bytes trimmed报告的内容做出结论fstrim

如果要验证数据是否被修剪,则必须检查磁盘上的原始数据。(https://unix.stackexchange.com/a/85880/30851)但该方法可能不适用于 btrfs,我从未尝试过。