Frage

Betrachten Sie eine Datei mit geringer Dichte mit 1s zu einem Teil der Datei geschrieben.

Ich möchte für diesen 1s als ich nicht mehr benötige des Teils der Datei mit geringer Dichte den tatsächlichen Speicherplatz auf dem Datenträger zurückzugewinnen. Der Teil der Datei diese 1s enthält, sollte ein „Loch“ werden, wie es war, bevor die 1s wurden selbst geschrieben.

Um dies zu tun, räumte ich die Region zu 0s. Dies gilt nicht zurückzufordern, die Blöcke auf dem Datenträger.

Wie kann ich eigentlich die spärliche Datei machen, na ja, spärlich wieder?

Diese Frage ist ähnlich wie dieses aber es gibt keine akzeptierte Antwort auf diese Frage.

Betrachten Sie die folgende Sequenz von Ereignissen auf einem Lager Linux-Server laufen:

$ 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 nicht möglich ist, irgendwie frei zuvor zugewiesenen Blöcke in situ , so sei es, aber ich‘ d mögen, um zu bestimmen, ob eine solche tatsächlich möglich ist oder nicht. Es scheint so, „nein, es ist nicht“ an dieser Stelle. Ich glaube, ich bin auf der Suche nach sys_punchhole für Linux (Diskussionen, von denen ich auf nur gestolpert).

War es hilfreich?

Lösung

Im Moment scheint es, dass nur unterstützt Lochen NTFS. Dies war in der Vergangenheit ein Problem in den meisten Dateisystemen. POSIX soweit ich weiß, keine OS-Schnittstelle definiert Löcher zu stanzen, so dass keiner der Standard-Linux-Dateisysteme Unterstützung für sie. NetApp unterstützt durch die Windows-Lochen in seinem WAFL Dateisystem. Es gibt eine schöne Blog-Post über dieses hier .

Für Ihr Problem, wie andere schon angedeutet haben, ist die einzige Lösung, die Dateiblöcke Weglassen zu bewegen, enthalten Nullen. Ja sein Gehen, langsam zu sein. Oder eine Erweiterung für das Dateisystem auf Linux schreiben, das dies tut und einreichen a Patch auf die gute Leute im Linux-Kernel-Team. ;)

Edit: Sieht aus wie XFS unterstützt Lochen. Überprüfen Sie diesen Thread .

Ein andere wirklich verdrehte Option kann einen Dateisystem-Debugger zu verwenden, zu gehen und Stempel Löcher in allen indirekten Blöcke, die auf Null gesetzt Blöcke in der Datei (vielleicht können Sie Skript, dass). Dann fsck, die alle damit verbundene Blockzählwerten korrigieren, sammelt all verwaisten Blöcke (die auf Null gesetzt ist) und legen sie in dem Verzeichnis lost + found (Sie können sie löschen, um Speicherplatz zurückzugewinnen) und korrekte andere Objekte im Dateisystem. Scary, nicht wahr?


Hinweis: Tun Sie dies auf eigene Gefahr. Ich bin nicht verantwortlich für Datenverlust Sie incur .;)

Andere Tipps

Es scheint, als ob Linux eine syscall genannt fallocate für „Lochen“ in Dateien hinzugefügt hat. Die Implementierungen in einzelnen Dateisysteme auf die Fähigkeit zu konzentrieren scheinen dies zu nutzen für eine größere Dauer Anzahl von Blöcken im Voraus zugeordnet.

Es gibt auch den posix_fallocate Anruf nur, dass auf diesem Fokus und ist für Lochen nicht verwendet werden.

Ron Yorston bietet verschiedene Lösungen; aber sie alle beinhalten entweder die FS Montage schreibgeschützt (oder Aushängen es), während der sparsifying stattfindet; oder eine neue Datei mit geringer Dichte zu machen, dann über diese Stücke des Originals kopiert, die nicht nur 0s, und dann mit der neu sparsified Datei die Originaldatei ersetzt werden.

Es hängt wirklich von Ihrem Dateisystem though. Wir haben bereits gesehen, dass NTFS diese Griffe. Ich stelle mir vor, dass jede der anderen Dateisysteme Wikipedia Listen als transparente Kompression Umgang tun würde genau die gleiche - das ist immerhin entspricht die Datei transparent zu komprimieren.

Nachdem Sie „genullt“ einig Bereich der Datei haben Sie in dem Dateisystem zu sagen haben, dass dieser neue Bereich soll eine spärliche Region. So im Fall von NTFS haben Sie wieder DeviceIoControl () für diese Region zu nennen. Wenigstens kann ich auf diese Weise in meinem Programm: "sparse_checker"

Für mich ist das größere Problem ist, wie die spärliche Region wieder unscharf zu schalten.)

Viele Grüße

Auf diese Weise ist billig, aber es funktioniert. :-P

  1. Lesen Sie in allen Daten über das Loch Sie, in dem Speicher möchten (oder eine andere Datei oder was auch immer).
  2. die Länge der Datei auf den Anfang des Lochs (ftruncate ist dein Freund).
  3. Suchen Sie bis zum Ende der Bohrung.
  4. Schreiben Sie die Daten wieder in.

umount Dateisystem und bearbeiten Dateisystem direkt in ähnlicher Weise wie debugfs oder fsck. in der Regel müssen Sie Treiber für jede verwendete fs.

Scheint, wie Nullen zu schreiben (wie in der Frage verwiesen) zum Teil sind Sie fertig mit ist eine logische Sache, um zu versuchen. Hier ist ein Link zu einer MSDN-Frage für NTFS-Sparse-Dateien, die nicht nur, dass auf „Freigabe“ die „ungenutzt“ -Teil. YMMV.

http://msdn.microsoft.com/en-us/library /ms810500.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top