Рассмотрим разреженный файл с 1-м, записанным на часть файла.
Я хочу вернуть фактическое пространство на диске для этих 1s, поскольку мне больше не нужна эта часть разреженного файла. Часть файла, содержащего эти 1s, должна стать "дырой", как это было до того, как сами были записаны.
Чтобы сделать это, я очистил область до 0s. Это делает не восстановление блоков на диске.
Как я могу сделать разреженный файл, ну, реже?
Этот вопрос похож на на этот, но ответа на этот вопрос нет.
Рассмотрим следующую последовательность событий, запущенных на 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....
EDIT -
Позвольте мне еще раз уточнить, что я не хочу переписывать файлы, копировать файлы и т.д. Если невозможно каким-то образом освободить ранее выделенные блоки in situ, пусть будет так, d хотел бы определить, действительно ли это возможно или нет. Похоже, "нет, это не так" на данный момент. Я полагаю, что я ищу sys_punchhole
для Linux (дискуссии, о которых я только что наткнулся).