首页/数据/备份与容灾速查/稀疏文件备份处理

稀疏文件备份处理

虚拟机镜像与数据库文件常含大量空洞(sparse),不做处理会把空洞当实数据拷贝,备份体积明显膨胀;tar 与 rsync 都有对应开关。

备份与容灾速查数据更新于 2026-10-13

稀疏文件是什么

稀疏文件(sparse file)把大段连续零值不真正落盘:一个逻辑大小 100G 的镜像实际占用可能只有 2G。虚拟机镜像、预分配的数据库数据文件、容器镜像层都是这类文件。如果备份工具把空洞当成实数据读取,归档体积会按逻辑大小膨胀,备份窗口、网络传输与存储成本都会被拖高,所以整条备份链路都要支持保留空洞。

基本信息

适用平台Linux(GNU tar、rsync、cp、dd 均有对应选项)
识别方法ls -lh 与 du -h 结果差距大,即存在空洞
tar打包时加 --sparse 保留空洞结构
rsync加 -S(--sparse)保留空洞,配合 -a 使用
cp / ddcp --sparse=always;dd 可用 conv=sparse 写出空洞
关键要点链路上任何一环展开空洞,最终体积就按逻辑大小算

典型使用场景

  • 虚拟化平台镜像备份:qcow2、raw 镜像空洞比例往往很高
  • 数据库文件预分配:数据文件预留空间但大部分尚未写入
  • 跨主机 rsync 迁移大文件:不保留空洞会白传几十倍数据量
  • 容器与镜像仓库同步:镜像层常见稀疏结构
  • 归档体积复盘:对比归档体积与源文件逻辑大小,判断是否被展开

保留稀疏结构

保留稀疏结构
# 先确认是否稀疏:逻辑大小 100G,实际占用 2G
ls -lh /var/lib/libvirt/images/vm.img
 du -h /var/lib/libvirt/images/vm.img
# 打包时保留空洞(GNU tar)
tar --sparse -cf /backup/vm.img.tar /var/lib/libvirt/images/vm.img
# 远程同步时保留空洞
rsync -aS --sparse /var/lib/libvirt/images/vm.img backup@10.0.0.5:/backup/images/
# 本地复制也保留空洞
cp --sparse=always vm.img vm-copy.img
# 还原后复核实际占用,确认空洞没被展开
du -h --apparent-size /backup/images/vm.img && du -h /backup/images/vm.img

判断与验证读法

检查项含义正常/异常
ls -lh 大小文件逻辑大小远大于实际占用说明含大量空洞
du -h 占用磁盘实际占用与逻辑大小的差值就是空洞量
归档后体积备份产物的实际大小接近逻辑大小说明空洞被展开
还原后实际占用还原文件在目标盘的占用比源文件明显偏大说明链路展开过空洞
不同实现对稀疏的识别方式存在差异:现代 GNU 工具会用文件系统的空洞探测能力自动判断,部分精简系统(busybox)与较老工具不会。跨发行版归档前,先在测试环境做一次「打包 → 还原 → du 复核」验证。
网络文件系统与部分对象存储网关对稀疏支持有限:文件写进去以后空洞可能被实体化,跨系统搬运后体积反弹属于常见现象,必要时改用压缩归档传输。

易错点

  • 用不识别空洞的工具复制(部分平台的 cp、mv、dd 默认行为不同):体积按逻辑大小膨胀,备份窗口直接失控
  • dd 整盘对拷未加 conv=sparse:空洞被写成实数据,目标盘容量可能直接不够
  • 只在一段链路上开 --sparse,中间又经过一次普通复制:前面的优化全部作废
  • 用 du 判断文件能不能装下目标盘:稀疏文件按实际占用算,搬错工具就会超出容量

数据来源与参考

  • GNU tar 手册(--sparse)
  • rsync 手册(-S/--sparse)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌