Как linux fallocate FALLOC_FL_KEEP_SIZE влияет на файл после его закрытия?

Вызов linux

      fallocate(fd, FALLOC_FL_KEEP_SIZE, offset, len);

может использоваться для предварительного выделения места для файла после его конца без увеличения длины файла. (верно?)

Вопрос: что происходит с этим дисковым пространством при закрытии fd? Освобождается ли лишнее пространство или оно остается связанным с файлом?

Если он остается связанным с файлом, как мне освободить это место? Освобождает ли пространство truncate (или open () и ftruncate ())?

1 ответ

Вопрос: что происходит с этим дисковым пространством, когда fd закрывается? Освобождается ли дополнительное пространство или оно остается связанным с файлом?

Ничего не произошло. Выделенное пространство не зависит от fd.

Если он остается связанным с файлом, как мне освободить это место? Освобождает ли усечение (или open() и ftruncate()) место?

truncate() — это основной способ освободить место. Другой способ — удалить файл. Вы также можете попробовать вызвать fallocate() с FALLOC_FL_PUNCH_HOLE и FALLOC_FL_KEEP_SIZE для «перераспределенных» частей файла, хотя это выглядит беспорядочно и может оставить артефакты.

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

      ls -s

или же

      stat

для наблюдения за истинным количеством выделенных блоков независимо от того, какой процесс/fd использовался для выполнения вызова fallocate().

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