Wo speichert ext4 Verzeichnisgrößen?

4

Wo speichert ext4 Verzeichnisgrößen? Sind sie im Verzeichnis inode gespeichert?

Wenn ich du -hes zum Beispiel ausführe , wird die Größe der Verzeichnisse sofort zurückgegeben, daher glaube ich nicht, dass es sie zu diesem Zeitpunkt berechnet.

Ich benutze ext4 unter Linux.

BufBills
quelle
ext4 speichert keine Verzeichnisgrößen. Wenn es dusich sofort anfühlt, liegt es daran, dass die Dateien vom Kernel zwischengespeichert werden. Sie können dies sehen, wenn Sie versuchen, es mehrmals auf einem kürzlich gemounteten Dateisystem auszuführen - nach dem ersten Ausführen ist es viel schneller.
28.

Antworten:

6

Die Verwendung von stracescheint darauf hinzudeuten, dass die Dateigrößen tatsächlich berechnet werden, indem die Dateien im Verzeichnis abgefragt werden.

Beispiel

Sagen wir ich fülle ein Verzeichnis mit 3 1MB Dateien.

$ mkdir adir
$ fallocate -l 1M adir/afile1.txt
$ fallocate -l 1M adir/afile2.txt
$ fallocate -l 1M adir/afile3.txt

Wenn wir nun den du -hBefehl verfolgen :

$ strace -s 2000 -o du.log du -h adir/
3.1M    adir/

Betrachten Sie die resultierende straceProtokolldatei du.log:

...
newfstatat(AT_FDCWD, "adir/", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
fcntl(3, F_DUPFD, 3)                    = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getdents(3, /* 5 entries */, 32768)     = 144
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
newfstatat(4, "afile2.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile3.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile1.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
brk(0)                                  = 0x231a000
...

Beachten Sie die newfstatatSystemaufrufe? Diese erhalten der Reihe nach die Größe jeder Datei.

Zusätzlicher Hintergrund

Wenn Sie interessiert sind, hier ist ein bisschen mehr zu diesem Thema.

  1. Dieses Verhalten hat nichts mit EXT4 zu tun. So funktionieren Dateisysteme in Unix.
  2. Der statBefehl bietet keine Möglichkeit, etwas anderes als die Größe eines Dateisystemobjekts (Verzeichnis oder Datei) abzufragen.

    $ stat adir/
      File: ‘adir/’
      Size: 4096        Blocks: 8          IO Block: 4096   directory
    Device: fd02h/64770d    Inode: 11539929    Links: 2
    Access: (0775/drwxrwxr-x)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
    Context: unconfined_u:object_r:user_home_t:s0
    Access: 2014-04-15 22:29:25.289639888 -0400
    Modify: 2014-04-15 22:29:44.977638542 -0400
    Change: 2014-04-15 22:29:44.977638542 -0400
     Birth: -
    

    Beachten Sie, dass es 4096 Bytes ist. Das ist die tatsächliche Größe des Verzeichnisses selbst, nicht was es enthält.

Verweise

slm
quelle
1
Ich würde hinzufügen, dass dies nicht nur ext4 ist; statEs gibt einfach keine Möglichkeit, mehrere Größen zurückzugeben. Daher kann nur die Größe des Verzeichnisses selbst zurückgegeben werden , nicht der Inhalt. Und auch "Verzeichnisgröße einschließlich Inhalt" wird weniger klar, wenn Sie Dateien fest verknüpft haben.
Derobert