Btrfs空间回收与碎片整理

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 | UUID: 010a3536-b1fb-4bf8-9f72-fdd7ce47843f |