Почему вывод `du` часто так отличается от` du -b`
Почему вывод du
часто отличается от du -b
? -b
является сокращением для --apparent-size --block-size=1
. только используя --apparent-size
дает мне тот же результат большую часть времени, но --block-size=1
, похоже, делает трюк. я задаюсь вопросом, является ли результат корректным, и какие числа я хочу? (то есть фактический размер файла, если он скопирован на другое запоминающее устройство)
Ответы
Ответ 1
Явный размер - это количество байтов, которое ваши приложения считают файлом. Это объем данных, которые будут передаваться по сети (не считая заголовков протоколов), если вы решили отправить файл по FTP или HTTP. Это также результат cat theFile | wc -c
и количество адресного пространства, которое будет обрабатывать файл, если вы загрузили все это с помощью mmap
.
Использование диска - это объем пространства, который нельзя использовать для чего-то другого, потому что ваш файл занимает это пространство.
В большинстве случаев кажущийся размер меньше, чем использование диска, поскольку использование диска учитывает полный размер последнего (частичного) блока файла, а видимый размер учитывает только данные, которые находятся в этом последнем блоке. Тем не менее, кажущийся размер больше, когда у вас есть разреженный файл (разреженные файлы создаются при поиске где-то за концом файла, а затем что-то там пишут - ОС не беспокоится о создании множества блоков, заполненных нулями - - он создает только блок для той части файла, которую вы решили записать).
Ответ 2
Потому что по умолчанию du дает использование диска, которое является таким же или больше размера файла. Как сказано в разделе "Размер файла
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be
larger due to holes in (`sparse') files, internal fragmentation, indirect blocks, and the like
Ответ 3
Файлы и папки имеют реальный размер и размер на диске
-
- видимый размер - реальный размер файла или папки
-
размер на диске - это количество байтов, которое файл или папка занимает на диске.
То же самое при использовании только du
Если вы обнаружите, что размер видимости почти всегда на несколько величин выше, чем на диске, то это означает, что у вас есть много ( "разреженных" ) файлов с внутренними фрагментами или непрямыми блоками.
Ответ 4
Пример минимальной гранулярности блока
Давайте немного поиграем, чтобы посмотреть, что происходит.
mount
сообщает мне, что я нахожусь в разделе ext4, смонтированном в /
.
Я нахожу его размер блока с помощью:
stat -fc %s .
который дает:
4096
Теперь давайте создадим несколько файлов с размерами 1 4095 4096 4097
:
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
и результаты:
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
Итак, мы видим, что все, что ниже или равна 4096
занимает 4096
байт в самом деле.
Затем, как только мы пересечем 4097
, оно поднимется до 8192
что составляет 2 * 4096
.
Понятно, что диск всегда хранит данные на границе блока размером 4096
байт.
Что происходит с разреженными файлами?
Я не исследовал, каково точное представление, но ясно, что --apparent
принимает это во внимание.
Это может привести к тому, что видимые размеры будут больше, чем фактическое использование диска.
Например:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
дает:
8192 f
1073741825 f
Связанный: Как проверить, поддерживается ли разреженный файл
Что делать, если я хочу хранить кучу маленьких файлов?
Некоторые возможности:
Список используемой литературы:
Проверено в Ubuntu 16.04.
Ответ 5
Сравните (например) du -bm
с du -m
.
-b
устанавливает --apparent-size --block-size=1
,
но затем m
переопределяет размер блока 1M
.
Аналогично для -bh
по сравнению с -h
:
-bh
означает --apparent-size --block-size=1 --human-readable
, и снова h
переопределяет размер блока.