btrfs-progs balance实战指南如何快速重平衡数据、切换RAID布局【免费下载链接】btrfs-progsDevelopment of userspace BTRFS tools项目地址: https://gitcode.com/gh_mirrors/bt/btrfs-progsbtrfs balance 是 btrfs-progs 项目BTRFS 文件系统的用户态工具集中最核心的命令之一一次操作就能把散落在磁盘上的数据重新均匀分布、切换 RAID 布局如 single → RAID1/RAID10还能压缩稀疏块组回收空间。本指南带你从零看懂 balance 的完整工作流查看用量 → 执行平衡 → 处理中断无需了解 BTRFS 内部结构也能放心使用。上图是 BTRFS 叶子节点Leaf的内部结构balance 正是在这种块组Block Group级别上搬运和整理数据的。一分钟认识 btrfs balanceBTRFS 把空间切成一个个块组通常 1GiB 或 256MiB 一个文件数据分散存放在这些块组里。随着写入、删除、快照块组的空间利用率会越来越碎片化甚至数据都堆在单块磁盘上。btrfs balance的作用就是按需重新挑选块组把数据搬到新位置让整体布局符合你的 RAID 策略。三个最典型的用途切换 RAID 布局——给新加的磁盘开启冗余如把数据转成 RAID1压缩稀疏块组——把利用率低的块组数据合并回收幽灵空间定向整理——只处理某块磁盘或某个范围内的数据几个必须知道的安全特性特性说明需要已挂载balance 只能作用于已挂载的文件系统保留 reflink共享 extent 和硬链接关系不会被打断文件不会被碎片化或重新压缩随时可中断掉电、重启都不会破坏文件系统重新挂载后自动续跑加skip_balance可跳过I/O 密集移动大量数据期间磁盘和 CPU 压力大机械硬盘上会明显变慢动手前的概念自查块组与 Profile三种块组类型数据块组data存放文件内容对应-d参数元数据块组metadata存放目录树、extent 树等结构对应-m参数系统块组system物理到逻辑地址的映射表对应-s参数需加-f强制 元数据一旦损坏整个文件系统就废了所以很多用户会把元数据放在更高冗余的 profile 上。常见 Profile布局Profile特点single单副本空间利用率最高无冗余dup双副本但可能同盘适合单盘raid1/raid10双盘/多盘镜像安全性好raid5/raid6条带校验大容量盘组常用单盘 BTRFS 默认是数据 single 元数据 dup多盘默认元数据为 RAID1。第一步balance 前先查看磁盘用量先搞清楚空间分布避免盲目全盘平衡不加任何过滤器的全盘 balance 会移动所有数据耗时极长$ btrfs filesystem df /mnt Data, single: total75.81GiB, used64.44GiB System, RAID1: total32.00MiB, used20.00KiB Metadata, RAID1: total15.87GiB, used8.84GiB读法used / total就是平均块组利用率。上例数据约 85%说明块组已经比较满如果只有 40%用 usage 过滤器收益就很大。第二步三大高频 balance 场景场景一压缩稀疏块组回收空间usage 过滤器块组只要还有 1 字节数据就不会被释放。usageN表示只处理利用率低于 N%的块组把它们的数据挪到别的块组后整块回收# btrfs balance start -dusage50 /mnt Done, had to relocate 2 out of 97 chunks小技巧从 10 这种小数字起步逐步加大到 50、70每次处理量小、速度快空间会一点点被拧干。利用率超过 50% 的块组再处理就只是原样搬家基本没有空间收益。场景二切换 RAID 布局convert 过滤器给多盘文件系统升级冗余是最常见的需求。原则是先元数据、后数据$ btrfs balance start -v -mconvertraid1 /mnt $ btrfs balance start -v -dconvertraid1,soft /mntsoft参数会让已转换好的块组直接跳过转换中途断掉后重跑同一条命令即可继续降低冗余如 RAID1 → single属于危险操作必须加-f显式确认⚠️千万别为了踢掉坏盘而降低冗余——balance 可能把新块组恰好写到坏盘上这种情况应该使用btrfs device replace场景三定向整理某块磁盘devid / drange 过滤器用btrfs filesystem show /mnt可以看到每块磁盘的 devid然后只平衡指定磁盘上的块组$ btrfs balance start -ddevid2,usage0 /mnt 特别推荐usage0它只清理完全没用过的空块组删快照、清大文件后常见而且不需要任何工作空间是空间紧张时的首选急救手段。第三步长时间任务的管控pause / resume / cancel / statusbalance 动辄几个小时官方提供了完整的遥控器子命令作用btrfs balance pause /mnt暂停进度和过滤器状态写入磁盘btrfs balance resume /mnt恢复之前被中断/暂停的 balancebtrfs balance cancel /mnt取消内核 5.7 起响应速度大幅提升btrfs balance status /mnt查看运行/暂停状态的进度命令行实时盯进度$ watch btrfs filesystem usage -T /mnt; btrfs balance status /mnt避坑指南ENOSPC 不是磁盘写满了balance 报错No space left on device是新手最大的坑。它需要的不是剩余空间而是工作空间work space——即完全空闲、没有任何块组的设备空间用来先建新块组、搬数据、再删旧块组。计算方法btrfs filesystem show输出size 53.90GiB, used 51.90GiB → 空闲工作空间 53.90 - 51.90 2.00GiB应对方案先跑btrfs balance start -dusage0 /mnt清空块组它不消耗工作空间删除大文件/旧快照释放空间后重试转换到条带类 profileRAID0/5/6时每块盘都需要足够工作空间且被中断的转换会留下部分填充的块组继续占用空间源码与文档入口想深入原理或查阅完整参数这些文件值得一看完整 man page 源文件Documentation/btrfs-balance.rst全部过滤器profiles / usage / devid / drange / vrange / limit / stripes / soft详解Documentation/ch-balance-filters.rst单盘加盘、逐步转 RAID1 的典型用例Documentation/ch-volume-management-intro.rstbalance 子命令的用户态实现含 cancel / pause / resume / statuscmds/balance.c一句话总结先filesystem df摸清底数用usage从小往大拧空间用convertsoft换布局随时pause/resume兜底——这就是 btrfs balance 的全部心法。【免费下载链接】btrfs-progsDevelopment of userspace BTRFS tools项目地址: https://gitcode.com/gh_mirrors/bt/btrfs-progs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考