Разница между дыроколом и нулевым диапазоном

Я смотрю на справочную страницу Fallocate, и я не понимаю разницу между этими двумя. Один, кажется, выделяет блоки, но без их записи, другой, кажется, освобождает блоки, не перезаписывая их. В любом случае эффект кажется неразличимым с точки зрения пользователя. Пожалуйста, объясни мне это.

Обнуление файлового пространства Указание флага FALLOC_FL_ZERO_RANGE (доступно с Linux 3.15) в режиме обнуляет пространство в диапазоне байтов, начиная со смещения и продолжая для длинных байтов. В пределах указанного диапазона блоки предварительно выделяются для областей, которые охватывают отверстия в файле. После успешного вызова последующие чтения из этого диапазона вернут нули.

   Zeroing is done within the filesystem preferably by converting the
   range into unwritten extents.  This approach means that the specified
   range will not be physically zeroed out on the device (except for
   partial blocks at the either end of the range), and I/O is
   (otherwise) required only to update metadata.

   If the FALLOC_FL_KEEP_SIZE flag is additionally specified in mode,
   the behavior of the call is similar, but the file size will not be
   changed even if offset+len is greater than the file size.  This
   behavior is the same as when preallocating space with
   FALLOC_FL_KEEP_SIZE specified.

   Not all filesystems support FALLOC_FL_ZERO_RANGE; if a filesystem
   doesn't support the operation, an error is returned.  The operation
   is supported on at least the following filesystems:

   *  XFS (since Linux 3.15)

   *  ext4, for extent-based files (since Linux 3.15)

   *  SMB3 (since Linux 3.17)

Увеличение файлового пространства Указание флага FALLOC_FL_INSERT_RANGE (доступно с Linux 4.1) в режиме увеличивает файловое пространство, вставляя отверстие в размер файла без перезаписи существующих данных. Отверстие начнется со смещением и продолжится для длинных байтов. При вставке отверстия внутри файла содержимое файла, начиная со смещения, будет смещено вверх (т.е. к более высокому смещению файла) на длину в байты. Вставка дыры в файл увеличивает размер файла на длину в байт.

   This mode has the same limitations as FALLOC_FL_COLLAPSE_RANGE
   regarding the granularity of the operation.  If the granularity
   requirements are not met, fallocate() will fail with the error
   EINVAL.  If the offset is equal to or greater than the end of file,
   an error is returned.  For such operations (i.e., inserting a hole at
   the end of file), ftruncate(2) should be used.

   No other flags may be specified in mode in conjunction with
   FALLOC_FL_INSERT_RANGE.

   FALLOC_FL_INSERT_RANGE requires filesystem support.  Filesystems that
   support this operation include XFS (since Linux 4.1) and ext4 (since
   Linux 4.2).

1 ответ

Решение

Это зависит от того, что приложение хочет от дискового пространства, занимаемого файлом в результате использования любого из них.

FALLOC_FL_PUNCH_HOLE флаг освобождает блоки. Так как это должно быть ORed с FALLOC_FL_KEEP_SIZE, что это значит, вы в конечном итоге в разреженном файле.

FALLOC_FL_ZERO_RANGE с другой стороны, выделяет блоки для (смещение, длина), если он еще не присутствует, и обнуляет его. Таким образом, в действительности вы теряете часть своей редкости, если в файле изначально были дыры. Кроме того, это метод обнуления областей файла без необходимости вручную записывать (2) нуля приложению.

Все эти флаги для fallocate(2) обычно используются программным обеспечением для виртуализации, таким как qemu.

Другие вопросы по тегам