Linux下操作稀疏文件的函数有哪些?

Linux下操作稀疏文件的函数有哪些?

Linux下操作稀疏文件的函数有哪些? (假设用 C 语言,非常欢迎有关其他系统的注释)例如:

  • 通过删除文件内部的一部分来在文件内部打孔
  • 研究结构,例如生成表示分离的连续数据块的开始和结束的对序列
  • 通过重新分配块范围(即不移动实际数据),在某个时刻将文件分成两部分
  • 调查索引节点和其他相关方面? (也许可以以写时复制的方式将一些块分配给多个文件?)

语境:

我想到的最初问题是在man rsync选项--sparse之后:

为什么rsync选项--sparse与 冲突--inplace

是文件系统调用api的限制吗?

从数据结构的角度来看,如果源稀疏文件被视为非连续数据块的序列,那么我期望“r”同步在目标上取消分配源中不存在的那些范围,分配丢失的范围,其余相应地更新(即使使用标准 rsync 滚动哈希算法,将所有剩余序列视为一个序列,或在每个序列上单独运行)。

参考:

man rsync
   -S, --sparse
          Try to handle sparse files efficiently so they take up less space on the destination.  Conflicts with --inplace because it's

不可能以稀疏方式覆盖数据。

答案1

稀疏文件被设计为对用户空间透明:通过寻找过去未使用的区域来创建空洞,并被读取为零块。使用标准用户空间 API 无法检测到它们,至少目前还不能——因为指出经过斯蒂芬·查泽拉斯,至少 Solaris 和 Linux 支持SEEK_DATASEEK_HOLE lseek(2)允许用户空间程序查找漏洞的标志,这些标志可能是添加到 POSIX在某一点。

rsync这解释了'--sparse--inplaceoptions: 写入现有文件时的不兼容性便携式的,无法在现有数据中创建漏洞。--sparse其工作原理是重写整个文件,跳过(长)零序列,这会导致操作系统和支持它们的文件系统上出现稀疏文件。

在 Linux 上,您可以使用以下命令检索文件稀疏性的详细信息fiemap读写控制, 和e2fsprogs'filefrag(8);看Linux 上详细的稀疏文件信息。在写作方面,您可以使用fallocate(2)(以及方便的fallocate(1)实用程序)在现有文件中打孔,如果孔覆盖整个块,则使其稀疏。支持取决于文件系统 - 当前仅 XFS、btrfs、ext4 和 tmpfs 支持这些操作。最近的内核(自 4.1 起)和非常最近的版本util-linux支持在文件中插入漏洞,将内容转移到漏洞之后(fallocate -i在 2.30 中引入util-linux,应该很快就会发布)。

您的最后两个问题是文件系统手术,我不确定是否有任何通用系统调用或 ioctl 可用于执行此类操作。reflink- 兼容的文件系统允许文件共享其内容;这可以通过使用来实现和ioctlFICLONEFICLONERANGE

相关内容