用 mergerfs 把三块 4T 数据盘合并成 /storage 存放监控录像,某天其中一块写满之后,新录像全部报 No space left on device,另外两块明明还有 3T。

一开始怀疑是「create 策略配成 epmfs 之外的固定值,写入无法迁到空闲分支」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。mergerfs 默认的分配策略会把新文件放到剩余空间最多的分支,但目录已存在的文件仍写原分支。另一种情况是已有子目录被固定在某一块盘上,那块写满后该目录的写入全部失败。

不容易想到的是,mergerfs 的空间统计按各分支合计,应用预检通过但实际写失败。

第一件事是看各分支的实际剩余

df -h /storage && ls -l /storage/.mergerfs 2>/dev/null; findmnt -t fuse.mergerfs -o OPTIONS

接着确认目录落在哪个分支上

getfattr -n user.mergerfs.basepath /storage/record 2>/dev/null || ls -l /mnt/disk*

调整策略到按剩余空间分配

mount -o remount,category.create=mfs,moveonenospc=true /storage

末了把写满分支上的目录迁到空闲盘

mv /mnt/disk1/record/2026-08 /mnt/disk3/record/ 2>/dev/null; df -h /mnt/disk1

改完先别撤,确认这几项。df 里三个分支的剩余空间重新均衡,新录制的文件能正常落盘且分布在不同分支,应用日志不再出现 No space left。

容易忽略的是,moveonenospc 只在写入失败时才迁移,无法救回已经写坏的文件;录像这类按目录归档的业务最好在应用层按盘分目录,别全靠合并层。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189