太长了;博士我想在rsync
发生之前保留(或“声明”?)一定量的磁盘空间,以便其他rsync
实例只有在所需的磁盘空间肯定可用时才会运行。
背景
作业(运行的 shell 脚本rsync
)将:
- 用于
rsync
将大量数据从源磁盘复制到不同的目标磁盘 - 使用复制的数据做一些工作
- 删除复制的数据
作业脚本的多个实例可以同时运行。
就我而言,偶尔,同时运行许多作业脚本rsync
并使用所有可用磁盘空间。所有rsync
实例都失败(因此作业失败)。
伪代码
这是我想象的算法:
$job = get_next_incoming_job()
$disk_dst = $job.disk_dst() # destination disk for rsync
$space_need = $job.calculate_space_needed()
_check_space: # jump label
if $space_need > space_available($disk_dst) then
sleep $RANDOM
goto _check_space:
$handle = reserve_space($disk_dst, $space_need) # How??
# rsync will "fill-in" the reserved space - How??
rsync $job.source_data_path() $disk_dst/$job.ID/
do work using $disk_dst/$job.ID/
remove $disk_dst/$job.ID/
release_reserved_space($handle) # How??
这个神奇的函数reserve_space
会立即改变$disk_dst
报告的可用空间(返回的值space_available
)。其他rsync
作业实例会space_available()
返回更少的空间马上(因此,将他们的工作推迟到以后)。
目前,space_available()
(通过实际程序)将在实例运行df
时返回递减的数字。rsync
问题是多个rsync
实例在运行时可能会耗尽空间。我希望rsync
实例仅在确定可以完成时才运行(即运行时不会耗尽磁盘空间)。
答案1
如果您坚持使用独立于文件系统的工具,除了实际分配磁盘空间之外,我想不出其他方法来做到这一点,即reserve
需要创建一个所需大小的(非稀疏!)文件,并且您会启动前需要删除该文件rsync
。
如果文件位于 ext2/ext3/ext4 卷上并且可以接受使用 root 访问权限进行某些操作,则可以使用其预留空间特征。保留的空间通常供 root 用户使用,但您可以将其提供给不同的用户或不同的组。以该用户/组身份运行 rsync 进程并调整保留空间tune2fs -m
在运行 rsync 之前。
ZFS 或 Btrfs 池可能有更灵活的解决方案,但我不知道该怎么做。