gpt4 book ai didi

linux - 如何回收稀疏文件的归零 block ?

转载 作者:IT王子 更新时间:2023-10-28 23:53:41 29 4
gpt4 key购买 nike

考虑一个稀疏文件,其中 1 写入文件的一部分。

我想为这些 1 回收磁盘上的实际空间,因为我不再需要稀疏文件的那部分。包含这些 1 的文件部分应该变成一个“洞”,就像在写入 1 之前一样。

为此,我将该区域清除为 0。这不会回收磁盘上的 block 。

我实际上如何使稀疏文件再次变得稀疏?

这个问题类似于this one但这个问题没有公认的答案。

考虑以下在普通 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....

编辑 -

让我进一步说明我不想重写文件、复制文件等。如果无法以某种方式就地释放以前分配的 block ,那就这样吧,但我我想确定这是否真的可能。在这一点上似乎是“不,不是”。我想我正在寻找适用于 Linux 的 sys_punchhole(我偶然发现的讨论)。

最佳答案

看起来好像 linux 添加了一个名为 fallocate 的系统调用,用于在文件中“打洞”。单个文件系统中的实现似乎侧重于使用它来预分配更大数量的连续 block 的能力。

还有 posix_fallocate 调用只关注后者,不能用于打洞。

关于linux - 如何回收稀疏文件的归零 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1982749/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com