почему вывод `du` часто так отличается от` du -b` - PullRequest
25 голосов
/ 17 апреля 2011

почему вывод du часто так сильно отличается от du -b?-b является сокращением для --apparent-size --block-size=1.только использование --apparent-size в большинстве случаев дает мне тот же результат, но, похоже, --block-size=1 добивается цели.Интересно, если вывод будет правильным даже, и какие числа те, которые я хочу?(т.е. фактический размер файла, если копируется на другое устройство хранения)

Ответы [ 5 ]

26 голосов
/ 17 апреля 2011

Кажущийся размер - это количество байтов, которые, по вашему мнению, находятся в файле. Это объем данных, который будет передан по сети (не считая заголовков протокола), если вы решите отправить файл по FTP или HTTP. Это также результат cat theFile | wc -c и количество адресного пространства, которое файл занял бы, если бы вы загрузили все это, используя mmap.

Использование диска - это объем пространства, которое нельзя использовать для чего-то другого, поскольку ваш файл занимает это пространство.

В большинстве случаев видимый размер меньше, чем использование диска, поскольку использование диска учитывает полный размер последнего (частичного) блока файла, а очевидный размер учитывает только те данные, которые находятся в этом последнем блоке. Однако видимый размер больше, когда у вас есть разреженный файл (разреженные файлы создаются, когда вы ищете где-то за концом файла, а затем записываете что-то туда - ОС не заботится о создании большого количества блоков, заполненных нулями - - он создает блок только для той части файла, в которую вы решили записать).

1 голос

Пример минимальной гранулярности блока

Давайте немного поиграем, чтобы посмотреть, что происходит.

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.

1 голос
/ 14 ноября 2013

Файлы и папки имеют свой реальный размер и размер на диске

  • - видимый размер - это реальный размер файла или папки

  • размер на диске - это количество байтов, которое файл или папка занимает на диске. То же самое при использовании просто du

Если вы обнаружите, что кажущийся размер почти всегда на несколько величин превышает использование диска, это означает, что у вас есть много ("разреженных") файлов с внутренней фрагментацией или косвенными блоками.

1 голос
/ 12 сентября 2013

Сравните (например) du -bm с du -m.

Наборы -b --apparent-size --block-size=1, но тогда m переопределяет размер блока на 1M.

Аналогично для -bh против -h: -bh означает --apparent-size --block-size=1 --human-readable, и снова h переопределяет этот размер блока.

1 голос
/ 17 апреля 2011

Потому что по умолчанию du дает использование диска, которое равно или больше, чем размер файла.Как сказано в --apparent-size

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
...