如何从 BTRFS 文件系统使用的每个块中回收未使用的空间?
假设有很多块已部分使用,每个块的利用率为 10% 到 50%,如何对这些块进行碎片整理,以便回收每个块 90% 到 50% 的可用空间?
如果可能的话,这也会压缩数据。
答案1
BTRFS 有一种简单的方法来回收文件系统中包含数据的每个块的未使用空间!...btrfs 平衡。
有关其用法的官方文档,请访问官方文档并搜索“压缩未使用的块“ 这里:https://btrfs.readthedocs.io/en/stable/Balance.html#filter-types
语法基本上是:
btrfs balance start -dusage=<percentageUsed/chunk> <btrfs mount path>
例如:
btrfs balance start -dusage=10 /mnt/btrfs
上面将搜索 btrfs 安装路径 /mnt/btrfs 中的所有块,以查找仅使用最多 10% 的块。
然后,数据将被重新定位到其他部分使用的块,从而使使用的块的百分比增加到大于 10%。从而压缩文件系统,更重要的是释放每个块未使用和锁定的“可用空间”!
本质上,对自由空间进行碎片整理
然后,您可以将上述内容放入脚本中,百分比不断增加,最高可达 50%。上面链接中的官方文档不建议超过 50%,因为它的好处较少。
例如:
#!/usr/bin/env bash
function free_chunks_up_to_50percent {
local path=$1
for USAGE in {10..50..10}
do
echo "usage percentage= ${USAGE}"
echo "path= ${path}"
btrfs balance start -v -dusage=${USAGE} ${path}
done
}
free_chunks_up_to_50percent $1
btrfs-reclaim-unused-space.sh
例如:如果上面的脚本是一个调用btrfs 安装路径的脚本文件,则执行上面的脚本/mnt/btrfs
以回收那里的空间。
sh ./btrfs-reclaim-unused-space.sh /mnt/btrfs
对于 SSD,即使在 BTRFS RAID 上,这也相当快
对于 BTRFS RAID 中的机械磁盘,这可能需要一些时间,具体取决于 RAID 阵列(所有类型的 BTRFS RAID)的大小。时不时地运行它仍然是值得的,尤其是当 RAID 发生大量 IO 时。例如,大量的种子下载。