Por que o tamanho de um diretório é sempre 4096 bytes no unix?

23

Tenho certeza de que um arquivo de diretório tem muito menos informações do que 4096 bytes. Eu sei que o tamanho do setor é 4096 bytes. Mas arquivos normais menores que isso existem.

Por que o Unix reserva 4096 bytes para cada pasta?

    
por Lazer 19.05.2010 / 13:44

4 respostas

27

É o tamanho inicial necessário para armazenar os metadados sobre os arquivos contidos nesse diretório (incluindo nomes). A alocação inicial é igual ao tamanho de um setor, mas pode crescer acima disso, se necessário. Uma vez alocado, o espaço não é liberado se os arquivos forem removidos, para reduzir a fragmentação.

Por exemplo:

$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/

source

    
por 19.05.2010 / 13:54
10

Às vezes, 4096 bytes é a menor unidade de alocação para alguns sistemas de arquivos. É por isso que o diretório tem 4096.

O mesmo se aplica aos arquivos. Mesmo que alguns arquivos possam reportar menos que 4096, eles estão pegando pelo menos 4096 de armazenamento do disco.

    
por 19.05.2010 / 13:50
4

O 4096 é reservado para reduzir a fragmentação, porque muitas vezes o tamanho real dos metadados contidos irá flutuar com base no conteúdo do diretório. Se estiver constantemente crescendo e diminuindo (digamos que continha arquivos de log ou conteúdo dinâmico) com o tempo, isso poderia prejudicar o desempenho. Isso provavelmente não aconteceria com uma pasta, mas em todo o sistema de arquivos isso aumentaria rapidamente.

    
por 19.05.2010 / 13:53
3

Depende do sistema de arquivos. No ext2 / 3/4 é "4096". No reiserfs pode ser 9608 (meu $HOME ) 1032 ( /tmp ) ou 48 (algum dir em /tmp ).

Por padrão, o bloco ext2 / 3/4 é 4096 - e o arquivo não pode levar menos que isso. Se o arquivo é menor, leva um bloco inteiro de qualquer maneira. Como é inútil perguntar sobre o tamanho lógico do diretório e esta informação provavelmente não está no disco de qualquer maneira e tem que reportar algo que reporta um tamanho de blocos vezes o número de blocos tirados, isto é, o espaço físico que foi tomado.

    
por 19.05.2010 / 14:05