Почему вывод `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 переопределяет размер блока.