Warum hat jedes Verzeichnis eine Größe von 4096 Bytes (4 K)?

32

Wie das Thema sagt; Ich möchte wissen, warum jedes Verzeichnis eine Größe von 4 KB hat, auch wenn es Dateien mit einer Größe von mehr als 4 KB enthält.

Bitte schauen Sie sich folgendes an: -

$ ls -lh
total 2.0M
drwxr-xr-x 4 ankit ankit 4.0K Sep 11 07:28 Desktop

$ ls -lrh Desktop/
-rw-rw-r-- 1 ankit ankit 9.1M Aug 4 11:15 sophosthreatsaurusaz.pdf
-rw------- 1 ankit ankit 107K Dec 27 2010 KP 3 0.pdf
drwxrwsr-x 9 ankit ankit 4.0K Sep 10 19:26 eclipse

PS: Mir ist das du -shBefehlszeilenprogramm bekannt.

Edit: Ich gehe von einem Verzeichnis als Container für Dateien aus.

Ankit
quelle
Es sind die Metadaten des Verzeichnisses
Tachyons

Antworten:

33
  • Stellen Sie sich einen Verzeichniseintrag, ohne zu technisch zu werden, einfach als "Link" zu einer Liste der Dateien vor, die das Verzeichnis "enthält".
  • Dann lszeigt Ihnen , wie bei allem, die Größe dieses Links und nicht den gesamten Speicherplatz, den der Inhalt des Verzeichnisses belegt.
  • Die Mindestgröße, die ein Datei- oder Verzeichniseintrag / -link einnehmen muss, ist ein Block, der in den meisten ext3 / 4-Dateisystemen normalerweise 4096 Byte / 4 KB beträgt.
ish
quelle
7
Sie sagen, dass "die minimale Größe, die ein Datei- oder Verzeichniseintrag / Link einnehmen muss, ein Block ist", aber ich bin sicher, dass ich Dateigrößen von weniger als 4 KB gesehen habe.
Lakshay Garg
1
@ LakshayGarg Obwohl die Datei weniger als 4 KB groß sein kann, führt dies zu einer so genannten "internen Fragmentierung", bei der nur wenige Bytes des Blocks zum Speichern der kleinen Datei verwendet wurden.
Phyloflash
@phyloflash Einige Dateisysteme (z. B. NTFS) speichern kleine Dateien in den Dateieinträgen selbst (für NTFS im MFT-Eintrag). Auf diese Weise belegen ihre Inhalte Null-Zuordnungsblöcke und die interne Fragmentierung wird reduziert.
Ruslan
26

Um dies zu verstehen, sollten Sie Grundkenntnisse über Folgendes (Dateisystem) haben:

  • Inode (enthält Dateiattribute, Metadaten der Datei, Zeigerstruktur)
  • Datei (kann als Tabelle mit 2 Spalten betrachtet werden, Dateiname und Inode, Inode verweist auf die Rohdatenblöcke auf dem Blockgerät)
  • Verzeichnis (nur eine spezielle Datei, Container für andere Dateinamen. Sie enthält eine Reihe von Dateinamen und Inode-Nummern für jeden Dateinamen. Außerdem beschreibt sie die Beziehung zwischen Eltern und Kindern.)
  • symbolische Verbindung VS harte Verbindung
  • dentry (Verzeichniseinträge)
  • ...

In einem typischen ext4Dateisystem (was die meisten Leute verwenden) inodebeträgt die Standardgröße 256 Bytes, die Blockgröße 4096 Bytes.

Ein Verzeichnis ist nur eine spezielle Datei, die eine Reihe von Dateinamen und Inode-Nummern enthält. Bei der Erstellung des Verzeichnisses hat das Dateisystem dem Verzeichnis einen Inode mit dem Namen "Dateiname" (Dir-Name) zugewiesen. Der Inode zeigt auf einen einzelnen Datenblock (minimaler Overhead), der 4096 Bytes beträgt. Deshalb sehen Sie bei der Verwendung 4096 / 4.0K ls.

Sie können die Details mit tune2fs& abrufen dumpe2fs.

Beispiel

root@ubuntu:~# tune2fs -l /dev/ubuntu/root 
tune2fs 1.42 (29-Nov-2011)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          2fca4cbb-22f1-4328-ab13-cacedb360930
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              967680
Block count:              3931136
Reserved block count:     0
Free blocks:              2537341
Free inodes:              517736
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      416
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8064
Inode blocks per group:   504
RAID stride:              35637
Flex block group size:    16
Filesystem created:       Thu Mar 15 14:31:04 2012
Last mount time:          Sat Oct 20 20:28:04 2012
Last write time:          Sat Oct 20 20:23:32 2012
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Oct 20 20:22:57 2012
Check interval:           0 (<none>)
Lifetime writes:          54 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       272350
Default directory hash:   half_md4
Directory Hash Seed:      d582ad79-75a0-4964-9a48-33ddba04df5c
Journal backup:           inode blocks
Terry Wang
quelle
7

Wenn eine Datei überhaupt Daten enthält (sogar ein einzelnes Byte), belegt sie einen Block auf der Festplatte (was heutzutage in der Regel 4 KB entspricht). Ein Block kann nicht zwischen Dateien geteilt werden. Dies bedeutet, dass der Speicherplatz des gesamten Blocks nicht für andere Dateien verfügbar ist und daher als "verwendet" gilt.

Quelle

ThiagoPonte
quelle