【问题标题】:Does ftruncate() copy data if I truncate to a larger size than original?如果我截断到比原始尺寸更大的尺寸,ftruncate() 是否会复制数据?
【发布时间】:2013-06-13 17:43:54
【问题描述】:

http://pubs.opengroup.org/onlinepubs/7908799/xsh/ftruncate.html 的描述来看,ftruncate 的工作原理还不是很清楚。

如果假设,我将文件截断为 1GB,然后截断为 2GB。如果 ftruncate 在旧的 1GB 之后没有找到额外的 1GB 空间,是否会将数据复制到新位置以保持文件连续?

【问题讨论】:

  • ftruncate 函数只是要求文件系统更改文件的大小。文件系统如何做到这一点完全取决于该文件系统。网络文件系统的执行方式与内存文件系统的执行方式完全不同,内存文件系统的执行方式与基于磁盘的文件系统的执行方式完全不同。

标签: linux file unix filesystems


【解决方案1】:

没有

文件开始时不连续。使用了树状结构的块图,因此只需要向图中添加更多块。

此外,虽然 Posix 并不要求,但所有真正的类 Unix 系统都支持sparse files,,所以大多数情况下它只需要增加长度而不实际添加块。稍后的读取将注意到(在内核内部)缺少支持块,并且内核将知道只返回零。稍后对未支持区域的写入自然需要最终开始分配块。

【讨论】:

  • 我认为第二段是正确的答案。第一段不一定适用于所有文件系统类型(xfs、btrfs、ext[34]、jfs、[v]fat 等)。另外,我认为,在不支持稀疏文件的 [v]fat 等文件系统上,ftruncate() 需要填零或返回错误...
  • @twalberg,当然,您在技术上是正确的,但请考虑 SO 的上下文,特别是专门用 both linux 和 unix 标记的问题。我认为准确概括原生 ffs/extN 文件系统是合理的。
  • 在企业环境中,我可以很容易地指向不同的 Linux 系统,一些完全运行 XFS 文件系统,一些完全运行 reiserfs,一些开始使用 btrfs,还有一些是由于双-boot 要求,具有本机 vfat 分区。 OP 没有说明所涉及的特定配置,所以我只想指出,可能没有一刀切的答案...
【解决方案2】:

文件系统提供对块设备的间接性,块设备也可以有层和间接性。磁盘也提供间接性。

确实,文件在第一个ftruncate 之前不一定是连续的。

如果您的目标是保持数据连续,您可以在mkfsmount 期间尝试文件系统特定的调整。另外,你可以试试fallocate(或posix_fallocate),而不是ftruncate

【讨论】:

    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 2023-02-04
    • 2013-04-17
    • 2012-05-31
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多