我正在尝试使用以守护进程模式启动的 rsync 来备份一些文件夹。客户端基本上启动此命令:
rsync --delete -avz -R -e "ssh -i ${KEY}" ${SERVER}::${MODULE} {DST_DIR}
服务器在其authorized_keys文件上有公钥:
command="rsync --server --daemon --config /root/rsync.conf"
这是包含我想要备份的文件夹的 rsync.conf 文件:
uid=0
gid=0
read only = true
use chroot = true
[backup]
path = /root
path = /etc
这里的问题是复制的是这些文件夹的内容,而不是其绝对路径。我希望我的 ${DST_DIR} 中包含 /etc/etc_content 和 /root/root_content,而我得到的是 /etc 的内容(我假设先同步 /root,然后同步 /etc,这会删除 /root 内容...哎哟)。
我确信有一种方法可以强制 rsync 保留绝对路径。我尝试使用 -R 选项,但没有成功。我也尝试过不使用 chroot。
我怎样才能通过它?
非常感谢
答案1
你说得对“-R”可以使用相对路径,但工作方式略有不同。${模块}准确导出 rsync 服务器文件系统中由以下定义的部分“小路”范围。
你应该只有一个“小路”每个参数“模块”部分已定义。这解释了为什么您可以先看到 /root 内容,然后看到 /etc,因为当指定多个路径参数时,它似乎被覆盖了。
我要么尝试为每个要备份的目录定义一个模块
uid=0
gid=0
read only = true
use chroot = true
[root]
path = /root
[etc]
path = /etc
然后对所有这些模块调用 rsync
for MODULE in root etc; do
rsync -avzR $SERVER::$MODULE $DST_DIR/$MODULE
done
或者我将使用单个模块部分导出服务器文件系统的更宽部分
uid=0
gid=0
read only = true
use chroot = true
[root]
path = /
并备份所需目录
rsync -avzR $SERVER::$MODULE/root $SERVER::$MODULE/etc $DST_DIR
两种方式都将保留您请求的原始/绝对目录结构。
答案2
我找到了一种使用包含选项的方法;我的 rsync.conf 文件现在如下所示:
uid=0
gid=0
read only = true
use chroot = true
[backup]
path = /
include /etc/*** /root/*** /usr/local/etc/***
exclude /***
然后我可以使用文件夹的绝对路径检索它们,但是出现了另一个麻烦:
这里的问题是,同步仅适用于 / 又名 /etc/* 和 /root/* 正下方的包含目录,而不适用于 /usr/local/etc/*
当我尝试使用 include from 关键字并将这些文件夹填充到指定的 included_from 文件中时,也出现了同样的问题。
我有点绝望;要么这无法用 rsync 执行我想要的操作,要么我忽略了一些显而易见的东西?rsync 的解释相当难。dsumsky,谢谢你的回答,我正在考虑最终还是应该采用你的解决方案。