No Linux, (talvez em função do tamanho do bloco do sistema de arquivos), quando eu crio um diretório e stat
ele retorna um tamanho de 4096. Eu posso criar arquivos nesse diretório, até certo ponto, sem aumentar o tamanho percebido do diretório (conforme relatado por stat
).
Em algum momento, conforme o diretório se enche de muitos arquivos, o tamanho do diretório aumenta (não estou falando do conteúdo do diretório, estou falando dos blocos consumidos para representar o próprio diretório). Se os arquivos forem excluídos, o tamanho do diretório permanecerá o mesmo.
Aqui está um exemplo rápido:
[root@uxlabtest:/]$ mkdir test
[root@uxlabtest:/]$ stat test
File: `test'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:04.000000000 -0400
Change: 2011-07-26 14:06:04.000000000 -0400
Em seguida, toque em vários arquivos:
[root@uxlabtest:/]$ for i in `seq 1 10000`; do touch /test/$i; done
[root@uxlabtest:/]$ stat test
File: `test'
Size: 155648 Blocks: 312 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:56.000000000 -0400
Change: 2011-07-26 14:06:56.000000000 -0400
Em seguida, exclua os arquivos:
[root@uxlabtest:/]$ rm -rf /test/*
[root@uxlabtest:/]$ stat test
File: `test'
Size: 155648 Blocks: 312 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:07:11.000000000 -0400
Modify: 2011-07-26 14:07:12.000000000 -0400
Change: 2011-07-26 14:07:12.000000000 -0400
Minhas perguntas são:
- Por que a contagem de tamanho / bloco de um diretório aumenta monotonicamente?
- Isso é uma função do sistema de arquivos subjacente ou do VFS Linux?
- O tamanho do diretório pode ser reduzido sem excluir e recriar o diretório?
- Pontos de bônus: Aponte-me para o código-fonte do kernel em que esse comportamento é implementado.