Answers:
关于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是否具有相同的更便携。
有一个名为sparseutils的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
这取决于文件系统。我不认为这是一个电话,这可能就是为什么许多工具不能很好地处理稀疏文件复制的原因。GNU工具链使用搜索零的大块,因为这使它们可以删除未使用的已分配块。许多复制工具会将稀疏文件转换为分配了所有块的文件。
您可能必须打开inode并解析结果。索引节点格式取决于文件系统。某些文件系统可能在inode本身中包含部分数据。
SEEK_DATA
和的SEEK_HOLE
参数lseek()
,例如Solaris中的参数:opensolarisforum.org/man/man2/lseek.html
--fibmap
中的hdparm
效用。请参阅手册。