BTRFS RAID10可用空间远低于预期求助(Rockstor/CentOS7)
咱先把你遇到的问题理清楚:在Rockstor(基于CentOS7)上用6块8TB盘搭了BTRFS RAID10,df -h显示总容量22TiB、已用3.3TiB,但可用只有13TiB(差了5.7TiB),元数据重平衡没效果,后来随着数据写入,可用空间又涨了2.2TiB。这事儿其实是BTRFS的特性导致的,不是故障,咱一步步分析:
1. 先搞懂BTRFS RAID10的容量计算逻辑
6块8TB盘做RAID10,理论容量是(盘数/2)*单盘容量也就是3*8=24TB,但实际格式化后因为分区表、文件系统本身的overhead,显示22TiB是完全正常的,这部分没问题。
2. 可用空间“缩水”的核心原因
(1)BTRFS的动态预留空间机制
BTRFS默认会预留一部分空间给元数据、快照、平衡操作,尤其是RAID模式下,元数据默认用RAID1存储(镜像),这会额外占用空间。刚创建的文件系统,系统会预分配较多的元数据预留空间,这部分空间在df里会被算成“已用”但实际还没被真正使用——这就是你后来写入数据后,可用空间自动增长2.2TiB的原因:系统把未用到的预分配元数据空间归还给了数据池。
(2)df命令的局限性
df是为传统文件系统设计的,它没办法区分BTRFS里的数据池和元数据池,所以显示的“已用空间”包含了元数据预留、快照等隐藏占用。要查看真实的空间分布,必须用BTRFS专属命令:
btrfs filesystem df /你的挂载点路径
这个命令会明确列出Data和Metadata的已用/可用,以及对应的RAID级别(比如Metadata是RAID1的话,实际占用会是元数据大小的2倍)。
(3)Rockstor的默认配置可能添了“隐藏占用”
Rockstor默认会开启自动快照功能,用来做系统备份或版本回滚,这些快照会占用空间但不会在df里直接显示。你可以用下面的命令查看所有子卷和快照:
btrfs subvolume list -a /你的挂载点路径
如果有不需要的自动快照,删除后就能释放对应空间。
3. 具体排查与解决步骤
步骤1:查看真实空间分布
先跑btrfs filesystem df /mountpoint,看清楚Data和Metadata各自的占用情况。比如如果Metadata显示已用很多,那可能是预留的元数据空间还没被释放。
步骤2:检查并清理快照/子卷
用btrfs subvolume list -a检查有没有多余的快照,删除无用快照的命令是:
btrfs subvolume delete /挂载点/快照路径
步骤3:针对元数据做彻底重平衡
之前的重平衡可能没指定元数据,试试专门针对元数据执行平衡:
btrfs balance start -m /你的挂载点路径
注意:这个操作会占用IO资源,最好在系统低负载时执行。
步骤4:调整预留空间(可选)
如果你确定不需要那么多元数据预留,可以调整挂载参数(编辑/etc/fstab),添加space_cache=v2(CentOS7的BTRFS内核支持这个参数),或者执行下面的命令强制释放预留空间:
btrfs filesystem resize max /你的挂载点路径
⚠️ 注意:预留空间是BTRFS防止碎片化和元数据溢出的保护机制,除非你明确知道自己在做什么,否则不建议随意调整。
总结
你遇到的情况是BTRFS的正常特性,不是文件系统故障。随着你持续写入数据,系统会逐步把未使用的元数据预留空间释放出来,可用空间会慢慢接近理论值。以后排查BTRFS空间问题,一定要用btrfs filesystem df而不是只看df的输出。
内容的提问来源于stack exchange,提问作者Ray Foss

