Après avoir creusé dans le code source et la norme POSIX, je dirais que la réponse de @ antje-m et @Gilles est généralement correcte.
Il vaut la peine de citer le commentaire de POSIX.1-2008 , en résumé:
L'utilisation d'unités de 512 octets est une pratique historique et maintient la compatibilité avec ls et d'autres utilitaires dans ce volume de POSIX.1-2008. Cela n'impose pas que le système de fichiers lui-même soit basé sur des blocs de 512 octets. L'option -k a été ajoutée comme mesure de compromis. Les développeurs standard ont convenu que 512 octets était la meilleure unité par défaut en raison de sa cohérence historique complète sur le système V (par rapport à l'utilisation mixte de 512/1024 octets sur les systèmes BSD), et qu'une option -k pour passer à 1024- unités d'octets était un bon compromis. Les utilisateurs qui préfèrent la quantité de 1024 octets la plus logique peuvent facilement alias df en df -k sans casser de nombreux scripts historiques s'appuyant sur les unités de 512 octets.
Pour la taille de bloc en ls -s
:
Le POSIX indique que la taille de bloc par défaut est définie par l'implémentation, sauf si une -k
option est donnée.
La taille de bloc par défaut implémentée dans GNU coreutils
ls
est définie dans 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
qui provient d'un ancien commit:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <[email protected]>
Date: Mon Jun 29 15:23:04 1998 +0000
Le message de validation lui-même n'a rien dit sur le nombre 1024.
Et notez que la taille de bloc utilisée dans du
et df
est également de 1024, ls
choisissez simplement de les consister. Bien que pour du
et df
c'est une confluence avec la norme POSIX (alors voici la variable d'environnement POSIXLY_CORRECT
). Cela semble être une décision de l'équipe GNU, voir la page wikipedia POSIX sur cette controverse.
Pour la commande stat
.
Il ne fait pas partie de la norme POSIX, mais l' appel système l' est. Cependant, l'unité de taille de bloc n'est pas standardisée ( sys_stat.h ):stat
L'unité du membre st_blocks de la structure stat n'est pas définie dans POSIX.1-2008.
La stat
commande affiche simplement les informations fournies par l' stat
appel système et utilise la taille de bloc 512 à quelques exceptions près (elles ne sont pas Linux, par exemple HP-UX, IBM AIX, etc. voir les macros définies dans gnulib/lib/stat-size.h
).
Le nombre 512 est donc plutôt un choix historique et une convention Linux.
Le GNU coreutils
(d'où la ls
commande) ne fait pas partie du noyau Linux (d'où l' stat
appel), il cible différents aspects du système, GNU coreutils
est plus pour l'homme (plus facile à lire), et le noyau Linux pour le résumé matériel (donc plus proche du matériel).
Edit: la taille du bloc 4096 est la taille du "bloc IO", la taille réelle du bloc physique est probablement encore de 512 octets comme expliqué dans cette question .