После изучения исходного кода и стандарта POSIX я бы сказал, что ответы @ antje-m и @Gilles в основном правильные.
Стоит процитировать комментарий от POSIX.1-2008 , в качестве резюме:
Использование 512-байтовых модулей является исторической практикой и поддерживает совместимость с ls и другими утилитами в этом томе POSIX.1-2008. Это не требует, чтобы сама файловая система была основана на 512-байтовых блоках. Опция -k была добавлена в качестве компромиссной меры. Разработчики стандарта согласились с тем, что 512 байт было лучшим модулем по умолчанию из-за его полной исторической согласованности в System V (по сравнению со смешанным использованием 512/1024 байт в системах BSD) и что опция -k для переключения на 1024- Единицы байтов были хорошим компромиссом. Пользователи, которые предпочитают более логичное 1024-байтовое количество, могут легко использовать псевдоним df для df -k, не нарушая многие исторические сценарии, полагаясь на 512-байтовые блоки.
Для размера блока в ls -s
:
POSIX говорит, что размер блока по умолчанию определяется реализацией, если -k
не указана опция.
Размер блока по умолчанию, реализованный в GNU coreutils
ls
, определяется в 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
который происходит от старого коммита:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
Само сообщение о фиксации ничего не говорит о числе 1024.
И обратите внимание, что размер блока, который используется du
и df
составляет также 1024, ls
просто решил с ними заключить. Хотя для du
и df
это противоречие со стандартом POSIX (поэтому здесь переменная окружения POSIXLY_CORRECT
приходит). Это, кажется, решение команды GNU, см. Страницу POSIX в Википедии об этом противоречии.
Для команды stat
.
Это не часть стандарта POSIX, но системный вызов . Однако единица измерения для размера блока не стандартизирована ( sys_stat.h ):stat
Модуль для элемента st_blocks структуры stat не определен в POSIX.1-2008.
Команда stat
просто отображает информацию, предоставленную stat
системным вызовом, и использует размер блока 512 за небольшим исключением (они не являются Linux, например, HP-UX, IBM AIX и т. Д., См. Макросы, определенные в gnulib/lib/stat-size.h
).
Так что число 512 - это скорее исторический выбор и соглашение Linux.
GNU coreutils
(Отсюда и ls
команда) не является частью Linux ядра (отсюда и stat
вызов), они нацелены на различные аспекты системы, GNU coreutils
больше для человека (легче читать), и Linux ядро для аппаратного абстрактных (отсюда ближе к аппаратным средствам).
Изменить: размер блока 4096 является размером "блока ввода-вывода", реальный размер физического блока, вероятно, все еще 512 байт, как объяснено в этом вопросе .