Linux 上详细的稀疏文件信息

Linux 上详细的稀疏文件信息

我有一个稀疏文件,其中仅分配了一些块:

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

我想知道实际分配了文件的哪些块。是否有系统调用或内核接口可用于获取分配列表或文件漏洞列表?

简单地检查是否有足够长的零字符串(GNU cp、rsync 等使用的方法)无法正常工作:

~% cp example example1  
~% du -h example1 
32K     example1

它检测到实际分配的其他零序列。

答案1

SO 上有类似的问题。这目前接受的答案经过@ephemient建议使用ioctl记录fiemaplinux/Documentation/filesystems/fiemap.txt。引用该文件:

fiemap ioctl 是用户空间获取文件范围映射的有效方法。 fiemap 返回范围列表,而不是逐块映射(例如 bmap)。

听起来这就是您正在寻找的信息。文件系统的支持也是可选的:

希望支持 fiemap 的文件系统必须->fiemap 在其inode_operations结构上实现回调。

对你的支持SEEK_DATASEEK_HOLE论据lseekSolaris 中提到的根据Linux 3.1添加手册页,所以你也可以使用它。该版本fiemap ioctl似乎较旧,因此目前可能在不同的 Linux 版本之间更可移植,而lseek如果 Solaris 有相同的操作系统,则可能在不同操作系统之间更可移植。

答案2

有一个 python 程序集合,称为稀疏工具使用SEEK_HOLESEEK_DATA来确定文件的哪些部分表示为空洞以及哪些部分是数据。用法非常简单。mksparse可用于根据某些给定布局生成稀疏文件。

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemap程序可用于将布局打印到标准输出:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

答案3

这取决于文件系统。我不相信它们是一个调用,这可能就是为什么许多工具不能很好地处理稀疏文件的复制的原因。 GNU 工具链使用搜索大的零块,因为这允许它们删除未使用的分配块。许多复制工具会将稀疏文件转换为分配了所有块的文件。

您可能必须打开索引节点并解析结果。索引节点格式取决于文件系统。某些文件系统的索引节点本身可能包含部分数据。

相关内容