Onde o ext4 armazena os tamanhos de diretório?

4

Onde o ext4 armazena os tamanhos de diretório? Eles estão armazenados no diretório inode?

Por exemplo, quando eu executo du -h , ele retorna o tamanho dos diretórios instantaneamente, então eu não acredito que ele calcule isso na hora.

Estou usando o ext4 no Linux.

    
por BufBills 16.04.2014 / 02:55

1 resposta

6

O uso de strace parece indicar que os tamanhos dos arquivos são realmente calculados consultando os arquivos dentro do diretório.

Exemplo

Digamos que preencha um diretório com 3 arquivos de 1MB.

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

Agora, quando rastreamos o comando du -h :

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

Olhando o strace arquivo de log resultante 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
...

Observe as chamadas do sistema newfstatat ? Eles estão obtendo o tamanho de cada arquivo por vez.

Plano de fundo adicional

Se você estiver interessado, aqui está um pouco mais sobre o assunto.

  1. Esse comportamento não tem nada a ver com EXT4. É assim que os sistemas de arquivos funcionam no Unix.
  2. O comando stat não oferece nenhum recurso para consultar qualquer outra coisa além do tamanho de um objeto do sistema de arquivos (diretório ou arquivo).

    $ 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: -
    

    Observe que são 4096 bytes. Esse é o tamanho real do diretório em si, não o que ele contém.

Referências

por 16.04.2014 / 03:07