自定义 Synology Hyper-Backup rsync 选项(以及 HB 参数的含义)

自定义 Synology Hyper-Backup rsync 选项(以及 HB 参数的含义)

Data Backup Task当选择备份选项>时,我希望能够自定义 Hyper Backup 使用的 rsync 选项Remote Data Copy,但 Hyper Backup 选项有限且有些模糊。

DSM 版本:DSM 6.0.2-8451 更新 9

我实际上会给出自己的解决方案作为答案,但如果出现更好的解决方案,我会验证它。为了让有需要的人有所帮助,我还会在这里写下我对这个问题的结论。


Hyper Backup 参数相对于 rsync 选项的含义

默认

默认情况下,当任务的“设置”选项卡中未勾选以下选项时,rsync 将使用这些选项:

--chmod=ugo=rwx -W -H -rlt -p --delete --exclude-from=/tmp/RSYNC_RULE_xxxxxx

笔记:

  • 任何配置都会导致在远程备份存储库上创建额外的文件和文件夹:@app、_Syno_TaskConfig 和 synobkpinfo.db,由 Hyper Backup 管理以供自己使用
  • 启动许多 rsync 命令来管理 Hyper Backup 文件并进行完整性检查;这些命令的 rsync 选项各不相同:我在这里只讨论备份实际数据时使用的选项
  • 暂时创建排除文件以反映一些选中的选项(见下文)

启用传输压缩

添加 rsync 选项:--compress

启用块级备份

删除 rsync 选项:-W

在目标位置保留备份文件

删除 rsync 选项:--delete

启用元数据备份

无需修改 rsync 选项

在远程备份存储库上创建一个附加文件夹:@app/@metadata。
启动更多 rsync 命令来管理新文件夹,据称其中包含备份文件的权限和所有者数据。

启用缩略图备份

无需修改 rsync 选项

我认为(还没有做到)它改变了临时排除文件的内容。
复制每个包含图片的文件夹中的 @eaDir 文件夹,@eaDir 包含由 DSM 生成的一个或多个大小合适的图片缩略图。

答案1

这是我提出的解决方案(截至 2017 年 2 月),能够完全自定义 Hyper Backup 任务所使用的 rsync 选项。

调整 DiskStation 的 rsync 可执行文件

很难说是否可以调整 HyperBackup 配置和任务文件,但我可以得出结论,它正在使用 中的 rsync 二进制文件/usr/bin/。剩下的就是设置一个调整传递的选项的中间脚本。

  • 使用“admin”用户通过 SSH 连接到 DiskStation 服务器
  • sudo -i输入与“admin”用户相同的密码
  • mv /usr/bin/rsync /usr/bin/rsync.orig
  • touch /usr/bin/rsync
  • chmod 4755 /usr/bin/rsync
  • echo '#!/bin/sh
    exec /usr/bin/rsync.orig "$@" --option-you-want-to-add' > /usr/bin/rsync

欢迎任何其他更温和的解决方案。

确保修改不会影响更新

我不确定 DSM 是否管理系统的 rsync 可执行文件,如果是这样,DSM 更新可能会导致我们所做的修改消失。有人能证实吗?如果是这样,我会想出一个脚本,我会定期(例如每天午夜)通过Control Panel>对其进行编程Task Scheduler,以确保修改在更新过程中保持不变,并且会将 rsync 二进制文件本身的更新考虑在内。

首先,我将修改后的 rsync 脚本设置到一个可以使其不断发展的路径(如果我的修改必须随着时间的推移而改变):

/usr/本地/bin/rsync_修改版本

#!/bin/sh

# This script is a custom modification script
# It calls the original binary rsync with modified options

# ordering to kill all child processes if receiving term signal
trap 'pkill -P $$' EXIT

# args to array
args2array () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
ARGS=$(args2array "$@")


# ...whatever modification you want to make on $ARGS...


# setting arguments again, from $ARGS
eval "set -- ${ARGS[@]}"

/usr/bin/rsync.orig "$@"

# Notes: the args2array call and the arguments setting in the end helps
# giving rsync.orig the arguments as they would be passed through direct
# call. Adding string or expanded arrays during the call of rsync.orig has
# revealed to fail in some cases, where rsync would ignore some of the
# added parameters.

然后我将创建这个脚本,可以在计划任务中进行编程(使用用户“root”)

/usr/本地/bin/rsync更新管理器

#!/bin/sh

# Make sure the modified version of rsync is not overwritten
# and that updates of the original rsync binary are taken into account.

# init
usageFile="/usr/bin/rsync"
origFile="/usr/bin/rsync.orig"
backupFile="/usr/bin/rsync.orig"
modificationScript="/usr/local/bin/rsync_modified.sh"

# check if usage file is a binary
grep -qI . $usageFile && TYPE="TEXT" || TYPE="BINARY"
if [ $TYPE == "BINARY" ]
then

    # 1st installation or DSM updated rsync
    if [ -f $origFile ]
    then
        # a original file already exists (probably created by this script)
        # we back it up
        NOW=$(date +"%Y%m%d_%H%M%S")
        mv $origFile "${backupFile}.$NOW.bak"
    fi

    # rename binary file as original file
    mv $usageFile $origFile
fi

# copy modification script in the place of usage file
cp $modificationScript $usageFile

# giving it the same rights as original file (on DiskStation server)
chmod 4755 $usageFile

相关内容