我们正在工作中配置一个 Linux 备份服务器,所有其他服务器(也主要是 Linux)都将向其发送备份。备份大小为数百 GB,并包含数千个文件,其中 99% 的文件每天都不会发生变化。
通常,这是 rsync 的完美用例。不幸的是,我们的要求之一是备份服务器是只写的,以便服务器可以将备份上传到它,但没有任何东西可以远程访问这些备份,以防这些服务器中的任何一个受到损害。我们目前将 vsftpd 设置为在只写模式下工作,效果很好,除了每天晚上需要通过网络传输数百 GB 的数据这一事实之外。
据我所知,由于 rsync 会将远程文件与本地文件进行比较,因此它需要远程服务器上的读写访问权限。
我的问题是:rsync 是否可以在任何模式下运行,备份服务器可以显示校验和以及其上文件的文件名,但不能显示实际数据?这意味着它仍然是一个只写服务器,但我们可以进行差异备份而不是完整备份。
答案1
如果您只是想减少网络流量,但不介意浪费本地磁盘空间,一个新颖的解决方案是在本地“镜像”备份,然后使用 rsync 的批处理模式将差异发送到远程。
宽松地说,您可以使用以下命令进行本地备份
rsync --write-batch=foo -a /src/dir/ /localcopy/dir/
这将创建一个包含所有要进行的更改的文件,以及一个在远程运行以解释内容的foo
单行脚本。foo.sh
将两者复制到远程,然后在远程运行脚本:
scp foo foo.sh remote:
ssh remote ./foo.sh /dir/
或者如果您愿意:
ssh remote rsync --read-batch=- -a /dir/ <foo
您也可以看看表里不一对于 rsync 来说,它会加密远程数据,因此您还需要窃取加密密钥才能利用数据。
答案2
rsync版本有只写模式2.6.3或更高版本(有关实现细节,请参阅提交7a92ded39a)。它的行为正如您在问题中所描述的那样。
配置在rsyncd.conf:
只写
该参数决定客户端是否能够下载文件。如果“只写”为真,则任何尝试的下载都将失败。如果“只写”为 false,则只要守护程序端的文件权限允许,就可以下载。默认情况下该参数被禁用。
[module]
path = /some/path
read only = no
write only = yes
...
如果您尝试从只写存储库接收文件,您将收到错误:
$ rsync rsync_host::module .
ERROR: module is write only
rsync error: syntax or usage error (code 1) at main.c(804) [sender=3.1.2]