Po zagłębieniu się w kod źródłowy i standard POSIX, powiedziałbym, że odpowiedź @ antje-m i @Gilles są w większości poprawne.
Warto zacytować komentarz z POSIX.1-2008 jako podsumowanie:
Wykorzystanie 512-bajtowych jednostek jest historyczną praktyką i utrzymuje zgodność z ls i innymi narzędziami w tym tomie POSIX.1-2008. Nie wymaga to, aby sam system plików był oparty na blokach 512-bajtowych. Opcja -k została dodana jako środek kompromisowy. Standardowi programiści uzgodnili, że 512 bajtów jest najlepszą jednostką domyślną ze względu na pełną historyczną spójność w Systemie V (w porównaniu do mieszanego użycia 512/1024-bajtów w systemach BSD) oraz opcję -k przełączającą się na 1024- jednostki bajtowe były dobrym kompromisem. Użytkownicy, którzy wolą bardziej logiczną 1024-bajtową liczbę, mogą łatwo zmienić alias df na df -k bez przerywania wielu historycznych skryptów opartych na jednostkach 512-bajtowych.
Dla rozmiaru bloku w ls -s:
POSIX mówi, że domyślny rozmiar bloku jest zdefiniowany w implementacji, chyba że -kpodano opcję.
Domyślny rozmiar bloku zaimplementowany w GNU coreutils lsjest zdefiniowany w 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
który pochodzi ze starego zatwierdzenia:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
Sam komunikat zatwierdzenia nie mówił nic o liczbie 1024.
I zauważ, że rozmiar bloku użyty w dui dfwynosi również 1024, lspo prostu zdecydowałem się z nimi pogodzić. Chociaż dla dui dfjest to sprzeczność ze standardem POSIX (więc tutaj POSIXLY_CORRECTpojawia się zmienna środowiskowa ). To wydaje się decyzja zespołu GNU, patrz strona Wikipedii POSIX na temat tej kontrowersji.
Dla polecenia stat.
Nie jest to część standardu POSIX, ale wywołanie systemowe to. Jednak jednostka wielkości bloku nie jest ustandaryzowana ( sys_stat.h ):stat
Jednostka dla elementu st_blocks w strukturze statystyk nie jest zdefiniowana w POSIX.1-2008.
statPolecenie po prostu wyświetla informacje dostarczone przez statwywołanie systemowe, a przy użyciu 512 rozmiar bloku z kilkoma wyjątkiem (są one non-Linux, na przykład HP-UX, IBM AIX itp widzieć makra zdefiniowane w gnulib/lib/stat-size.h).
Liczba 512 jest więc raczej historycznym wyborem i konwencją Linuksa.
GNU coreutils(Stąd lspoleceń) nie jest częścią jądra Linux (stąd statpołączeń), są one ukierunkowane na różne aspekty systemu, GNU coreutilsjest bardziej dla ludzi (łatwiejsze do odczytania) i jądro Linux dla sprzętu abstrakcyjnego (stąd bliżej do sprzętu).
Edycja: rozmiar bloku 4096 jest rozmiarem „bloku we / wy”, rzeczywisty rozmiar bloku fizycznego prawdopodobnie nadal wynosi 512 bajtów, jak wyjaśniono w tym pytaniu .