Після копання у вихідний код та стандарт POSIX, я б сказав, що відповіді @ antje-m та @Gilles здебільшого вірні.
Варто навести коментар від POSIX.1-2008 , як короткий підсумок:
Використання 512-байтних одиниць є історичною практикою і підтримує сумісність з ls та іншими утилітами в цьому обсязі POSIX.1-2008. Це не вимагає, щоб сама файлова система базувалася на 512-байтових блоках. Варіант -k був доданий як компромісний захід. Стандартні розробники домовилися, що 512 байти - найкраща одиниця за замовчуванням через повну історичну узгодженість системи 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 - це розмір "IO block", реальний фізичний розмір блоку, ймовірно, все ще 512 байт, як пояснено в цьому запитанні .