зарезервировать дисковое пространство перед копированием файлов

Я хотел бы зарезервировать (или это ключевое слово «требование»?) Некоторое количество дискового пространства до того, как произойдет rsync поэтому другие программы будут полагать, что на диске меньше места (потому что после rsync на диске будет значительно меньше места).

задний план

Сценарий bash rsync представляет собой большой объем данных для местоположения, выполняет некоторую работу, а затем удаляет данные rsync ed. Несколько экземпляров сценария bash могут выполняться одновременно. Проблема в том, что время от времени несколько сценариев одновременно rsync и все свободное место на диске, а затем сбой.

псевдокод

Вот текущий алгоритм

 check: $disk_A = source disk $disk_X = pick a different disk $space_need = 12345 # disk space needed $space_avail = space_available(some disk X) # disk space available on $disk_X if $space_need < $space_avail then rsync $disk_A/data $disk_X/data # this step takes much time else goto check: do work remove $disk_X/data 

Я хотел бы, чтобы шаги были изменены на ( ... такое же, как и предыдущий псевдокод)

 ... if ... then reserve $space_avail on $disk_X # space_available() should now report $disk_X as $space_avail - original # HOW TO DO THAT? rsync $disk_A/data $disk_X/data # this step takes much time else ... ... release $disk_X $space_avail # HOW TO DO THAT? 

С измененным псевдокодом пространство зарезервировано (или «заявлено») мгновенно. Другие скрипты видят space_available() возвращают меньше места сразу . В настоящее время space_available() будет возвращать уменьшающийся номер, пока выполняются другие экземпляры rsync .

Если вы придерживаетесь инструментов, не зависящих от файловой системы, я не могу придумать способ сделать это иначе, чем фактически распределить дисковое пространство, то есть reserve должен будет создать (не разреженный!) Файл запрашиваемого размера, d необходимо удалить этот файл перед запуском rsync .

Если файлы находятся на томе ext2 / ext3 / ext4, и использование root-доступа для некоторых операций является приемлемым, вы можете использовать его зарезервированное пространство . Зарезервированное пространство обычно для root, но вы можете сделать его доступным для другого пользователя или другой группы. Запустите процесс rsync в качестве этого пользователя / группы и настройте зарезервированное пространство с помощью tune2fs -m перед запуском rsync.

Возможно, существует более гибкое решение с пулами ZFS или Btrfs, но я не знаю, как это сделать.