Warum unterscheiden sich die Verzeichnisgrößen in der Ausgabe von ls -l im XFS-Dateisystem?

2571
loadaverage

Ich kann nicht verstehen, warum ls -l die Ordnergröße kleiner als die Blockgröße zeigt.

Zum Beispiel:

[user@01 NEW]$ ls -l total 4 drwxr-xr-x 5 root root 78 Apr 22 00:43 controllers drwxr-xr-x 14 root root 4096 Apr 22 00:44 schemas drwxr-xr-x 2 root root 38 Apr 22 00:44 spinner 

"Steuerungen" ist ein Verzeichnis, und die Blockgröße beträgt 4096 Byte. Warum beträgt die Größe 78 Byte?

[user@01 NEW]$ find controllers/ -type f|wc -l 73 

Viele Dateien befinden sich darin. Und du -hs zeigt, dass die Größe dieses Ordners 840K beträgt.

Eine andere merkwürdige Sache ist, dass ls -s zeigt, dass für diese zwei Verzeichnisse 0 Blöcke zugewiesen wurden:

[user@01 NEW]# ls -ls total 4 0 drwxr-xr-x 5 root root 78 Apr 22 00:43 controllers 4 drwxr-xr-x 14 root root 4096 Apr 22 00:44 schemas 0 drwxr-xr-x 2 root root 38 Apr 22 00:44 skins 

xfs_info:

 xfs_info / meta-data=/dev/disk/by-uuid/5d87d678-e4cc-445f-b770-4e4c0357faaa isize=256 agcount=4, agsize=393088 blks = sectsz=512 attr=2 data = bsize=4096 blocks=1572352, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 

In ext4-Ordnern ist die Größe normal (dh entspricht der Blockgröße).

1

1 Antwort auf die Frage

2
LSerni

Die Größe beträgt 78 Byte, da das Verzeichnis fast leer ist. Mit "Verzeichnis" meine ich den unmittelbar nachkommenden Inhalt dieses Ordners, dh wenn Sie haben

.../controllers/ Class1/Whatever /Resources... Class2/Whatever /Resources... 

"Controller" hat dann nur drei Einträge (.., Class1 und Class2. Ich weiß nicht genau, ob oder wie .. tatsächlich gespeichert ist).

Selbst wenn das Verzeichnis auf der Festplatte einen ganzen Block belegt, also 4 KB ( aber siehe unten ... ), bleibt die logische Größe des Verzeichnisses 78 Byte und wird in vielerlei Hinsicht wie eine Datei behandelt (das XFS-Whitepaper verweist darauf) es als Verzeichnisdatei ). Wenn Sie ein neues Objekt unmittelbar unter erstellen controllers, gehe ich davon aus, dass sich diese Größe erhöht.

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch07s03s02s02.html

Innerhalb von Inodes können auch sehr kleine Verzeichnisse gespeichert werden, wodurch null tatsächliche Blöcke belegt werden:

Sehr kleine Dateien

Die meisten symbolischen Links und Verzeichnisdateien sind kleine Dateien. Mit XFS können diese Dateien in Inodes gespeichert werden, um die Leistung zu verbessern. XFS verwendet auch verzögerte Schreibvorgänge, um zu warten, um die gesamte kleine Datei im Puffercache zu sammeln, bevor auf die Festplatte geschrieben wird.

Um es zusammenzufassen, soweit ich es verstehe, können Sie haben

Testen

Der verfügbare Platz in einem XFS-Inode für eine Verzeichnisdatei scheint auf meinem Linux-System etwa 156-157 Byte zu sein. Bei Überschreitung wird ein 4K-Block verwendet, aber die Freigabe von Speicherplatz gibt auch den Block frei und speichert die Informationen in den Inode.

mkdir temp  drwxr-xr-x 2 root root 6 2013-04-22 08:59 temp  touch temp/x; ls -la temp  drwxr-xr-x 2 root root 14 2013-04-22 09:00 temp  mv temp/x temp/{ 100 x's }  drwxr-xr-x 2 root root 113 2013-04-22 09:01 temp  { 130 x's }  drwxr-xr-x 2 root root 143 2013-04-22 09:02 temp  { 140 x's }  drwxr-xr-x 2 root root 153 2013-04-22 09:02 temp  { 146 x's } drwxr-xr-x 2 root root 4096 2013-04-22 09:03 temp  { 142 x's } drwxr-xr-x 2 root root 155 2013-04-22 09:03 temp 
Vielen Dank, Redhat-Artikel sagt: "Für die Standard-Inode-Größe von 256 Bytes stehen ungefähr 100 Byte Attributspeicherplatz zur Verfügung, abhängig von der Anzahl der Datenbereichszeiger, die auch im Inode gespeichert sind." Das bedeutet, dass die Ordnergröße nicht größer als 100 b sein darf (wenn sie im inode gespeichert ist). Einige Verzeichnisse haben jedoch eine Größe von 130 und mehr Bytes (es werden auch 0 Blöcke zugewiesen). loadaverage vor 11 Jahren 0
Möglicherweise ist der Literalbereich einer Verzeichnisdatei-Inode größer (der Inode-Kern ist 96 Byte, dh 160). Sie können experimentieren, indem Sie eine Datei mit längerem und längerem Namen erstellen. LSerni vor 11 Jahren 0
Ich habe das aus Neugier getan, der tatsächliche Speicherplatz scheint tatsächlich zwischen 155 und 159 Bytes zu liegen. Der von Ihnen zitierte Teil bezog sich auf eine Datei mit erweiterten Attributen und Zeigern der Datenausdehnung, aber ein kleines Verzeichnis kann auf einen der beiden verzichten und hat daher mehr Speicherplatz zur Verfügung. LSerni vor 11 Jahren 0
Ja, ich habe das getestet, die Größe ist gleich (~ 160 Bytes). Danke für die Hilfe. loadaverage vor 11 Jahren 0