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

26

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

Por que o Unix reserva 4096 bytes para cada pasta?

lazer
fonte

Respostas:

30

É 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/

fonte

harrymc
fonte
3
Obrigado pela parte "o espaço não é liberado se os arquivos forem removidos". Eu restaurei um backup e não sabia por que dois diretórios idênticos tinham tamanhos diferentes.
Tomasz Zieliński
11

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

O mesmo se aplica aos arquivos. Embora alguns arquivos possam relatar menos que 4096, na verdade eles estão consumindo pelo menos 4096 de armazenamento em disco.

Pablo Santa Cruz
fonte
4
Sim, como Pablo disse. O tamanho que você está visualizando com o arquivo é o tamanho do conteúdo dos arquivos, não os arquivos no tamanho do disco. O tamanho no disco desses pequenos arquivos é realmente 4096, assim como o diretório que ele só pode alocar espaço em disco em blocos desse tamanho
Dan McGrath
1
Isso não tem nada a ver com a pergunta.
harrymc
Isto está incorreto. Veja a resposta aceita.
Duncan X Simpson
Incorreta? Não é uma combinação de ambas as respostas? 4096 é o tamanho da página, consulte sistemas de paginação de memória para obter mais informações.
Harrichael
5

4096 é reservado para reduzir a fragmentação, porque geralmente o tamanho real dos metadados contidos flutua com base no conteúdo do diretório. Se estiver constantemente crescendo e diminuindo (digamos, continha arquivos de log ou conteúdo dinâmico) ao longo do tempo, isso poderia prejudicar o desempenho. Provavelmente, isso não aconteceria com uma pasta, mas em todo o sistema de arquivos seria acrescentado rapidamente.

MDMarra
fonte
3

Depende do sistema de arquivos. No ext2 / 3/4, "é" 4096. No reiserfs, pode ser 9608 (my $HOME) 1032 ( /tmp) ou 48 (alguns dir in /tmp).

Por padrão, no bloco ext2 / 3/4 é 4096 - e o arquivo não pode demorar menos que isso. Se o arquivo for menor, será necessário um bloco inteiro. Como é inútil perguntar sobre o tamanho lógico do diretório e essas informações provavelmente não estão no disco e, de qualquer forma, é necessário relatar algo que informa um tamanho de bloco vezes o número de blocos ocupados, ou seja, o espaço físico que foi ocupado.

Maciej Piechotka
fonte
Tenho certeza de que o tamanho do arquivo também não é armazenado com os arquivos. É calculado quando necessário. Mas para arquivos, ele informa o actualtamanho do arquivo.
Lazer
1
O tamanho do arquivo é armazenado com o inode. Com certeza o ext2 inode contém o tamanho em bytes dentro dele. Caso contrário, seria impossível encontrar onde o arquivo termina como \0o caractere legal nos arquivos binários. PS. É possível criar FS que não o armazena - mas apenas não ext familly (e provavelmente nenhum outro popular).
Maciej Piechotka 19/05/10