考虑疏文件1所写的一部分文件。

我想收回的实际空间磁盘上对这些1s因为我不再需要的那部分稀疏的文件。该部分的文件,包含这些1s应该成为一个"洞",因为它是以前的1s是自己写的。

要做到这一点,我清除的地区为0。这并 夺回这块磁盘上。

我怎么实际上使稀疏的文件,好吧,疏了吗?

这个问题是相似的 这一个 但没有接受回答这个问题。

请考虑以下的事件顺序运行在股票Linux服务器:

$ cat /tmp/test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char **argv) {
    int fd;
    char c[1024];

    memset(c,argc==1,1024);

    fd = open("test",O_CREAT|O_WRONLY,0777);
    lseek(fd,10000,SEEK_SET);
    write(fd,c,1024);
    close(fd);

    return 0;
}

$ gcc -o /tmp/test /tmp/test.c

$ /tmp/test

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002710  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

$ /tmp/test clear

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

# NO CHANGE IN SIZE.... HMM....

编辑

让我进一步资格,我不想重写文件复制的文件,等等。如果不能以某种方式免费先前分配的区块 在原位, ,所以,但我想确定如果这样实际上是可能的,或者不。这似乎是"不,这不是"在这一点上。我想我正在寻找 sys_punchhole Linux(讨论,我只是偶然发现了).

有帮助吗?

解决方案

现在似乎只NTFS支持孔冲。这已经在历史上一个问题,在大多数文件系统。POSIX据我所知,没有定义操作系统的接口,以打孔,所以没有标准的Linux文件系统必须支持它。NetApp支持打孔通过在其Windows WAFL 文件系统。有一个很好的博客中有关这个 在这里,.

对于您的问题,正如其他人所指出的,唯一的解决办法是将文件留出块包含零。是的它会是缓慢的。或者写的扩展对于你的文件在Linux上,这不会和 提交 一个 补丁 来的 好的伙计 在Linux内核团队。;)

编辑: 看起来像XFS支持孔冲。检查 这个线程.

另一个真正的扭曲的选择可以使用 文件系统调试器 去穿孔在所有间接的区块,这点归零块在你的文件(也许你可以脚本)。然后运行的,它将纠正所有相关联的框计数,收集所有孤立的区块(的清零部分),并把他们在失去+发现目录(你可以删除,以收回空间)和正确的其他特性在本文件系统。可怕的,对吧?


免责声明:这样做在你自己的风险。我不负责任的数据丢失你承担。 ;)

其他提示

它显示为如果Linux的已经添加了一个称为fallocate在文件“冲孔”系统调用。在个别的文件系统的实施方案中似乎集中在使用这种用于能力预分配块的较大的连续号码。

有也是posix_fallocate呼叫仅着重于后者,而不是冲孔可用。

罗恩Yorston 提供了几种解决方案;但它们都涉及要么安装FS-只读(或卸载它),而稀疏发生;或制作新的稀疏文件,然后跨不只是0原始的那些块复制,然后与新sparsified文件替换原始文件。

这真的取决于你的文件系统,虽然。我们已经看到,NTFS处理此。我想,任何其他文件系统维基百科列出的作为处理透明压缩会做完全同样的 - 这是,毕竟,相当于透明压缩文件。

您已经“归零”你必须告诉文件系统,这个新的区域旨在稀疏区域的文件的某些区域之后。因此,在NTFS的情况下,你必须再次调用DeviceIoControl的()该区域。至少我这样在我的工具: “sparse_checker”

有关我更大的问题是如何取消设置稀疏区域背面:)

此致

这种方法虽然便宜,但是有效。:-P

  1. 将所有数据读入您想要的孔中,读入内存(或另一个文件,或其他文件)。
  2. 将文件截断到孔的开头 (ftruncate 是你的朋友)。
  3. 寻找洞的尽头。
  4. 将数据写回。

直接卸除文件系统和编辑文件系统中的方式类似debugfs或fsck的。通常需要驾驶员为每个使用的FS

好像零写入(在引用的问题),以你与是尝试顺理成章的事情做的部分。这里为NTFS稀疏文件的MSDN的问题,不只是说要“放”的“未使用”部分的链接。 YMMV。

http://msdn.microsoft.com/en-us/library /ms810500.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top