Crescimento monotônico do tamanho de diretório / contagem de blocos do Linux

6

No Linux, (talvez como uma função do tamanho do bloco do sistema de arquivos), quando eu crio um diretório e stat it, ele retorna um tamanho de 4096. Eu posso criar arquivos neste diretório, até certo ponto, sem aumentando o tamanho percebido do diretório (conforme relatado por stat ).

Em algum momento, como o diretório enche-se com muitos arquivos, o tamanho do diretório balões (não estou falando sobre o conteúdo do diretório, estou falando sobre os 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?
  • Esta é uma função do sistema de arquivos subjacente ou do VFS do 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 onde esse comportamento é implementado.
por loopforever 26.07.2011 / 20:22

3 respostas

8

Aqui estão as respostas que são verdadeiras para ext2 / ext3 / ext4. Se eles são verdadeiros para outros sistemas de arquivos, depende da sua implementação.

  1. user48838 respondeu a este corretamente. Mais arquivos consomem mais metadados. Eles são alocados em blocos de 4k ou em qualquer outro tamanho definido no momento da criação do sistema de arquivos
  2. Sim, é um recurso / problema do sistema de arquivos real
  3. Em um sistema de arquivos ext3, isso não é possível. Apenas recriando o diretório (vazio)
  4. O código fonte está em torno de aqui e em arquivos relacionados

Mas você tem sorte. Quando você recria a mesma quantidade de arquivos que você já excluiu, o tamanho do diretório permanecerá o mesmo. Somente quando você adicionar mais arquivos aumentará.

    
por 01.08.2011 / 21:04
4

Os incrementos de bloco que você está vendo se devem ao modo como o sistema de arquivos gerencia seu armazenamento de arquivos e informações relacionadas ao gerenciamento de arquivos. Na sua situação descrita, isso pareceria com incrementos de 4K, então cada entrada "nova" / "única" no sistema de arquivos reservará 4K, se o tamanho real dos dados preencher todo o 4K. Se os dados relacionados ocuparem todo o 4K, então outro bloco de 4K será reservado e preenchido conforme necessário para armazenar todo o fluxo / sequência de dados relacionados.

Dependendo das exclusões "hard" versus "soft" como gerenciadas pelo sistema de arquivos, a exclusão não pode (imediatamente, não para a funcionalidade "undelete") liberar imediatamente o (s) bloco (s) reservado (s). Alguns sistemas de arquivos podem diferenciar diferentes tipos de "exclusões" e fornecer recursos correspondentes de gerenciamento de blocos de armazenamento.

Como o gerenciamento de armazenamento é abordado e implementado diferem por sistemas de arquivos, portanto, em sistemas operacionais que suportam sistemas de arquivos múltiplos / modulares, o sistema operacional normalmente fornece apenas "ganchos" para o sistema de arquivos integrar.

    
por 26.07.2011 / 20:36
1

Adicionando alguns comentários desconexos à boa resposta do user48838:

Tudo é um arquivo, incluindo diretórios. Para armazenar todas as informações do arquivo, você precisa de espaço.

Também seria válido mostrar, digamos, "64B usado" para um diretório pequeno e mostrar a quantidade de espaço usada, mas estaríamos usando vários de 4K no disco, então foi uma decisão de design basta mostrar a quantidade de espaço usado.

Do ponto de vista do design da FS, por que você se incomodaria em calcular o que foi usado? Não é necessário. E então você teria que mover as entradas para evitar buracos ... nojento.

Quando as exclusões acontecem e o tamanho de dir cai para que você possa liberar um bloco, tudo o que o gerenciamento precisaria acontecer antes de você poder fazer isso. Por que se preocupar em economizar alguns KB? As chances são que você terá que expandi-lo mais tarde, de qualquer maneira.

Deixado como um exercício para o leitor: Pense em por que seu diretório / lost + found é criado vazio, mas ocupa 16K (pelo menos no ext3).

    
por 01.08.2011 / 20:56

Tags