Формула: что это за число?
total int = Сумма (physical_blocks_in_use) * physical_block_size / ls_block_size) для каждого файла.
Куда:
ls_block_size
- произвольная переменная среды (обычно 512 или 1024 байта), которую можно свободно изменять с включенным
--block-size=<int>
флагом ls
, POSIXLY_CORRECT=1
переменной среды GNU (для получения единиц размером 512 байт) или -k
флагом для принудительной установки единиц размером 1 КБ.
physical_block_size
- это зависящее от ОС значение внутреннего блочного интерфейса, который может быть подключен или не подключен к базовому оборудованию. Это значение обычно составляет 512b или 1k, но полностью зависит от ОС. Это можно определить с помощью %B
значения на stat
или fstat
. Обратите внимание, что это значение (почти всегда) не связано с количеством физических блоков на современном устройстве хранения.
Почему так непонятно?
Это число не имеет никакого отношения к физическим или значимым показателям. Многие молодые программисты не имели опыта работы с файловыми дырами или жесткими / символьными ссылками . Кроме того, документации по этой конкретной теме практически не существует.
Несвязанность и неоднозначность термина «размер блока» является результатом того, что множество различных мер легко перепутать, и относительно глубокие уровни абстракции, вращающиеся вокруг доступа к диску.
Примеры противоречивой информации: du
(или ls -s
) vsstat
Запуск du *
в папке проекта дает следующее: (Примечание: ls -s
возвращает те же результаты.)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Итого : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 блока.
Но когда один бежит, stat
мы видим другой набор ценностей. Запуск stat
в том же каталоге дает:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Итого: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 блоков
Примечание. Вы можете использовать команду stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> для вывода (по порядку) количества блоков (в скобках) размера этих блоков, имени файла и размера в байтах, как показано выше.
Есть два важных вывода:
stat
сообщает обо всех значениях physical_blocks_in_use
и, physical_block_size
используемых в приведенной выше формуле. Обратите внимание, что это значения, основанные на интерфейсах ОС.
du
дает то, что обычно считается довольно точной оценкой использования физического диска.
Для справки, вот ls -l
каталог выше:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
в моей системе эта строка не упоминается, ноinfo coreutils ls
есть. Как получаетсяman ls
иinfo coreutils ls
иметь разную информацию об одной и той же команде? Почему неls
документируют один раз? Наличие двух разных документов для одной и той же команды похоже на провал.