排查Tar归档磁盘空间不足,需区分目标位置空间不足与临时空间不足:先用df -h看目标分区使用率及/tmp是否为tmpfs,再用df -i查inode耗尽;若/tmp过小,可设TMPDIR指定临时目录;注意已删未释放文件(lsof +L1)和压缩过程所需缓冲空间。

排查 Tar 归档时磁盘空间不足的错误,核心是区分“归档目标位置空间不足”和“归档过程临时空间不足”两种情况。Tar 本身不压缩时只做打包,但加 -z(gzip)、-J(xz)等参数后,会在内存或临时文件中处理压缩流——若目标分区或 /tmp 所在分区已满,就会报 No space left on device 或卡住无响应。
确认归档目标分区是否真的满了
运行 df -h,重点看你要写入的目录挂载点(比如 /backup、/home 或当前目录所在分区):
- 如果
Use%达到 95% 以上,尤其是显示Avail为0G,说明目标位置确实没空间了 - 注意:
/tmp有时是独立挂载的 tmpfs(内存虚拟文件系统),df -h中会显示为tmpfs行;若它被占满,也会导致 tar 压缩失败 - 别忽略
df -i——Inode 耗尽时,即使还有空间,tar 也无法创建新文件(如分卷归档、临时压缩缓存)
检查 tar 是否在用 /tmp 临时中转
Tar 在压缩大文件时(尤其用 -z 或 -J),可能依赖 /tmp 存放中间数据。如果 /tmp 是独立小分区(如仅 1–2G),很容易撑爆:
- 执行
df -h /tmp查看其使用率 - 临时指定其他位置作为 TMPDIR:
TMPDIR=/data/tmp tar -czf archive.tar.gz /large/dir(需提前创建好/data/tmp并确保有写权限) - 也可用
strace观察 tar 是否在写/tmp:strace -e trace=openat,write tar -czf test.tar.gz /small/file 2>&1 | grep tmp
识别归档过程中“已删未释放”的隐藏占用
常见于日志服务(如 rsyslog、journald)正在写入的文件被 tar 读取时又被轮转删除,但进程仍持有句柄——空间无法释放,df 显示已满,du 却统计不到:
- 用
lsof +L1查找已删除但仍被打开的文件(+L1 表示 link count=0) - 重点关注
journal、rsyslogd、dockerd等长期运行进程的 fd - 重启对应服务(如
sudo systemctl restart rsyslog)可立即释放空间
避免归档时二次放大空间压力
Tar 压缩不是原地操作:它一边读源文件,一边写压缩包。若源目录大小为 20G,目标分区只剩 15G 空闲,即使最终压缩包只有 8G,过程中也极可能因临时空间不够而失败:
- 估算安全余量:目标分区空闲空间 ≥ 源数据未压缩大小 × 1.2(留出压缩缓冲和元数据开销)
- 优先用
--tape-length或分卷归档(split配合tar -c)避开单文件写入瓶颈 - 对超大目录,改用
rsync --archive --compress流式同步,避免本地生成完整压缩包


















