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.
- Esse comportamento não tem nada a ver com EXT4. É assim que os sistemas de arquivos funcionam no Unix.
-
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.