虚拟机镜像 du -h 是 2.1G,打包成 tar.gz 变成 41G,备份盘一晚上就满。ls -l 看到逻辑大小是 40G,实际占用只有 2G。日志里能对上时间点,这种反而好排。
稀疏文件里没写过的区间不占块,读出来却是全零。普通 tar 按逻辑大小逐字节读,零也被当数据压缩,压缩率再高也扛不住几十 G 的零。这一点先确认清楚,后面就不用反复试。
ls -ls disk.img du -h disk.img tar --sparse -czf disk.img.tar.gz disk.img
「稀疏文件备份膨胀」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:tar 加 --sparse 让空洞按 SEEK_HOLE 处理;压缩前用 du 和 ls 两个数字对比确认是稀疏文件;cp 用 --sparse=always 保留空洞;备份后 restore 一次 校验实际占用而不是逻辑大小。
结果对不对很好判断,打包产物回到 2G 左右 解包后 du 显示占用和原文件一致。
