Was bedeutet die Größe eines Verzeichnisses bei der Ausgabe des Befehls 'ls -l'?

65

Was bedeutet die Größe eines Verzeichnisses bei der Ausgabe eines ls -lBefehls?

Hemant
quelle
1
Weitere Informationen zur Verzeichnisgröße finden Sie in dieser Antwort .
Christian Long

Antworten:

45

Dies ist die Größe des Speicherplatzes auf der Festplatte, auf der die Metainformationen für das Verzeichnis gespeichert werden (dh die Tabelle der Dateien, die zu diesem Verzeichnis gehören). Wenn es sich also um 1024 handelt, bedeutet dies, dass 1024 Bytes auf der Festplatte für diesen Zweck verwendet werden (es werden immer vollständige Blöcke zugewiesen).

txwikinger
quelle
3
und wenn ein verzeichnis tausende von dateien enthält, kann die größe des verzeichnisses leicht> 10 kb sein
glenn jackman
1
@txwikinger Ich denke, Verzeichnisse enthalten Listen von Inodes, keine tatsächlichen Dateinamen.
Ярослав Рахматуллин
6
@ ЯрославРахматуллин Ein Verzeichniseintrag besteht aus einer Inode-Nummer und einem Dateinamen.
200_success
2
Die "Größe" eines Verzeichnisses hängt also nur von der Anzahl der darin enthaltenen Dateien ab, nicht von der Größe der Dateien?
Lee
1
@Lee: Ja, das stimmt.
Katze
14

Die "Größe eines Verzeichnisses", mit der gedruckt wird, ls -list (wie bei jedem Dateityp) der Wert, der vom stat()Aufruf in gemeldet wird statbuf.st_size.

Was dies st_sizefür Verzeichnisse bedeutet, hängt vollständig vom Dateisystemtyp ab. Wenn Sie den Dateisystemtyp nicht kennen und dessen Konzepte nicht verstehen, können Sie aus dem Wert in nichts ableiten st_size.

  • In dem historischen UNIX-Dateisystem, das derzeit üblicherweise benannt wird v7-fs, wurden Verzeichnisse mit 16-Byte-Einträgen wiederholt, die eine 16-Bit-Inode-Nummer und 14-Byte-Dateinamen enthielten. Die "Größe" eines Verzeichnisses war in Bezug auf die read(2)Operation bedeutsam und wuchs oder blieb immer so, wie sie ist. Die .und ..-Einträge werden erstellt, indem sie manuell mit dem aktuellen und dem darüber liegenden Verzeichnis verknüpft werden. Die Anzahl der Links für ein vernünftig leeres Erstverzeichnis beträgt 2.

  • In dem BSD-4.2-Dateisystem, das seit 1989 (SVr4) aufgerufen wird ufs, sind Verzeichnisse eine Reihe von Datensätzen variabler Länge, die ein Format verwenden, das nicht als stabil eingestuft wird, sodass Benutzerbereichsbefehle dieses Format nicht lesen dürfen. Die angegebene "Größe" ist die Größe in Bytes wie in v7-fs, die Größe wächst normalerweise oder bleibt unverändert, aber neuere Versionen des Dateisystems können die Größe unter bestimmten Umständen verringern - aber nicht immer, wenn Sie dies erwarten. Die für ein leeres Verzeichnis gemeldete Linkanzahl beträgt 2 wie bei v7-fs.

  • In WOFSdem Dateisystem, das ich zwischen Sommer 1988 und Mai 1991 entworfen und implementiert habe, geben Verzeichnisse immer die "Größe" 0 an und haben niemals einen Inhaltstyp, der mit dem read(2)Aufruf gelesen werden kann . Dies liegt daran, dass WOFSes sich um das erste Copy-on-Write-Dateisystem handelt und dass in WOFSDateien das Verzeichnis angegeben wird, in dem sie sich befinden, anstatt im Verzeichnis aufgeführt zu werden. Wenn Sie ein WOFSVerzeichnis mit lesen readdir(), erhalten Sie nur Daten für die vorgesehenen Einträge, jedoch niemals für .und ... Die Linkanzahl eines leeren Verzeichnisses in WOFSist 1 und das gesamte Verhalten ist vollständig POSIX-kompatibel.

  • In ZFS, das wurde nach dem Lesen der WOFSPapiere umgesetzt. ZFSist ein Copy-on-Write-Dateisystem und seine Autoren bestreiten nicht, dass sie Konzepte kopiert haben WOFS. Verzeichnisse auf ZFS berichten über den number of directory entriesin st_size, so dass die gemeldeten „Größe“ hat keine wirkliche Bedeutung in Bezug auf den besetzten Speicherplatz aus den Verzeichnisdaten. In einem ZFS-Verzeichnis gibt es keine .und ..-Einträge. Wenn Sie jedoch aufrufen readdir(), werden diese Einträge gefälscht und für die ersten beiden Vorgänge zurückgegeben. ZFS ist der einzige FS in der Liste, der Verzeichnisse mit fester Verknüpfung nicht unterstützt, aber die gemeldete Verknüpfungsanzahl für Verzeichnisse ist immer 2. Diese beiden Unregelmäßigkeiten in ZFS werden implementiert, um die Verwirrung in historischen Nicht-POSIX-Programmen zu verringern.

  • Ähnlich wie ZFS kopiert WAFL einige, aber nicht alle Ideen von WOFS. Netapps WAFLwurde 3 Jahre nach WOFSVeröffentlichung des Papiers geschrieben, WAFL ist Copy-on-Write, aber WAFL scheint "Größen" -Werte zu melden, die unter der Annahme, dass das Verzeichnis Inhalt hat, die "echte Verzeichnisgröße" sein können.

schily
quelle
13

Ein Verzeichnis reserviert mindestens 4096 Bytes für Metadaten über sich und seinen Inhalt.

Außerdem sind 4096 Bytes die Standardzuordnungseinheit (Block) für das Dateisystem ext2 / ext3 / ext4 und daher kann ein Verzeichnis nicht kleiner sein.

Auf verschiedenen Dateisystemen finden Sie möglicherweise Verzeichnisse mit unterschiedlichen Standardgrößen, die auf die Standardblockgröße des Dateisystems zurückzuführen sind.

Die Größe von Verzeichnissen kann auch dynamisch ansteigen, wenn sie gefüllt werden. Sobald der für Metadaten reservierte Speicherplatz gefüllt ist, kann er nicht mehr neu zugewiesen werden, ohne das Verzeichnis zu entfernen.

h3rrmiller
quelle
1
Auf welche Metadaten beziehen Sie sich?
Stéphane Chazelas
1
Details hängen vom Dateisystem ab, umfassen jedoch im Allgemeinen Metadaten wie Dateiname, Inode-Nummer, Dateityp (Datei, Verzeichnis, FIFO, Socket, Geräteknoten, Symlink usw.), Eigentümer, Gruppe, Berechtigungen, Attribute, ACLs und Symlink-Ziele.
cas
6
@CraigSanders enthält das Verzeichnis Objektnamen und entsprechende Inode - Nummer nur . Der Inode enthält den Objekttyp, den Eigentümer / die Gruppe, Berechtigungen, Verweise darauf, wo ACLs und erweiterte Attribute aufbewahrt werden.
Vonbrand
Mein UFS reserviert nur 512 Bytes für seine eigenen Metadaten pro Verzeichnis.
FUZxxl
4

Ein Verzeichnis ist wie ein Telefonbuch nur ein Verzeichnis. Es ist nur eine Datei mit einer Liste von Zahlen und einem Namen daneben. Jede Nummer verweist auf eine Datei im Dateisystem (eine Inode-Nummer) und der Name ist der Dateiname.

Sie benötigen Speicherplatz, um diese Daten zu speichern. Wie diese zugeordnet und vergrößert und verkleinert werden, hängt vom Dateisystem ab.

Stéphane Chazelas
quelle
Sie könnten die tatsächlichen Details darüber, welche Metadaten aufbewahrt werden, und die Überlegungen zur Blockzuordnung in Bezug auf das Anwachsen der Größe angeben. es würde eine genauere Antwort mit der bereits gegebenen netten Allegorie vervollständigen. :)
n611x007
3
@naxa, das ist abhängig vom Dateisystem, und selbst innerhalb eines Dateisystems (wie ext4) hängt das davon ab, welche Optionen Sie aktivieren. Daher möchte ich es lieber als "es ist abhängig vom Dateisystem" belassen, anstatt zu versuchen, umfassend zu sein, was nicht sehr wäre relevant für diese Frage.
Stéphane Chazelas