Betrachten Sie eine Sparse-Datei mit 1s in einen Teil der Datei geschrieben.Wie erhält man zeroed Blöcke einer Sparse-Datei zurück?
Ich möchte den tatsächlichen Speicherplatz auf der Festplatte für diese 1s zurückfordern, da ich diesen Teil der Sparse-Datei nicht mehr benötige. Der Teil der Datei, der diese 1 enthält, sollte ein "Loch" werden, wie es war, bevor die 1s selbst geschrieben wurden.
Um dies zu tun, löschte ich die Region auf 0s. Dies macht nicht die Blöcke auf der Festplatte zurückfordern.
Wie mache ich die Sparse-Datei, nun, spärlich wieder?
Diese Frage ist ähnlich wie this one, aber es gibt keine akzeptierte Antwort für diese Frage.
Betrachten Sie die folgende Sequenz von Ereignissen auf einem Lager Linux-Server läuft:
$ 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 -
Lassen Sie mich weiter qualifizieren, dass ich nicht will, Dateien neu zu schreiben, Dateien kopieren, etc. Wenn Es ist nicht möglich, zuvor zugewiesene Blöcke in situ zu befreien, so sei es, aber ich würde gerne feststellen, ob das tatsächlich möglich ist oder nicht. An dieser Stelle scheint es "nein, ist es nicht". Ich nehme an, ich suche nach sys_punchhole
für Linux (Diskussionen, über die ich gerade gestolpert bin).
Nach was ich von Sparse-Dateien gelesen habe, ist die Schlüsseldeterminante nicht, dass der Block mit Nullen gefüllt ist, sondern dass er nie geschrieben wurde. Haben Sie Hinweise auf das Gegenteil? – kdgregory
Teile einer Sparse-Datei, die nie geschrieben wurde, um keine zugewiesenen Blöcke zu haben. Aber, meine Frage ist, sobald ich einen oder mehrere Blöcke zuteile, wie kann ich sie befreien? Ich brauche keinen Teil der Sparse-Datei mehr und möchte _ vorher zugewiesene Blöcke _ zurückgeben. Aber ich kann nicht. Boo. – z8000
'cp --sparse = immer' ... Sparse-Dateien sind ein Hack, der auf der Art basiert, wie Systeme Speicher verwalten; es ist nie eine gute Idee, sich auf einen Hack zu verlassen. Wenn Sie spärliche Datenstrukturen benötigen, bei denen es wahrscheinlich ist, dass Teile kommen und gehen, würde ich empfehlen, nach einer solchen Struktur zu suchen oder sie selbst zu schreiben. – kdgregory