ファイルの一部に 1 が書き込まれたスパース ファイルを考えてみましょう。
スパース ファイルのその部分が不要になったため、これらの 1 のディスク上の実際のスペースを再利用したいと考えています。これらの 1 を含むファイルの部分は、1 自体が書き込まれる前と同様に「穴」になるはずです。
これを行うために、リージョンを 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....
編集 -
ファイルを書き換えたり、ファイルをコピーしたりしたくないことをさらに限定させてください。以前に割り当てられたブロックを in situで何らかの形で解放できない場合は、それで構いませんが、それが実際に可能かどうかを判断したいと思います。いいえ。この時点で「いや、そうじゃない」みたいな。私はsys_punchhole
Linux を探していると思います (私がたまたま見つけた議論)。