Linux上详细的稀疏文件信息


11

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

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

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

仅检查足够长的零字符串(GNU cp,rsync等使用的方法)无法正常工作:

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

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

Answers:


7

关于SO有类似的问题。在目前接受的答案通过@ephemient建议使用一个ioctl名为fiemap这是在记录linux/Documentation/filesystems/fiemap.txt。引用该文件:

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

听起来这就是您要查找的信息。文件系统支持还是可选的:

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

为支持SEEK_DATASEEK_HOLE参数lseek,你从Solaris中提到,根据在Linux 3.1中加入的手册页,所以你可能会使用为好。在fiemap ioctl似乎是旧的,所以它可能是在不同的Linux版本更便携的现在,而lseek可能是跨操作系统的Solaris是否具有相同的更便携。


2
您可以通过使用获得此FIEMAP信息--fibmap中的 hdparm效用。请参阅手册。
Totor

2

有一个名为sparseutils的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

1

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

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


1
必须具有某种与FS无关的方式来获取此信息。直接从inode读取绝对不是一种选择。我一直在寻找SEEK_DATA和的SEEK_HOLE参数lseek(),例如Solaris中的参数:opensolarisforum.org/man/man2/lseek.html
Juliano

@Juliano看看Linux的lseek选项没有这些选项。Solaris支持很少的文件系统,因此支持起来相对容易。Linux支持多种文件系统,其中一些不支持稀疏文件。对SEEK_DATA / SEEK_HOLE的支持将在代码中强加对所有文件系统的支持。这些方法可能无法达到您的期望。有关Sun方面的更多数据,请参见blogs.sun.com/bonwick/entry/seek_hole_and_seek_data
BillThor 2011年

1
文件系统不需要使用lseek()接口支持任何内容,内核会通过模块属性列出支持SEEK_DATA / SEEK_HOLE的文件系统模块。在联机帮助页本身和链接的博客中:“对于不提供有关孔的信息的文件系统,文件将被表示为一个完整的数据区域。”
朱利诺

@Juliano仍然需要内核mod以及对lseek的更改。根据博客条目,这是Sun的相当新的功能。为了使其正常工作,还需要修改文件系统代码。当然,需要更改所有支持稀疏文件的文件系统以提供内核挂钩。
BillThor 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.