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 -k
podano opcję.
Domyślny rozmiar bloku zaimplementowany w GNU coreutils
ls
jest 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 <[email protected]>
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 du
i df
wynosi również 1024, ls
po prostu zdecydowałem się z nimi pogodzić. Chociaż dla du
i df
jest to sprzeczność ze standardem POSIX (więc tutaj POSIXLY_CORRECT
pojawia 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.
stat
Polecenie po prostu wyświetla informacje dostarczone przez stat
wywoł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 ls
poleceń) nie jest częścią jądra Linux (stąd stat
połączeń), są one ukierunkowane na różne aspekty systemu, GNU coreutils
jest 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 .