
Я знаю, что это fallocate --keep-size
можно использовать для расширения файла, не трогая его логический размер. Есть ли способ сделать наоборот, т. е. уменьшить логический размер файла, не трогая его блоки?
решение1
Если вы не хотите удалять блоки, а хотите изменить логический размер файла, то, вероятно, вам нужно удалить дыру в конце файла.
truncate / ftruncate может это сделать, но он не учитывает дыры, поэтому вам придется отдельно обнаружить дыру в конце файла, а затем использовать ftruncate для сжатия файла.
Обратите внимание, что ftruncate — это только половина решения, и хотя большинство современных Unix-систем поддерживают обнаружение дыр в файлах, переносимого способа сделать это не существует, поскольку все они делают это немного по-разному.
Также убедитесь, что вы понимаете, что делает fallocate. Он заполняет дыры и выделяет им блоки данных. Поэтому после запуска fallocate для файла весь его логический размер представлен физическими блоками данных, и вы не можете изменить его размер, не освободив некоторые из этих блоков данных.