web-dev-qa-db-ja.com

fstrimがbtrfs(+ ecrypts)のデータブロックをトリミングしないように見えるのはなぜですか?

いくつかのパーティションがあるSSDディスクがあります。それらの1つは、ecryptfsホームディレクトリを保持する/homeとしてマウントされたbtrfsボリュームを持っています。

ボリュームをトリミングすると、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

$ 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=/)

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

/home:
.ecryptfs
myuser

/home/myuser/.Private -> /home/.ecryptfs/myuser/.Private

$ 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

初めて、すべてのボリュームで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

Ecryptfsのマウントが追加されているため、fstrimは/homeツリーで2回実行されているようです。これは問題ありません(特定のマウントポイントでfstrimを実行することで回避できます)。問題は、各実行で同じ量のデータが検出されてトリミングされるため、トリミング/homeが期待どおりに機能しないことです。

これは、さらに実行することで示されます。

$ fstrim -v /(これは問題ありません):

/: 0 B (0 bytes) trimmed

$ fstrim -v /home(これは問題ありません):

/home: 286,4 GiB (307478061056 bytes) trimmed

Sda2(/home)トリミングの実行には時間がかかるため、実際に何かを実行していることに注意してください。

2
Marcus

Fstrimによって報告されるサイズについて心配することはよくある誤解です。

実際には何の意味もありません。無視してください。

fstrimは適切なioctlを発行するだけで、それ以外はすべてファイルシステムの決定であり、ファイルシステムの動作は大きく異なります。たとえば、ext4は同じものを何度もトリミングしないようにするため、0 bytes trimmedが表示されます。 xfsは無料のすべてを気にせずトリミングするため、常に<roughly free space> bytes trimmedが表示されます。他のファイルシステムは他のことをするかもしれません、それが実装されているとしても、それはすべてファイルシステムがFITRIMシステムコールロジックを実装することをどのように選択したかに依存します。

トリミングされるデータの量が空き領域を超えない限り、fstrim(実際にはファイルシステム)が何を報告するかに関係なく、問題はありません。

結局、SSD自体だけが、現在トリミングされているものとされていないものを実際に認識しています。すでにトリミングされたブロックをトリミングしても、害はありません。

fstrimによって報告されたx bytes trimmedに基づいて結論を出さないでください。

データがトリミングされたことを確認する場合は、ディスク上の生データを確認する必要があります。 ( https://unix.stackexchange.com/a/85880/30851 )しかし、その方法はbtrfsでは機能しない可能性があり、私は試したことがありません。

4
frostschutz