Видимый размер разреженных файлов
Я создал Sparse-файл 8 ГБ, используя
dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G
Тогда я сделал
echo "test" >> /sparse-file
я вижу это du -sh sparse-file
дает 16К и du -sh --apparent-size sparse-file
показывает 8.1G.
У меня была мысль, что если я запишу данные в файл, он перезапишет нули в разреженном файле, но на самом деле он растет. Почему это так? Если я начну заполнять 8 ГБ реальных данных, тогда видимый размер станет 16 ГБ?
Что именно "считать" здесь делают?
2 ответа
"Разреженные" файлы - это файлы с пустыми пробелами, предположительно заполненными нулями, но для которых этого предположения достаточно, чтобы продолжить. То есть, если вы прочитаете файл, вы получите нули, но, поскольку мы знаем, что это нули, нам фактически не нужно выписывать нули на 8 ГБ. Достаточно сказать: "Давайте просто согласимся, что здесь есть большой файл, фактически не выделяя для него место".
Когда вы перезаписываете пустое содержимое файла, блоки размещаются на диске для размещения того, что вы храните (поскольку вы больше не можете предполагать, что это просто нули). Но если вы добавляете файл, вы ничего не перезаписываете. Вы просто добавляете больше к концу. Таким образом, добавляя, вы размещаете блоки на диске, но эти блоки не заменяют ваши существующие "воображаемые" блоки; вместо этого те, которые вы создаете, добавляются в конце, после воображаемых.
Вы можете даже добавить больше воображаемых блоков, используя аналогичные dd -skip
операция, как вы использовали для создания файла. "Мнимые" блоки не обязательно должны быть вместе. И фактически, когда вы перезаписываете существующие блоки в файле, будут выделены только те блоки, которые вы перезаписали, независимо от того, где они появляются в файле. То есть, запись блока в позиции 101 не будет автоматически распределять и заполнять нулями блоки с 1 по 99.
Прежде всего, с count=0
вы только скопировали ноль блоков из /dev/zero
, Так что ничего. seek=8G
пропущено 8 Гб блоков. Я бы предпочел сделать это с count=1
, но я думаю, вы можете оставить это полностью.
В остальном просто прочитайте man du. apparent-size
опция печатает видимый размер, а не реальное использование диска. Итак, хотя первая команда сообщила, что вашему файлу требуется 16 КБ на диске, видимый размер составляет 8,1 ГБ.
Для файла с содержанием менее 16 КБ может потребоваться 16 КБ на диске, в зависимости от используемой файловой системы. Смотрите описание GNU Coreutils:
Например, файл, содержащий слово "zoo" без перевода строки, конечно, будет иметь видимый размер 3. Такой маленький файл может потребовать от 0 до 16 КБ или более дискового пространства, в зависимости от типа и конфигурации файловой системы, в которой находится файл. Тем не менее, разреженный файл, созданный с помощью этой команды:
dd bs=1 seek=2GiB if=/dev/null of=big
имеет очевидный размер 2 ГиБ, но в большинстве современных систем фактически не использует дискового пространства.