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 -kse brinde la opción.
El tamaño de bloque predeterminado implementado en GNU coreutils lsse 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 <[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 duy dftambién es 1024, lssimplemente eligió consistir en ellos. Aunque para duy dfes un conflicto con el estándar POSIX (aquí POSIXLY_CORRECTviene 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 statcomando simplemente muestra la información proporcionada por la statllamada 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 lscomando) no es parte del kernel de Linux (de ahí la statllamada), apuntan a diferentes aspectos del sistema, GNU coreutilses 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 .