什么是“稀疏文件”("sparse file"),可以识别它们吗?
环境
- 红帽企业版Linux 5、6和7
问题
- 文件的ls和df之间的文件大小不一致。
-
该文件报告较大(128Gb),但文件系统甚至没有那么大。这怎么可能?
决议
- 有问题的文件可能是稀疏文件。
- 稀疏文件是指其元数据报告一个大小的文件,但是文件的实际数据消耗的大小不同。
- 稀疏文件是有效使用磁盘空间的常用方法。
-
您可以使用
ls -lsh
命令查看稀疏文件。这提供了两个大小列: -
第一列是实际使用的磁盘空间。该文件实际上消耗了12Gb的空间。
- 第二个大小列提供文件元数据的大小。该文件的元数据报告它是24Gb文件。
稀疏文件的使用
-
要复制稀疏文件,必须使用能够识别稀疏文件的命令。
-
cp --sparse=always /source/filename /destination/filename dd if=/source/filename of=/destination/filename conv=sparse rsync -S /source/filename root@hostname:/destination/filename
-
使用
scp
实用程序复制文件将导致“非稀疏”文件扩展为完整大小。
根本原因
- 在稀疏文件中,与那些区域保存非零数据时相比,文件全为0x00的部分被压缩以占用更少的空间。
诊断步骤
可以使用truncate
命令轻松创建稀疏文件:
# truncate --size=1G sparsefile.bin
我们可以使用ls -lsh
查看稀疏文件的大小:
# ls -lsh sparsefile.bin 0 -rw-r--r-- 1 root root 1.0G Nov 6 09:00 sparsefile.bin
该文件占用0字节的空间,但是其元数据报告文件大小为1Gb。
我们可以将1Mb写入该文件:
# for i in {1..1048576}; do echo -n "a" >> sparsefile.bin; done
然后再次检查其大小:
# ls -lsh sparsefile.bin
1.0M -rw-r--r-- 1 root root 1.1G Nov 6 09:01 sparsefile.bin
该文件现在消耗了1Mb的实际空间,但是元数据报告的使用量为1.1Gb。元数据的轻微增长是由于分配了文件系统块来存储文件的数据。
将此文件与相同大小的完全分配的文件进行比较:
# dd if=/dev/zero of=fullfile.bin bs=1M count=1024 conv=fsync # ls -lsh fullfile.bin 1.1G -rw-r--r-- 1 root root 1.0G Nov 6 09:05 fullfile.bin
该文件实际消耗了1Gb以上的空间,其元数据报告的文件大小也为1Gb。
我们可以使用stat
命令从这两个文件中获取更多信息:
在上方,我们看到稀疏文件比完整文件消耗更少的文件系统块。
我们可以使用filefrag
命令收集文件系统分配信息:
# filefrag sparsefile.bin
sparsefile.bin: 1 extent found
# filefrag fullfile.bin
fullfile.bin: 29 extents found
上面我们可以看到,稀疏文件已在一个较小的范围内分配,而完整文件已在多个范围内分配。
可以使用以下基本示例在C中创造稀疏文件:
#include <stdio.h> int main() { FILE *fp; fp = fopen("hello.txt", "w+"); fseek(fp, 1048576, SEEK_CUR); fputs("Hello\n", fp); fclose(fp); return 0; }
这将创建一个1 MB的文件,放入“ Hello”写入其中。在strace
系统调用跟踪器下运行以上命令显示:
我们可以看到我们的文件是稀疏创建的,它报告的大小为1Mb,但仅消耗一个4kb的文件系统块:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!