【问题标题】:How to remove some blocks from a sparse file on a ext2/ext3 filesystem如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块
【发布时间】:2009-08-12 09:36:10
【问题描述】:

ext2/ext3 文件系统在你写稀疏文件的时候会自动分配块,但是当我不再想要其中的一些块时,我没有办法做到这一点。感觉就像在没有 free() 的情况下使用 malloc()。 是否可以“释放”一些稀疏文件块?如果是,怎么做? 不要告诉我将其复制到新文件中。太无聊了,需要很大的磁盘空间。

【问题讨论】:

    标签: linux filesystems


    【解决方案1】:

    从 Linux 2.6.38 开始,fallocate 有一个名为 FALLOC_FL_PUNCH_HOLE 的标志,它应该做你想做的事情,即在任意位置释放文件空间。

    fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, offset, len);
    

    将在描述符 fd 指示的文件中打一个洞。该孔将从offset 开始,长度为len,均以字节为单位。实际上只会删除整个块,部分块将被清零。

    【讨论】:

    • 所以这个特性最终被添加到Linux内核中。感谢您回答我 3 岁的问题。 :D
    【解决方案2】:

    你唯一能做的就是调用 ftruncate() 来删除文件末尾的块。

    【讨论】:

      【解决方案3】:

      文件系统只为稀疏文件中实际上有任何内容的那些部分分配块。删除 那些 块会非常愚蠢,因为那是你的数据。其他方块不存在,无法移除。

      【讨论】:

      • 但确实存在我不再需要文件的某些块并希望将空间还给文件系统的情况。
      【解决方案4】:

      在不需要的部分写零。

      【讨论】:

      • 这不起作用,该块现在将包含零而不是原始问题正在寻找的“洞”。
      猜你喜欢
      • 2017-08-20
      • 1970-01-01
      • 2015-07-07
      • 2016-12-06
      • 2012-04-14
      • 2021-03-12
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多