我有一个稀疏文件,其中仅分配了一些块:
~% 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
记录fiemap
在linux/Documentation/filesystems/fiemap.txt
。引用该文件:
fiemap ioctl 是用户空间获取文件范围映射的有效方法。 fiemap 返回范围列表,而不是逐块映射(例如 bmap)。
听起来这就是您正在寻找的信息。文件系统的支持也是可选的:
希望支持 fiemap 的文件系统必须
->fiemap
在其inode_operations
结构上实现回调。
对你的支持SEEK_DATA
和SEEK_HOLE
论据lseek
Solaris 中提到的根据Linux 3.1添加手册页,所以你也可以使用它。该版本fiemap ioctl
似乎较旧,因此目前可能在不同的 Linux 版本之间更可移植,而lseek
如果 Solaris 有相同的操作系统,则可能在不同操作系统之间更可移植。
答案2
有一个 python 程序集合,称为稀疏工具使用SEEK_HOLE
和SEEK_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 工具链使用搜索大的零块,因为这允许它们删除未使用的分配块。许多复制工具会将稀疏文件转换为分配了所有块的文件。
您可能必须打开索引节点并解析结果。索引节点格式取决于文件系统。某些文件系统的索引节点本身可能包含部分数据。