
Я создал 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 ГиБ, однако на большинстве современных систем он фактически почти не занимает дискового пространства.