почему результат du
часто так отличается от du -b
? -b
- это сокращение от --apparent-size --block-size=1
. только использование --apparent-size
в большинстве случаев дает тот же результат, но --block-size=1
, похоже, помогает. Интересно, верен ли тогда результат, и какие числа мне нужны? (т.е. фактический размер файла, если он скопирован на другое устройство хранения)
почему вывод `du` часто так отличается от` du -b`
Ответы (5)
Видимый размер - это количество байтов, которое, по мнению вашего приложения, находится в файле. Это объем данных, который будет передан по сети (не считая заголовков протокола), если вы решите отправить файл по FTP или HTTP. Это также результат cat theFile | wc -c
и объем адресного пространства, которое файл займет, если вы загрузите все это с помощью mmap
.
Использование диска - это объем пространства, который нельзя использовать для чего-то еще, потому что ваш файл занимает это пространство.
В большинстве случаев кажущийся размер меньше, чем использование диска, потому что использование диска учитывает полный размер последнего (частичного) блока файла, а кажущийся размер учитывает только данные, находящиеся в этом последнем блоке. Однако кажущийся размер больше, когда у вас есть разреженный файл (разреженные файлы создаются, когда вы ищете где-то за концом файла, а затем записываете что-то там - ОС не заботится о создании большого количества блоков, заполненных нулями - - он создает блок только для той части файла, в которую вы решили записать).
--block-size=1
, чтобы иметь тот же результат, что и wc -c theFile
(сохранение процесса cat). похоже, du
выводит только правильное количество байтов, когда я указываю -h, -k, -m, -B1 и т. д.? а может это действительно другой вопрос? du
по умолчанию выводит использование блоков, а не байтов?
- person knittl; 17.04.2011
--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
По теме: Как проверить, поддерживается ли разреженный файл
Что делать, если я хочу сохранить кучу небольших файлов?
Некоторые возможности:
- использовать базу данных вместо файловой системы: База данных против хранилища файловой системы
- использовать файловую систему, которая поддерживает блочное перераспределение
Библиография:
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Протестировано в Ubuntu 16.04.
Потому что по умолчанию 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
Сравните (например) du -bm
с du -m
.
-b
устанавливает --apparent-size --block-size=1
, но затем m
заменяет размер блока равным 1M
.
Аналогично -bh
по сравнению с -h
: -bh
означает --apparent-size --block-size=1 --human-readable
, и снова h
переопределяет этот размер блока.
--block-size
часто не 1
по умолчанию (т.е. du
без какой-либо опции), а скорее 1024 или 512. --apparent-size
не имеет отношения к побочному эффекту -b
.
- person norio; 11.07.2019
Файлы и папки имеют свой реальный размер и размер на диске.
--apparent-size
- реальный размер файла или папкиразмер на диске - это количество байтов, которое файл или папка занимает на диске. То же самое при использовании только
du
.
Если вы сталкиваетесь с тем, что кажущийся размер почти всегда на несколько порядков выше, чем использование диска, это означает, что у вас много («разреженных») файлов с внутренней фрагментацией или косвенными блоками.