Warum wird das Verzeichnis mit einer großen Anzahl von Einträgen nach dem Entfernen von Einträgen nicht kleiner?

8

Schlussbemerkung : Während das verknüpfte Duplikat dieselbe Frage stellt, liefern die Kommentare und die einzige Antwort keine Antwort, die aus einer maßgeblichen Quelle stammt. Die Antwort auf meine Frage von Thomas Dickey liefert tatsächlich die Antwort, die ich gesucht habe. Daher ist das vorgeschlagene Duplikat nicht hilfreich, jedoch ist die Antwort von Thomas hier richtig.

Laut der Antwort von G-Man auf die Superuser-Frage und den persönlichen Account in diesem PerlDuck-Kommentar erreichen Verzeichnisse mit einer großen Anzahl von Einträgen eine Größe von über 4096 Bytes (was bei der ls -lAusgabe angezeigt wird ), aber sobald die Einträge entfernt werden - die Nummer geht nie runter.

Die Frage ist "warum"? Liegt es daran, wie das ext4Dateisystem so konfiguriert ist, dass Verzeichnismetadaten beibehalten werden? Das Entfernen und Neuerstellen des Verzeichnisses ist offensichtlich keine Lösung, da der ursprüngliche Inode gelöscht und ein neuer erstellt wird. Was kann getan werden, um die Anzahl manuell zu verringern?

Sergiy Kolodyazhnyy
quelle
nicht wirklich - diese Frage war spezifisch genug, um eine maßgebliche Quelle zu zitieren, im Gegensatz zu dem vorgeschlagenen Duplikat
Thomas Dickey
1
@Kusalananda Ich habe die Antwort so bearbeitet, dass sie eine Begründung dafür enthält, warum das verknüpfte Duplikat nicht angemessen ist. Ich würde vorschlagen, umgekehrt zu verknüpfen, und die Antwort von Thomas hier beantwortet tatsächlich das Warum sowohl für meine als auch für die andere Frage
Sergiy Kolodyazhnyy
1
Es ist auch erwähnenswert, dass kürzlich ein Patch eingereicht wurde, damit ext4-Verzeichnisse schrumpfen können, wenn ihre
Blattblöcke

Antworten:

11

Zitieren eines Entwicklers (in einem Linux-Kernel-Thread ext3 / ext4-Verzeichnisse schrumpfen nicht, nachdem viele Dateien gelöscht wurden ):

On Thu, May 14, 2009 at 08:45:38PM -0400, Timo Sirainen wrote:
>
> I was rather thinking something that I could run while the system was  
> fully operational. Otherwise just moving the files to a temp directory +
> rmdir() + rename() would have been fine too.
>
> I just tested that xfs, jfs and reiserfs all shrink the directories  
> immediately. Is it more difficult to implement for ext* or has no one  
> else found this to be a problem?

It's probably fairest to say no one has thought it worth the effort.
It would require some fancy games to swap out block locations in the
extent trees (life would be easier with non-extent-using inodes), and
in the case of htree, we would have to keep track of the index block
so we could remove it from the htree index.  So it's all doable, if a
bit tricky in terms of the technical details; it's just that the
people who could do it have been busy enough with other things.

It's hasn't been considered high priority because most of the time
directories don't go from holding thousands of files down to a small
handful.  

                                                - Ted
Thomas Dickey
quelle