CentOS 7.9 备份服务器的 ext4 分区,rsync 用 --link-dest 做每日增量,跑了半年后 df -i 显示 inode 用满,df -h 还有 40% 空间,新备份开始报 No space left on device。
一开始怀疑是「保留策略只删数据不删目录,空目录和链接残留」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。每天的备份目录都为每个文件建一个硬链接,小文件多时 inode 消耗极快。也可能是备份源里有几百万个缓存小文件,没有排除。
不容易想到的是,文件系统的 inode 总数在格式化时就固定了。
动手时先确认是 inode 还是块空间满了
df -i /backup && df -h /backup
接着统计备份目录里的文件数量
find /backup/2026-11-11 -maxdepth 1 | wc -l
然后排除缓存目录后再做硬链接增量
rsync -aHAX --delete --exclude=cache/ --exclude=tmp/ --link-dest=/backup/current /data/ /backup/2026-11-11/
等前面都确认过,再按保留天数清理旧目录
find /backup -maxdepth 1 -type d -mtime +30 -exec rm -rf {} +
别只看报错消失,验证要多做一步。df -i 使用率降到 60% 以下,新备份能完整写入,硬链接数量和保留天数对得上。
这里还有个坑。link-dest 的硬链接只在同一文件系统内有效,跨分区会退化成完整拷贝,备份盘要单独挂载。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
