Разница между дыроколом и нулевым диапазоном
Я смотрю на справочную страницу 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.