首页/系统/Linux 内核与性能调优速查/稀疏文件与 du/ls 差异

稀疏文件与 du/ls 差异

稀疏文件逻辑大小远大于实际占用:ls 看逻辑、du 看实际块;打包传输要用支持稀疏的工具保持体积优势。

什么是稀疏文件

稀疏文件允许文件里存在“空洞”:逻辑上占用的字节数很大,实际只分配了写过的那些块,未写入部分不占磁盘。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无专门参数跨机通常会被填实
ddconv=sparse配合输出文件使用时有效
文件系统还支持 punch hole 主动打洞(如 fallocate -p、fstrim 触发的镜像收缩),删除文件中间区域后同样能回收空间。
备份与镜像迁移前务必确认稀疏是否保留:把 100GB 逻辑大小的镜像填实到 20TB 的目标池,是很常见的故障场景。

易错点

  • 用不支持稀疏的复制方式会把文件填实,目标端空间暴涨,迁移前先确认工具参数
  • 镜像类文件(qcow2 等)的解释要按各自格式理解,不都是稀疏文件,空间与快照占用的算法各有规则
  • 看到 du 小、ls 大就以为文件损坏:这正是稀疏的正常表现,判断实际占用应以 du 为准
  • 在空间统计与容量规划里混用两个口径,会把预留量算重或算漏

数据来源与参考

  • coreutils 文档 du(1)
  • GNU tar 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌