什么是稀疏文件
稀疏文件允许文件里存在“空洞”:逻辑上占用的字节数很大,实际只分配了写过的那些块,未写入部分不占磁盘。ls -l 显示的是逻辑大小(apparent size),du 显示的是实际占用块,两者可能相差几个数量级。虚拟机镜像、数据库数据文件、容器镜像层都大量使用这一特性,因此复制、打包、传输时如果不保持稀疏,目标端空间会直接暴涨。
基本信息
| 逻辑大小 | ls -l / ls -lhs 的首列 |
|---|---|
| 实际占用 | du -h、du --apparent-size 可对照逻辑值 |
| 保持稀疏复制 | cp --sparse=always、rsync -S |
| 保持稀疏打包 | tar -S、cpio --sparse |
| 创建方式 | truncate -s、dd seek= 写入 |
| 支持文件系统 | ext4、XFS、btrfs 等,部分场景需开启 |
典型使用场景
- 虚拟机与容器镜像:稀疏是常态,复制不对会瞬间吃掉几倍空间
- 数据库数据文件与预分配文件:逻辑大小固定但实际按写入增长
- 备份与迁移:确认工具是否保留稀疏,避免备份体积虚高
- 排查空间异常:du 小、ls 大,或备份后空间暴涨都先怀疑稀疏丢失
- 测试环境构造大文件:用 truncate 快速造出 GB 级逻辑文件而不占空间
对照与保持
对照与保持
ls -lhs sparse.img # 左侧是实际占用,右侧是逻辑大小
du -h sparse.img # 实际占用
du --apparent-size -h sparse.img # 逻辑大小
truncate -s 10G sparse.img # 造一个 10G 逻辑大小的稀疏文件
tar -S -cf sparse.tar sparse.img # 打包时保持稀疏
cp --sparse=always sparse.img copy.img # 复制时保持稀疏
rsync -S --sparse sparse.img backup/ # 同步时保持稀疏
filefrag -v sparse.img | head # 查看块分布,确认空洞工具与稀疏支持
| 工具 | 保持稀疏的参数 | 说明 |
|---|---|---|
| cp | --sparse=always | 默认可能按数据填充 |
| rsync | -S(--sparse) | 网络传输两侧都要注意 |
| tar | -S | 解包端同样要支持 |
| scp | 无专门参数 | 跨机通常会被填实 |
| dd | conv=sparse | 配合输出文件使用时有效 |
文件系统还支持 punch hole 主动打洞(如 fallocate -p、fstrim 触发的镜像收缩),删除文件中间区域后同样能回收空间。
备份与镜像迁移前务必确认稀疏是否保留:把 100GB 逻辑大小的镜像填实到 20TB 的目标池,是很常见的故障场景。