【发布时间】:2010-12-31 06:20:28
【问题描述】:
考虑一个稀疏文件,其中 1 写入文件的一部分。
我想为这些 1 回收磁盘上的实际空间,因为我不再需要稀疏文件的那部分。包含这些 1 的文件部分应该成为一个“洞”,就像在 1 本身被写入之前一样。
为此,我将该区域清零。这不会回收磁盘上的块。
我实际上如何使稀疏文件再次变得稀疏?
此问题类似于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....
编辑-
让我进一步说明我不想重写文件、复制文件等。如果无法以某种方式释放以前分配的块原位,那就这样吧,但我'想确定这是否真的可行。在这一点上似乎“不,不是”。我想我正在寻找用于 Linux 的 sys_punchhole(我刚刚偶然发现的讨论)。
【问题讨论】:
-
从我读过的稀疏文件来看,关键的决定因素不是块被 0 填充,而是它从未被写入。你有任何相反的参考吗?
-
稀疏文件的某些部分从未被写入没有分配的块。但是,我的问题是,一旦我分配了一个或多个块,我该如何释放它们?我不再需要稀疏文件的一部分,并且想归还以前分配的块。但我不能。嘘。
-
cp --sparse=always... 稀疏文件是基于系统管理存储方式的黑客;依赖黑客从来都不是一个好主意。如果您需要可能有碎片来来去去的稀疏数据结构,我建议您寻找这样的结构或自己编写。 -
我想您也可以自己处理 inode 条目……自 90 年代初以来,还没有接触过该级别的文件系统,所以没有更多可提供的了。
标签: linux file filesystems sparse-file