Как 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().