Видимый размер разреженных файлов

Видимый размер разреженных файлов

Я создал 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,1Г.

У меня была мысль, что если я запишу данные в файл, то он перезапишет нули в sparse-file, но на самом деле он растет. Почему так? Если я начну заполнять 8 ГБ реальных данных, то видимый размер станет 16 ГБ?

Что именно здесь делает «count»?

решение1

«Разреженные» файлы — это файлы с пустыми промежутками, которые предположительно заполнены нулями, но для которых этого предположения достаточно. То есть, если вы читаете файл, вы получите нули, но поскольку мы знаем, что это нули, нам на самом деле не нужно записывать 8 ГБ нулей. Достаточно сказать: «Давайте просто согласимся, что здесь большой файл, не выделяя для него места».

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

Вы даже можете добавитьболеемнимые блоки, используя похожую dd -skipоперацию, которую вы использовали для создания файла. "Мнимые" блоки не обязательно должны быть все вместе. И фактически, когда вы перезаписываете существующие блоки в файле,будут выделены только перезаписанные вами блоки, независимо от того, где они появляются в файле. То есть, запись блока в позицию 101 не приведет к автоматическому выделению и заполнению нулями блоков с 1 по 99.

решение2

Во-первых, count=0вы скопировали только ноль блоков из /dev/zero. Так что ничего. seek=8Gпропустили 8 ГБ блоков. Я бы предпочел сделать это с count=1, но, думаю, вы можете вообще его не использовать.

Для остальных просто прочтитечеловек ду. apparent-sizeОпция выводит видимый размер, а не реальное использование диска. Таким образом, хотя первая команда сообщила, что ваш файл требует 16 КБ на диске, видимый размер составляет 8,1 ГБ.

Файл с содержимым менее 16 КБ может все еще потребовать 16 КБ на диске, в зависимости от используемой базовой файловой системы. См.Описание GNU Coreutils:

Например, файл, содержащий слово «zoo» без новой строки, конечно, будет иметь видимый размер 3. Такой небольшой файл может потребовать от 0 до 16 КБ или больше дискового пространства, в зависимости от типа и конфигурации файловой системы, в которой находится файл. Однако разреженный файл, созданный с помощью этой команды:

dd bs=1 seek=2GiB if=/dev/null of=big

имеет видимый размер 2 ГиБ, однако на большинстве современных систем он фактически почти не занимает дискового пространства.

Связанный контент