Saltar al contenido

tamaño de bloque de archivo – diferencia entre stat y ls

Hacemos una revisión completa cada uno de los enunciados en nuestra página web con la meta de mostrarte siempre la información veraz y actual.

Solución:

Muchos discos tienen un tamaño de sector de 512 bytes, lo que significa que cualquier lectura o escritura en el disco transfiere un sector completo de 512 bytes a la vez. Es bastante natural diseñar sistemas de archivos donde un sector no está dividido entre archivos (eso complicaría el diseño y dañaría el rendimiento); por lo tanto, los sistemas de archivos tienden a usar trozos de 512 bytes para los archivos. De ahí las utilidades tradicionales como ls y du indican tamaños en unidades de bloques de 512 bytes.

Para los humanos, las unidades de 512 bytes no son muy significativas. 1kB es el mismo orden de magnitud y mucho más significativo. Un bloque del sistema de archivos (la unidad más pequeña en la que se divide un archivo) en realidad a menudo consta de varios sectores: 1kB, 2kB y 4kB son tamaños comunes de bloques del sistema de archivos; por lo que la unidad de 512 bytes no está fuertemente justificada por el diseño del sistema de archivos, y no hay otra razón que la tradición para usar una unidad de 512 bytes fuera de un controlador de disco.

Así que tienes una tradición que no tiene mucho que ofrecer, y una convención más legible que se está imponiendo. Un poco como octal y hexadecimal: no hay uno correcto y otro incorrecto, son formas diferentes de escribir los mismos números.

Muchas herramientas tienen una opción para seleccionar unidades de visualización: ls --block-size=512 para GNU ls, ajuste POSIXLY_CORRECT=1 en el entorno para GNU df y GNU du para obtener unidades de 512 bytes (o pasar -k para forzar unidades de 1kB). Que stat comando en GNU coreutils se expone como el “tamaño de bloque” (el %B value) es un valor dependiente del sistema operativo de una interfaz interna; Dependiendo del sistema operativo, puede o no estar relacionado con un tamaño utilizado por el sistema de archivos o el código del disco (por lo general, no lo es; consulte Diferencia entre tamaño de bloque y tamaño de clúster). En Linux, el valor es 512, independientemente de lo que esté haciendo cualquier controlador subyacente. El valor de %B nunca importa, es solo una rareza que exista.

Después de profundizar en el código fuente y el estándar POSIX, diría que la respuesta de @ antje-my @Gilles es en su mayoría correcta.

Vale la pena citar el comentario de POSIX.1-2008, como resumen:

El uso de unidades de 512 bytes es una práctica histórica y mantiene la compatibilidad con ls y otras utilidades en este volumen de POSIX.1-2008. Esto no exige que el propio sistema de archivos se base en bloques de 512 bytes. La opción -k se agregó como medida de compromiso. Los desarrolladores estándar acordaron que 512 bytes era la mejor unidad predeterminada debido a su completa coherencia histórica en System V (frente a la mixed 512/1024 bytes en sistemas BSD), y esa opción -k para cambiar a unidades de 1024 bytes fue un buen compromiso. Los usuarios que prefieren la cantidad más lógica de 1024 bytes pueden fácilmente alias df a df -k sin romper muchos scripts históricos que dependen de las unidades de 512 bytes.

Para el tamaño del bloque en ls -s:

El POSIX dice que el tamaño de bloque predeterminado está definido por la implementación, a menos que -k se da la opción.

El tamaño de bloque predeterminado implementado en GNU coreutilsls se define en GNU gnulib:
gnulib/lib/human.c

/* The default block size used for output.  This number may change in
   the future as disks get larger.  */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif

que proviene de un compromiso antiguo:

commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <[email protected]>
Date:   Mon Jun 29 15:23:04 1998 +0000

El mensaje de confirmación en sí no decía nada sobre el número 1024.

Y tenga en cuenta que el tamaño de bloque utilizado en du y df también es 1024, ls simplemente eligió consistir con ellos. Aunque para du y df es un conflicto con el estándar POSIX (así que aquí la variable de entorno POSIXLY_CORRECT llega). Esto parece ser una decisión del equipo GNU, consulte la página de wikipedia POSIX sobre esta controversia.

Para el comando stat.

No es parte del estándar POSIX, pero el stat la llamada al sistema es. Sin embargo, la unidad para el tamaño del bloque no está estandarizada (sys_stat.h):

La unidad para el miembro st_blocks de la estructura stat no está definida dentro de POSIX.1-2008.

El stat comando simplemente muestra la información proporcionada por stat llamada al sistema, y ​​usando un tamaño de bloque 512 con pocas excepciones (no son Linux, por ejemplo, HP-UX, IBM AIX, etc.ver las macros definidas en gnulib/lib/stat-size.h).

Entonces, el número 512 es más una elección histórica y una convención de Linux.

El GNU coreutils (por lo tanto, la ls comando) no es parte del kernel de Linux (de ahí el stat llamada), se dirigen a diferentes aspectos del sistema, GNU coreutils es más para humanos (más fácil de leer) y el kernel de Linux para hardware abstracto (por lo tanto, más cercano al hardware).

Editar: el tamaño del bloque 4096 es el tamaño del “bloque de E / S”, el tamaño real del bloque físico probablemente aún sea de 512 bytes como se explica en esta pregunta.

Tienes la opción de avalar nuestro trabajo añadiendo un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *