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 coreutils
ls
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.