BTRFS文件系统显示大量空闲空间却提示空间不足,执行balance操作无效的解决求助
BTRFS文件系统显示大量空闲空间却提示空间不足,执行balance操作无效的解决求助
我完全懂你现在的糟心情况——明明btrfs filesystem usage显示预估有9.05TiB的空闲空间,但实际创建大文件时却直接提示“空间不足”,试了各种balance操作也只挤出几GB空间,完全达不到预期的可用容量,这确实挺让人头疼的。
先帮你拆解下问题根源:从你贴出的文件系统使用详情来看,核心问题是数据、元数据在新旧磁盘上的分布严重不均衡:
- 新添加的
/dev/sde(20TB盘)只被分配了109GiB用于数据存储,剩下的18.08TiB全是未分配状态,相当于这块大硬盘几乎没参与数据存储; - 老的三块盘(
sda/sdb/sdc)的RAID1数据分区已经100%用满了,元数据分区也快到98%的使用率,而新盘完全没参与元数据的存储。
之前你用的-dconvert=raid1,soft这种soft模式,只会在写入新数据时利用新磁盘空间,不会主动把老盘上的数据移动到新盘来释放空间,所以根本解决不了老盘已经写满的问题。
给你几个针对性的解决步骤,按顺序来:
1. 先确认后台balance的状态
首先得看看之前运行的后台balance有没有完成,避免多个balance操作冲突:
btrfs balance status /data
如果显示还在运行,建议先等它结束;如果已经卡住了,可以先暂停:
btrfs balance pause /data
2. 强制重新平衡数据分区,让新盘参与RAID1存储
需要用激进一点的参数,强制把所有数据重新分布到4块磁盘的RAID1阵列中:
btrfs balance start -dconvert=raid1 -dusage=100 --background /data
-dconvert=raid1:强制将所有数据转换为RAID1格式,并均匀分布到所有可用磁盘;-dusage=100:处理所有已使用的数据块(不管使用率多少);--background:后台运行,避免占用前台终端,你可以用btrfs balance status随时查看进度。
这个操作会非常慢(毕竟要移动几十TB的数据),请确保系统稳定,不要中途断电。
3. 同步平衡元数据分区
等数据平衡完成后,再处理元数据的分布问题,让新盘也参与元数据的RAID1存储,避免元数据分区提前占满:
btrfs balance start -mconvert=raid1 -musage=100 --background /data
当然也可以把数据和元数据的平衡合并成一条命令一起执行,不过这样会更耗系统资源,时间也会更长,根据你的系统负载情况选择:
btrfs balance start -dconvert=raid1 -dusage=100 -mconvert=raid1 -musage=100 --background /data
4. 验证结果
等所有平衡操作完成后,再运行以下命令查看空间使用情况:
btrfs filesystem usage /data
此时你应该能看到/dev/sde的数据分区被正常分配,预估空闲空间也能正常被使用了,再试试创建大文件应该就不会提示空间不足了。
额外注意事项
- 平衡过程中如果必须中断,一定要用
btrfs balance cancel /data,不要直接断电或强制终止进程,避免损坏文件系统; - 平衡过程中需要少量临时空间,确保系统本身还有剩余可用空间;
- 之后可以定期运行轻量的balance操作,比如
btrfs balance start -dusage=50 -musage=50 /data,防止再次出现空间分布不均衡的问题。
备注:内容来源于stack exchange,提问作者Johannes Bauer
相关产品推荐
相关产品推荐

