¿Por qué el tamaño de un directorio siempre es de 4096 bytes en unix?


26

Estoy seguro de que un archivo de directorio tiene mucha menos información que 4096 bytes. Sé que el tamaño del sector es 4096 bytes. Pero existen archivos normales más pequeños que eso.

¿Por qué Unix reserva 4096 bytes para cada carpeta?

Respuestas:


30

Es el tamaño inicial necesario para almacenar los metadatos sobre los archivos contenidos en ese directorio (incluidos los nombres). La asignación inicial es igual al tamaño de un sector, pero puede crecer por encima de eso si es necesario. Una vez asignado, el espacio no se libera si se eliminan los archivos, para reducir la fragmentación.

Por ejemplo:

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

fuente


3
Gracias por la parte "el espacio no se libera si se eliminan los archivos". Restablecí una copia de seguridad y no estaba seguro de por qué dos directorios idénticos tenían tamaños diferentes.
Tomasz Zieliński

11

A veces, 4096 bytes es la unidad de asignación más pequeña para algunos sistemas de archivos. Es por eso que el directorio tiene 4096.

Lo mismo se aplica a los archivos. Aunque algunos archivos pueden informar menos de 4096, en realidad están tomando al menos 4096 de almacenamiento del disco.


44
Sí, como dijo Pablo. El tamaño que está viendo con el archivo es el tamaño del contenido de los archivos, no los archivos en el tamaño del disco. El tamaño en el disco de esos archivos pequeños es en realidad 4096, al igual que el directorio, ya que solo puede asignar espacio en el disco en bloques de ese tamaño
Dan McGrath

1
Esto no tiene nada que ver con la pregunta.
harrymc

Esto es incorrecto. Ver la respuesta aceptada.
Duncan X Simpson

¿Incorrecto? ¿No es una combinación de ambas respuestas? 4096 es el tamaño de página, consulte los sistemas de paginación de memoria para obtener más información.
Harrichael

5

4096 está reservado para reducir la fragmentación, porque a menudo el tamaño real de los metadatos contenidos fluctuará en función del contenido del directorio. Si crece y se reduce constantemente (digamos que contenía archivos de registro o contenido dinámico) con el tiempo, podría afectar el rendimiento. Esto probablemente no sucedería con una carpeta, pero en todo el sistema de archivos se sumaría rápidamente.


3

Depende del sistema de archivos. En ext2 / 3/4 "es" 4096. En reiserfs puede ser 9608 (my $HOME) 1032 ( /tmp) o 48 (algunos dir in /tmp).

Por defecto, el bloque ext2 / 3/4 es 4096, y el archivo no puede tomar menos que eso. Si el archivo es más pequeño, toma un bloque completo de todos modos. Como no tiene sentido preguntar sobre el tamaño lógico del directorio y esta información probablemente no esté en el disco de todos modos y tiene que informar algo, informa un tamaño de bloque multiplicado por el número de bloques ocupados, es decir, el espacio físico que se ha ocupado.


Estoy seguro de que el tamaño del archivo tampoco se almacena con los archivos. Se calcula cuando es necesario. Pero para los archivos, informa el actualtamaño del archivo.
Lazer

1
El tamaño del archivo se almacena con el inodo. Seguro que el inodo ext2 contiene el tamaño en bytes dentro de él. De lo contrario, sería imposible encontrar dónde termina el archivo, ya que \0es un carácter legal en los archivos binarios. PD. Es posible crear FS que no lo almacenan, pero que no son muy familiares (y probablemente no sean otros populares).
Maciej Piechotka
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.