rsync 复制文件之前保留磁盘空间

rsync 复制文件之前保留磁盘空间

太长了;博士我想在rsync发生之前保留(或“声明”?)一定量的磁盘空间,以便其他rsync实例只有在所需的磁盘空间肯定可用时才会运行。

背景

作业(运行的 shell 脚本rsync)将:

  1. 用于rsync将大量数据从源磁盘复制到不同的目标磁盘
  2. 使用复制的数据做一些工作
  3. 删除复制的数据

作业脚本的多个实例可以同时运行。

就我而言,偶尔,同时运行许多作业脚本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 池可能有更灵活的解决方案,但我不知道该怎么做。

答案2

配额和相关工具是实现这一目标的一种方法。

https://linux.die.net/man/1/quota

lvextend 和朋友是另一种选择

https://linux.die.net/man/8/lvextend

相关内容