Nachdem ich mich mit dem Quellcode und dem POSIX-Standard befasst habe, würde ich sagen, dass die Antwort von @ antje-m und @Gilles größtenteils richtig ist.
Es lohnt sich, den Kommentar von POSIX.1-2008 als Zusammenfassung zu zitieren :
Die Verwendung von 512-Byte-Einheiten ist eine historische Praxis und gewährleistet die Kompatibilität mit ls und anderen Dienstprogrammen in diesem Band von POSIX.1-2008. Dies erfordert nicht, dass das Dateisystem selbst auf 512-Byte-Blöcken basiert. Die Option -k wurde als Kompromissmaßnahme hinzugefügt. Die Standardentwickler waren sich einig, dass 512 Bytes aufgrund ihrer vollständigen historischen Konsistenz auf System V (im Vergleich zur gemischten Verwendung von 512/1024 Bytes auf BSD-Systemen) die beste Standardeinheit sind und dass eine -k-Option zum Umschalten auf 1024 Byte besteht. Byte-Einheiten waren ein guter Kompromiss. Benutzer, die die logischere Menge von 1024 Byte bevorzugen, können problemlos df zu df -k aliasen, ohne viele historische Skripte zu beschädigen, die auf den 512-Byte-Einheiten basieren.
Für die Blockgröße in ls -s
:
Der POSIX gibt an, dass die Standardblockgröße implementierungsdefiniert ist, sofern keine -k
Option angegeben ist.
Die in implementierte Standardblockgröße GNU coreutils
ls
ist definiert 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
das kommt von einem alten Commit:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
Die Festschreibungsnachricht selbst sagte nichts über die Nummer 1024 aus.
Und beachten Sie, dass die Blockgröße, die in du
und df
auch 1024 verwendet wird, ls
nur gewählt wurde, um mit ihnen zu bestehen. Obwohl für du
und df
es ein Konflikt zum POSIX-Standard ist (hier POSIXLY_CORRECT
kommt also die Umgebungsvariable ). Dies scheint eine Entscheidung des GNU-Teams zu sein, siehe die Wikipedia-Seite POSIX zu dieser Kontroverse.
Für den Befehl stat
.
Es ist kein Teil des POSIX-Standards, aber der Systemaufruf ist. Die Einheit für die Blockgröße ist jedoch nicht standardisiert ( sys_stat.h ):stat
Die Einheit für das st_blocks-Mitglied der stat-Struktur ist in POSIX.1-2008 nicht definiert.
Der stat
Befehl zeigt einfach die durch den stat
Systemaufruf bereitgestellten Informationen an und verwendet mit wenigen Ausnahmen die Blockgröße 512 (es handelt sich um Nicht-Linux- Informationen , z. B. HP-UX, IBM AIX usw., siehe die in definierten Makros gnulib/lib/stat-size.h
).
Die Nummer 512 ist also eher eine historische Wahl und eine Linux-Konvention.
Der GNU coreutils
(daher der ls
Befehl) ist kein Teil des Linux-Kernels (daher der stat
Aufruf), er zielt auf verschiedene Systemaspekte ab, GNU coreutils
ist eher für Menschen (einfacher zu lesen) und der Linux-Kernel für Hardware-Abstracts (daher näher an Hardware).
Bearbeiten: Die Blockgröße 4096 ist die Größe des "E / A-Blocks". Die tatsächliche physische Blockgröße beträgt wahrscheinlich immer noch 512 Byte, wie in dieser Frage erläutert .