Ich habe mich gefragt, warum ein leeres Verzeichnis 4096 Byte Speicherplatz belegt, und ich habe diese Frage gesehen. Es wird angegeben, dass Speicherplatz in Blöcken zugewiesen wird und daher die Größe eines neuen Verzeichnisses 4096 Bytes beträgt.
Ich bin mir jedoch ziemlich sicher, dass die Zuordnung für "normale" Dateien auch in Blöcken erfolgt. Zumindest ist es in Windows-Dateisystemen so und ich vermute, dass es in ext * zumindest ähnlich sein muss.
Soweit ich verstanden habe, erfolgt die Größenauflistung für andere Dateitypen wie Dateien, symbolische Links usw. in Bezug auf die tatsächliche Größe. Denn wenn ich eine leere Datei erstelle, sehe ich eine 0 als Größe. Wenn Sie ein paar Zeichen eingeben, sehe ich die <Anzahl der Zeichen> Bytes als Größe usw.
Meine Frage ist also, obwohl die Zuordnung für andere Dateien auch in Blöcken erfolgt, warum die Richtlinie zum Melden der Größe eines Verzeichnisses und einer Datei unterschiedlich ist.
Klärung
Ich dachte, die Frage sei klar genug, aber anscheinend nicht. Ich werde versuchen, die Frage hier zu klären.
1) Was ich denke, ist ein Verzeichnis:
Ich werde versuchen, anhand des folgenden Beispiels zu erklären, was meiner Meinung nach ein Verzeichnis ist. Wenn es nach dem Lesen falsch ist, benachrichtigen Sie mich bitte.
Nehmen wir an, wir haben ein Verzeichnis mit dem Namen mydir
. Und lassen Sie uns sagen , dass es drei Dateien enthält, die da sind: f0
, f1
und f2
. Nehmen wir an, dass jede Datei 1 Byte lang ist.
Was ist nun mydir
? Es ist ein Zeiger auf einen Inode, der Folgendes enthält: String "f0" und die Inode-Nummer, auf die verwiesen wird f0
. String "f1" und die Inode-Nummer, auf die f1
zeigt. Und String "f2" und die Inode-Nummer, auf die f2
zeigt. (Zumindest denke ich, dass dies ein Verzeichnis ist. Bitte korrigieren Sie mich, wenn ich falsch liege.)
Nun gibt es zwei Methoden zum Berechnen der Größe eines Verzeichnisses:
1) Berechnung der Größe der Inode, auf die mydir
zeigt.
2) Summieren der Größen der Inodes, auf die der Inhalt von mydir
zeigt.
Obwohl 1 kontraintuitiver ist, nehmen wir an, dass es sich um die verwendete Methode handelt. (Für diese Frage spielt es keine Rolle, welche Methode tatsächlich verwendet wird.) Dann wird die Größe von wie mydir
folgt berechnet:
2 + 2 + 2 + 3 * <space_required_to_store_an_inode_number>
2 sind, weil jeder Dateiname 2 Bytes lang ist.
2) Die Frage:
Nun die Frage: Unter der Annahme, dass ein Verzeichnis meiner Meinung nach korrekt ist, sollte die gemeldete Größe für mydir
viel weniger als 4096 betragen, unabhängig davon, ob Methode 1 oder Methode 2 zur Berechnung seiner Größe verwendet wird.
Nun werden Sie sagen, dass der Grund, warum 4096 Bytes gemeldet werden, darin besteht, dass die Zuordnung in Blöcken erfolgt. Daher ist die gemeldete Größe so groß.
Aber dann werde ich sagen: Die Zuordnung erfolgt auch in Blöcken für reguläre Dateien. (Siehe Thrigs Antwort als Referenz) Trotzdem werden ihre Größen in realen Größen angegeben. (1 Byte, wenn sie 1 Zeichen enthalten, 2 Byte, wenn sie 2 Zeichen enthalten usw.)
Meine Frage ist also, warum sich die Richtlinien für die Berichtsgröße von Verzeichnissen so stark von der Berichtsgröße für reguläre Dateien unterscheiden.
Weitere Klarstellung:
Wir wissen, dass die anfängliche Anzahl von Blöcken, die für eine nicht leere Datei und für ein leeres Verzeichnis zugewiesen wurden, beide 8 Blöcke beträgt. (Siehe Antwort von Thrig. ) Obwohl die Zuordnung sowohl für reguläre Dateien als auch für Verzeichnisse in der gleichen Anzahl von Blöcken erfolgt, warum ist die gemeldete Größe für ein Verzeichnis viel größer?
quelle
mydir
. Und lassen Sie uns sagen , dass es einige Dateien enthält wie:f0
,f1
undf2
. Was ist nunmydir
? Es ist ein Zeiger auf einen Inode, der Folgendes enthält: String "f0" und Inode-Nummer, auf die er zeigt. String "f1" und Inode-Nummer, auf die es zeigt. String "f2" und Inode-Nummer, auf die es zeigt. (Zumindest ist dies das Bild in meinem Kopf. Es könnte falsch sein) So weit so gut.mydir
zeigt. Hinzufügen der Größen der Inodes, auf die der Inhalt des Verzeichnisses verweist. Der andere Weg könnte darin bestehen, die Summe der Größen der Inodes zu definieren, auf die der Inhalt des Verzeichnisses zeigt. Wenn wir der Einfachheit halber annehmen, dass es nach der vorherigen Definition berechnet wird, sollte die Größe vonmydir
: 2 + 2 + 2 + 3 * <Größe, die zum Speichern einer Inode-Nummer erforderlich ist> sein. 2 sind, weil jeder Dateiname inmydir
zwei Zeichen lang ist.Ich denke, dass die anfängliche, leere Verzeichnisgröße vom Dateisystem abhängt. Auf ext3- und ext4-Dateisystemen, auf die ich Zugriff habe, erhalte ich auch leere Verzeichnisse mit 4096 Byte. Auf einem NFS-Mount-NAS erhalte ich ein leeres 80-Byte-Verzeichnis. Ich habe keinen Zugriff auf ein ReiserFS-Dateisystem, die dort neu erstellte, leere Verzeichnisgröße wäre interessant.
Traditionell war ein Verzeichnis eine Datei mit einem Bit im Inode (der Struktur auf der Festplatte, die die Datei beschreibt), die angibt, dass es sich um ein Verzeichnis handelt. Diese Datei wurde mit Datensätzen variabler Länge gefüllt. Folgendes
/usr/include/linux/dirent.h
sagt:Sie können die Verzeichnisdateieinträge mithilfe der
d_off
Werte überspringen . Wenn ein Eintrag entfernt wurde (unlink()
Systemaufruf, vomrm
Befehl verwendet), wurde derd_off
Wert des vorherigen Eintrags erhöht, um den fehlenden Datensatz zu berücksichtigen. Nichts hat Aufzeichnungen "komprimiert". Es war wahrscheinlich am einfachsten, die Zuordnung in Bezug auf die Anzahl der Bytes in den der Datei zugewiesenen Plattenblöcken anzuzeigen, anstatt zu versuchen, herauszufinden, wie viele Bytes in einem Verzeichnisdateikonto für alle Einträge vorhanden sind, oder nur bis zu letzter Eintrag.Heutzutage haben Verzeichnisse interne Formate wie B-Bäume oder Hash-Bäume . Ich vermute, dass es entweder eine große Leistungsverbesserung ist, Verzeichnisse nach Blöcken zu erstellen, oder dass in ihnen "Leerzeichen" vorhanden sind, ähnlich wie bei Verzeichnissen der alten Schule. Daher ist es schwierig zu entscheiden, wie groß die "tatsächliche Größe" in Bytes eines Verzeichnisses ist Eine, die schon eine Weile in Gebrauch ist und deren Dateien häufig gelöscht und hinzugefügt wurden. Einfacher, nur die Anzahl der Blöcke multipliziert mit Bytes pro Block anzuzeigen.
quelle
Einer Datei sind möglicherweise keine Blöcke zugeordnet. Das
-s
Flag tols
zeigt diesen Unterschied an, während einem Verzeichnis eine bestimmte Anzahl von Mindestblöcken zugewiesen ist, daher die Standardgröße. (Es sei denn, Sie arbeiten in einem schicken modernen Dateisystem, das diese Begriffe aus dem Fenster wirft.) Zum Beispiel:Beachten Sie, dass der Symlink hier keine Blöcke benötigt, obwohl sieben Bytes für die erforderlichen Details reserviert sind
readlink(2)
, wie neugierig! Wie auch immer, lassen Sie uns jetztfoofile
mit ein oder zwei Bytes auffüllen:Und man kann sehen , dass die zugewiesenen Blöcke für
foofile
bis gesprungen ist8
trotz nur zwei Bytes (das Wesena
und die Neue - Zeileecho
auf gehefteten).Dateien können auch spärlich sein. Dies ist eine weitere Möglichkeit, wie sich die gemeldete Dateigröße im Vergleich zum tatsächlichen Inhalt unterscheiden kann, je nachdem, wie das Tool, das mit der Datei interagiert, mit dieser Spärlichkeit umgeht.
Außerdem kann die Größe des Verzeichnisses erhöht werden, viele Dateien mit sehr langen Namen erstellen und überprüfen, was mit der Größe des Verzeichnisses (und den zugewiesenen Blöcken) geschieht, nachdem jeder neue lange Dateiname mit erstellt wurde
ls -lds .
quelle
foofile
war anfangs 0, weil sie leer war. Daherfoofile
zeigte nicht auf eine Inode. Nach einer kleinsten Änderung anfoofile
musste ihm jedoch ein Inode zugewiesen werden, und das Dateisystem wies ihm die geringste Anzahl zuweisbarer Blöcke zu. Ist das richtig?foosln
es keine Blöcke? Es ist seit dem Moment seiner Erstellung nicht leer. Daher fühlt es sich so an, als ob es bei der Schöpfung einige Blöcke einnehmen sollte. 2) Warum ist die kleinste Anzahl zuweisbarer Blöcke 8? (oder ist es?) Sollte es nicht 1 sein? 3) Und obwohl ich jetzt weiß, dass auch Dateien in Blöcken zugeordnet sind, weiß ich immer noch nicht, warum die Größe eines Verzeichnisses als Gesamtgröße der von ihm belegten Blöcke im Vergleich zur Größe einer Datei als angegeben wird seine wirkliche Größe?