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 -k
venga 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 du
ed df
è anche 1024, ha ls
appena scelto di consistere con loro. Anche se per du
ed df
è una conflitto con lo standard POSIX (quindi qui POSIXLY_CORRECT
arriva 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 stat
comando visualizza semplicemente le informazioni fornite dalla stat
chiamata 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 ls
comando) non fa parte del kernel Linux (da qui la stat
chiamata), 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 .