2010-11-29 6 views
4

Ich führe einen Daemon aus, der Dateien in einem Verzeichnis analysiert und sie dann löscht. Falls der Daemon aus irgendeinem Grund nicht läuft, werden Dateien dort gestapelt. Heute hatte ich 90k Dateien in diesem Verzeichnis. Nachdem der Daemon erneut gestartet wurde, wurden alle Dateien verarbeitet.Wie "defragmentieren" Sie ein Verzeichnis auf ext3?

Das Verzeichnis bleibt jedoch groß; "ls -dh." gibt eine Größe von 5,6M zurück. Wie kann ich dieses Verzeichnis "defragmentieren"? Ich habe bereits herausgefunden, dass das Umbenennen dieses Verzeichnisses und das Erstellen eines neuen mit dem gleichen Namen und den gleichen Berechtigungen das Problem lösen. Wie auch immer, da Dateien zu jeder Zeit dort hineingeschrieben werden, scheint es keine sichere Möglichkeit zu geben, das Verzeichnis umzubenennen und ein neues zu erstellen, da das Zielverzeichnis nicht existiert.

Also a) gibt es ein Weg/ein (Shell-) Programm, das Verzeichnisse auf einem ext3-Dateisystem defragmentieren kann? oder b) Gibt es eine Möglichkeit, eine Sperre für ein Verzeichnis zu erstellen, so dass das Schreiben von Dateien blockiert wird, bis das Umbenennen/Erstellen beendet ist?

+0

BTW.offenbar können Sie mit dem Befehl "filefrag" prüfen, ob ein Verzeichnis fragmentiert ist. – oliver

+0

Siehe auch http://serverfault.com/questions/264124/shrink-reset-directory-size und http://unix.stackexchange.com/questions/38639/how-to-compact-a-directory – oliver

Antwort

0

Mir ist keine Möglichkeit bekannt, freien Speicherplatz innerhalb eines Verzeichnisses zurückzugewinnen.

5MB ist nicht sehr viel Platz, daher kann es am einfachsten sein, es einfach zu ignorieren. Wenn dieses Problem (das Stapeln von Dateien im Verzeichnis) regelmäßig auftritt, wird dieser Speicherplatz immer dann wieder verwendet, wenn das Verzeichnis wieder voll ist.

Wenn Sie dringend die Fähigkeit benötigen, das Verzeichnis hier zu verkleinern, ist ein (hässlicher) Hack, der funktionieren könnte.

Ersetzen Sie das Verzeichnis durch einen symbolischen Link zu einem leeren Verzeichnis. Wenn dieses Problem erneut auftritt, können Sie ein neues leeres Verzeichnis erstellen und anschließend den Symlink so ändern, dass er auf das neue Verzeichnis verweist. Das Ändern des Symlinks sollte atomar sein, damit Sie keine eingehenden Dateien verlieren. Dann können Sie das alte Verzeichnis sicher leeren und löschen.

[Bearbeitet, um hinzuzufügen: Es stellt sich heraus, dass dies nicht funktioniert. Wie Bada in den Kommentaren darauf hinweist, kann man einen Symlink nicht in der von mir vorgeschlagenen Weise ändern. Das hinterlässt mir meinen ursprünglichen Standpunkt. Dateisysteme, mit denen ich vertraut bin, bieten keinen Mechanismus, um freien Speicherplatz innerhalb von Verzeichnisblöcken zurückzugewinnen.]

+1

Wie kann die Symlink geändert werden? Wenn das Ziel bereits existiert, wird der Symlink * innerhalb * des Ziels, das auf sich selbst zeigt, erstellt, probiere "mkdir haha ​​hehe && ln -vs haha ​​hoi && ln -vs hehe hoi". Und nach Symlink (2) gibt es EEXIST zurück, falls das Ziel bereits existiert. Ich sehe es noch nicht atomar. – Bada

+0

@bada: Du hast Recht. Ich habe die Art und Weise, wie Symlinks erstellt werden, falsch verstanden. Also mein Hack ist sowohl hässlich als auch falsch! Das tut mir leid. Ich fürchte, das lässt mich ohne Vorschläge, wie Sie Ihr Problem lösen können ... –

+1

Eigentlich ist das Umbenennen Atom. Erstellen Sie eine neue Verknüpfung, und verschieben Sie sie dann entweder mit der Betriebssystemaufrufumbenennung (python os.rename) oder mit dem Befehl "mv -f -T newlink oldlink". -T sagt, dass Sie das Verzeichnis nicht einfügen, sondern den Link ersetzen müssen. –

1

"Verzeichnisse im Dateisystem optimieren. Diese Option bewirkt, dass e2fsck versucht, alle Verzeichnisse zu optimieren, entweder durch Neuindexierung des Dateisystems unterstützt die Verzeichnisindizierung oder das Sortieren und Komprimieren von Verzeichnissen für kleinere Verzeichnisse oder für Dateisysteme, die traditionelle lineare Verzeichnisse verwenden. " - fsck.ext3 -D

Natürlich sollte dies nicht auf einem gemounteten Dateisystem getan werden.

1

Nicht wirklich anwendbar für Ext3, aber vielleicht nützlich für die Nutzer anderer Dateisysteme:

Ich habe jedoch keine dieser Lösungen versucht.

Verwandte Themen