稀疏文件是什么
稀疏文件(sparse file)把大段连续零值不真正落盘:一个逻辑大小 100G 的镜像实际占用可能只有 2G。虚拟机镜像、预分配的数据库数据文件、容器镜像层都是这类文件。如果备份工具把空洞当成实数据读取,归档体积会按逻辑大小膨胀,备份窗口、网络传输与存储成本都会被拖高,所以整条备份链路都要支持保留空洞。
基本信息
| 适用平台 | Linux(GNU tar、rsync、cp、dd 均有对应选项) |
|---|---|
| 识别方法 | ls -lh 与 du -h 结果差距大,即存在空洞 |
| tar | 打包时加 --sparse 保留空洞结构 |
| rsync | 加 -S(--sparse)保留空洞,配合 -a 使用 |
| cp / dd | cp --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 复核」验证。
网络文件系统与部分对象存储网关对稀疏支持有限:文件写进去以后空洞可能被实体化,跨系统搬运后体积反弹属于常见现象,必要时改用压缩归档传输。