考虑一个稀疏文件,其中1s写入文件的一部分.
我想要回收这些1的磁盘上的实际空间,因为我不再需要稀疏文件的那部分.包含这些1的文件的部分应该成为一个“洞”,就像在1s被写入之前一样.
为了做到这一点,我将该地区清除为0.这不会回收磁盘上的块.
如何真正使稀疏文件再次稀疏?
这个问题类似于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(讨论我刚刚发现).