почему вывод `du` часто так отличается от` du -b`

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


person knittl    schedule 17.04.2011    source источник
comment
Почему голос против? Похоже, это очень хороший вопрос. Пожалуйста, будьте любезны, прокомментируйте, если вы собираетесь проголосовать против вопроса или ответа, чтобы каждый мог чему-то научиться. Анонимный отрицательный голос - это потенциальный обучающий момент, который отброшен.   -  person Pete Wilson    schedule 17.04.2011
comment
@Pete: вероятно, потому что это не по теме для StackOverflow. Я надеюсь, что это заметят еще несколько пользователей с высокой репутацией.   -  person Ken Bloom    schedule 18.04.2011
comment
Связанный вопрос по ServerFault: serverfault.com/questions/290088/   -  person GDP2    schedule 25.02.2019


Ответы (5)


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

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

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

person Ken Bloom    schedule 17.04.2011
comment
Благодарность! это подробное объяснение. тогда почему мне нужно иметь --block-size=1, чтобы иметь тот же результат, что и wc -c theFile (сохранение процесса cat). похоже, du выводит только правильное количество байтов, когда я указываю -h, -k, -m, -B1 и т. д.? а может это действительно другой вопрос? du по умолчанию выводит использование блоков, а не байтов? - person knittl; 17.04.2011
comment
Хорошее объяснение, но не говорит о --block-size=1, присутствующем в вопросе - -1. - person Piotr Dobrogost; 17.02.2017

Пример минимальной детализации блоков

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

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.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 04.04.2019

Потому что по умолчанию 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
person Brian Carlton    schedule 17.04.2011
comment
так что же такое «видимый размер»? и я сталкиваюсь с точностью до наоборот: кажущийся размер почти всегда на несколько порядков выше, чем использование диска. - person knittl; 17.04.2011
comment
Фактически, по умолчанию он может быть меньше на разделах с включенным сжатием. - person ARA1307; 27.06.2018

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

-b устанавливает --apparent-size --block-size=1, но затем m заменяет размер блока равным 1M.

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

person Ruud H.G. van Tol    schedule 12.09.2013
comment
Если внимательно прочитать вопрос, это должен быть правильный ответ. Дело должно быть в том, что --block-size часто не 1 по умолчанию (т.е. du без какой-либо опции), а скорее 1024 или 512. --apparent-size не имеет отношения к побочному эффекту -b. - person norio; 11.07.2019

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

  • --apparent-size - реальный размер файла или папки

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

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

person hukko    schedule 13.11.2013