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

Jam*_*oon 5 linux rsync disk-usage file-copy files

tl;dr我想在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??
Run Code Online (Sandbox Code Playgroud)

魔术函数reserve_space会立即更改$disk_dst报告的可用空间(由 返回的值space_available)。其他rsync作业实例将看到space_available()返回更少的空间马上(因此,耽误自己的工作,直到后来)。

目前,space_available()(通过实际程序df)将在rsync实例运行时返回一个递减的数字。问题是多个rsync实例在运行时可能会耗尽空间。我希望rsync实例仅在确定它们可以完成时运行(即在运行时不会耗尽磁盘空间)。

Gil*_*il' 2

如果您坚持使用独立于文件系统的工具,除了实际分配磁盘空间之外,我想不出其他方法来做到这一点,即需要reserve创建一个所需大小的(非稀疏!)文件,并且您会启动前需要删除该文件rsync

如果文件位于 ext2/ext3/ext4 卷上并且可以接受使用根访问权限进行某些操作,则可以使用其保留空间功能。保留的空间通常供 root 用户使用,但您可以将其提供给不同的用户或不同的组。以该用户/组身份运行 rsync 进程,并tune2fs -m在运行 rsync 之前调整保留空间。

ZFS 或 Btrfs 池可能有更灵活的解决方案,但我不知道该怎么做。