Разрежённый файл

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Разреженный файл: нулевые байты не требуют хранения на диске, поэтому могут быть лишь указаны в метаданных.

Разрежённый файл (англ. sparse file) — файл, в котором последовательности нулевых байтов заменены на информацию об этих последовательностях. Таким образом достигается эффективное хранение файлов на уровне файловой системы. Данная возможность используется в основном для файлов-контейнеров (например, файлы образа диска виртуальной машины). В Linux можно создать Sparse-file используя команду

% dd if=/dev/zero of=./disk-image bs=1 count=0 seek=200G

или

% truncate -s200G ./disk-image
— в данном случае будет создан мгновенно файл 200 Гб.

Файловыми системами, поддерживающими разреженные файлы, являются BTRFS, NILFS, ZFS, NTFS[1], ext2, ext3, ext4, XFS, JFS, ReiserFS, Reiser4, UFS, Rock Ridge, UDF, ReFS.

  • Случайная запись в такие файлы, как правило, приводит к большой фрагментации файловой системы.
  • Такие файлы не всегда корректно копируются (виртуальные нули при копировании могут стать реальными). Для правильного копирования используются специальные ключи команды cp или же специальные средства во время программирования (поиск длинных нулей и выполнение seek() вместо фактической записи нулей), либо использование fibmap() для выяснения карты хранения файла на диске.
  • Существует системный вызов, позволяющий «пробить дырку» (punch hole) в файле, с помощью которого можно сделать некоторую область файла разрежённой. В этом случае не только высвободится место на жёстком диске, но еще и произойдёт команда TRIM для SSD-дисков для секторов в этой области, что в свою очередь может привести к уменьшению образа виртуальной машины, в которой такое произошло.
  • Запись в такие области приводит к запуска алгоритма поиска свободного места для записи, что может закончиться внезапным неуспехом. Тогда будет возвращён код ошибки насчёт нехватки свободного места, а если файл использовался с помощью mmap, то произойдёт segmentation fault.
  • Во время чтения таких областей файлов операционная система отдаёт нули, не обращаясь к жёсткому диску
  • Так как адресация в большинстве файловых систем организована с помощью кластеров, то размер (и смещение) таких областей не может быть произвольным (должно быть выровнено по размеру кластера). Таким образом, нельзя сделать «дырку» в пару байт. При такой попытке драйвер ФС просто запишет нули.
  • Утилиты для отображения размера файла обычно умеют показывать размер файла и отдельно — сколько он занимает на диске. Соответственно, если файл sparse, то на диске он занимает меньше места.
  • Не следует путать создание таких файлов с результатом выполнения команды fallocate(), при которой можно почти мгновенно создать большой файл, «заполненный» нулями. В последнем случае место будет выделено (использовано, помечено как занятое) на ФС заранее, но фактической записи нулями не будет произведено. SSD TRIM всё равно вызывается и для этого случая.

Примечания[править | править исходный текст]