Después de profundizar en el código fuente y el estándar POSIX, diría que la respuesta de @ antje-m y @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 sistema de archivos se base en bloques de 512 bytes. La opción -k se agregó como una medida de compromiso. Los desarrolladores estándar acordaron que 512 bytes era la mejor unidad predeterminada debido a su coherencia histórica completa en el Sistema V (frente al uso mixto de 512/1024 bytes en sistemas BSD), y que una opción -k para cambiar a 1024- unidades de bytes fue un buen compromiso. Los usuarios que prefieren la cantidad más lógica de 1024 bytes pueden alias fácilmente 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
:
POSIX dice que el tamaño de bloque predeterminado está definido por la implementación, a menos que -k
se brinde 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 viejo commit:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
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 du
y df
también es 1024, ls
simplemente eligió consistir en ellos. Aunque para du
y df
es un conflicto con el estándar POSIX (aquí POSIXLY_CORRECT
viene la variable de entorno ). Esto parece una decisión del equipo de GNU, vea la página de wikipedia POSIX sobre esta controversia.
Por el comando stat
.
No es parte del estándar POSIX, pero la llamada del sistema sí . Sin embargo, la unidad para el tamaño de bloque no está estandarizada ( sys_stat.h ):stat
La unidad para el miembro st_blocks de la estructura estadística no está definida en POSIX.1-2008.
El stat
comando simplemente muestra la información proporcionada por la stat
llamada al sistema, y con un tamaño de bloque de 512 con pocas excepciones (no son Linux, por ejemplo, HP-UX, IBM AIX, etc., consulte 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
(de ahí el ls
comando) no es parte del kernel de Linux (de ahí la stat
llamada), apuntan a diferentes aspectos del sistema, GNU coreutils
es más para humanos (más fácil de leer) y el kernel de Linux para resumen de hardware (por lo tanto, más cercano al hardware).
Editar: el tamaño del bloque 4096 es el tamaño del "bloque IO", el tamaño del bloque físico real probablemente todavía sea 512 Byte como se explica en esta pregunta .