Btrfs空间回收与碎片整理

笔记本使用Btrfs,刚刚空间满了,清空回收站却无法释放空间,为什么呢?

Btrfs使用了CoW(写时复制)技术,清空回收站不会立刻释放空间。

正确操作如下:

1.碎片整理

sudo btrfs filesystem defragment /home -r

请注意:
在 BTRFS 文件系统上,碎片整理(defragmentation)有时可能会导致可用空间减少,这主要有以下几个原因:

数据写入新位置:BTRFS 的碎片整理并不会就地修改文件,而是会将文件的碎片复制到新的连续空间。这就意味着在整理过程中,文件被复制到新的位置,原位置的空间不会立即释放,可能导致短时间内空间变小。

快照占用空间:如果系统启用了快照功能,碎片整理会在快照中保留文件的旧版本。因为 BTRFS 是写时复制(Copy-on-Write,COW)的文件系统,碎片整理时复制的文件将导致快照中的空间增大。

元数据开销:BTRFS 在进行碎片整理时,可能会产生额外的元数据来跟踪新写入的数据,导致空间被暂时占用。

2.重新平衡

sudo btrfs balance start -dusage=85 /home

(解释:只平衡使用率低于85%的区块)

注意:确保有足够的可用空间:在执行 balance 操作之前,确保系统中有足够的可用空间,通常建议至少有 10-20% 的可用空间,这样可以确保平衡过程顺利进行。

当然你也可以部分平衡 (filtered balance):你可以通过部分平衡来减少空间消耗。指定某些特定类型的块(如数据块或元数据块)进行平衡,而不是一次性对所有块进行重组。以下是部分平衡的例子:

仅对使用率高于 50% 的数据块进行平衡

sudo btrfs balance start -dusage=50 /mountpoint

仅对使用率高于 50% 的元数据块进行平衡

sudo btrfs balance start -musage=50 /mountpoint

逐步平衡:如果空间有限,可以多次运行 balance 操作,每次处理一小部分块,避免一次性消耗过多空间。例如:

每次平衡 10 个块组

sudo btrfs balance start -dlimit=10 /mountpoint

清理无用数据:在运行 balance 操作之前,可以尝试清理不需要的数据和快照,以减少额外的空间消耗。

你可以使用sudo btrfs balance status /mountpoint随时查看平衡进度

3.释放空间

也许你会发现,平衡完成后空间压根没增加,甚至变小了。

这是因为balance操作的主要作用是重新分配和整理数据块,但它不会直接释放磁盘空间。特别是:

未使用的数据块:在 balance 完成后,BTRFS 可能需要进一步的操作(如 btrfs fi sync)才能确保未使用的数据块被正确标记为可用。
快照的影响:如果系统中有快照,balance 并不会影响快照中保留的文件版本。快照会占用空间,即使原始文件被删除或移动,快照仍然持有旧的数据块。

使用sudo btrfs filesystem sync /mountpoint释放空间。

使用sudo btrfs scrub start /mountpoint检查和修复数据块完整性

1
2
3
4
5
6
7
UUID:             010a3536-b1fb-4bf8-9f72-fdd7ce47843f
Scrub started: Mon Sep 16 11:36:03 2024
Status: finished
Duration: 0:01:02
Total to scrub: 245.92GiB
Rate: 3.97GiB/s
Error summary: no errors found