Jam*_*oon 5 linux rsync disk-usage file-copy files
tl;dr我想在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??
Run Code Online (Sandbox Code Playgroud)
魔术函数reserve_space
会立即更改$disk_dst
报告的可用空间(由 返回的值space_available
)。其他rsync
作业实例将看到space_available()
返回更少的空间马上(因此,耽误自己的工作,直到后来)。
目前,space_available()
(通过实际程序df
)将在rsync
实例运行时返回一个递减的数字。问题是多个rsync
实例在运行时可能会耗尽空间。我希望rsync
实例仅在确定它们可以完成时运行(即在运行时不会耗尽磁盘空间)。
如果您坚持使用独立于文件系统的工具,除了实际分配磁盘空间之外,我想不出其他方法来做到这一点,即需要reserve
创建一个所需大小的(非稀疏!)文件,并且您会启动前需要删除该文件rsync
。
如果文件位于 ext2/ext3/ext4 卷上并且可以接受使用根访问权限进行某些操作,则可以使用其保留空间功能。保留的空间通常供 root 用户使用,但您可以将其提供给不同的用户或不同的组。以该用户/组身份运行 rsync 进程,并tune2fs -m
在运行 rsync 之前调整保留空间。
ZFS 或 Btrfs 池可能有更灵活的解决方案,但我不知道该怎么做。