Dopo aver scavato nel codice sorgente e nello standard POSIX, direi che la risposta di @ antje-m e @Gilles è per lo più corretta.
Vale la pena citare il commento di POSIX.1-2008 , come riassunto:
L'uso di unità da 512 byte è una pratica storica e mantiene la compatibilità con ls e altre utilità in questo volume di POSIX.1-2008. Ciò non impone che il file system stesso sia basato su blocchi da 512 byte. L'opzione -k è stata aggiunta come misura di compromesso. Gli sviluppatori standard hanno concordato che 512 byte era la migliore unità predefinita a causa della sua completa coerenza storica sul Sistema V (rispetto all'utilizzo misto da 512/1024 byte sui sistemi BSD) e che l'opzione -k per passare a 1024- le unità byte erano un buon compromesso. Gli utenti che preferiscono la quantità più logica di 1024 byte possono facilmente alias df a df -k senza rompere molti script storici basandosi sulle unità da 512 byte.
Per la dimensione del blocco in ls -s:
POSIX afferma che la dimensione del blocco predefinita è definita dall'implementazione, a meno che non -kvenga fornita l'opzione.
La dimensione del blocco predefinita implementata in GNU coreutils lsè definita in 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
che proviene da un vecchio commit:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
Il messaggio stesso di commit non ha detto nulla sul numero 1024.
E nota che la dimensione del blocco usata in dued dfè anche 1024, ha lsappena scelto di consistere con loro. Anche se per dued dfè una conflitto con lo standard POSIX (quindi qui POSIXLY_CORRECTarriva la variabile d'ambiente ). Questa è una decisione del team GNU, vedere la pagina POSIX di Wikipedia su questa controversia.
Per il comando stat.
Non fa parte dello standard POSIX, ma lo è la chiamata di sistema . Tuttavia, l'unità per la dimensione del blocco non è standardizzata ( sys_stat.h ):stat
L'unità per il membro st_blocks della struttura stat non è definita in POSIX.1-2008.
Il statcomando visualizza semplicemente le informazioni fornite dalla statchiamata di sistema e utilizzando 512 blocchi di dimensioni con poche eccezioni (sono non Linux, ad esempio HP-UX, IBM AIX ecc. Vedere le macro definite in gnulib/lib/stat-size.h).
Quindi il numero 512 è più una scelta storica e una convenzione di Linux.
Il GNU coreutils(da qui il lscomando) non fa parte del kernel Linux (da qui la statchiamata), stanno prendendo di mira aspetti di sistema diversi, GNU coreutilsè più per umani (più facile da leggere), e kernel Linux per abstract hardware (quindi più vicino all'hardware).
Modifica: la dimensione del blocco 4096 è la dimensione del "blocco IO", la dimensione del blocco fisico reale è probabilmente ancora 512 byte, come spiegato in questa domanda .