我正在使用 rsync 从一个驱动器运行备份到另一个驱动器。有两对源目录和目标目录,我不知道如何使用单个命令使其工作。我目前正在运行两个单独的命令来执行完整备份。
源目录是单独的安装点:/mnt/ssd_ext4
和/mnt/ssd_ntfs
。目标驱动器上有匹配的安装点:/mnt/backup_ext4
和/mnt/backup_ntfs
。
完整的命令是
rsync -aAXUxv --no-l --no-D --delete --info=progress2,stats2 --debug=FILTER --exclude-from=/home/xxx/excludelist.txt /mnt/ssd_ext4/ /mnt/backup_ext4
和
rsync -aAXUxv --no-l --no-D --delete --info=progress2,stats2 --debug=FILTER --exclude-from=/home/xxx/excludelist.txt /mnt/ssd_ntfs/ /mnt/backup_ntfs
有没有一些聪明的方法可以通过单个命令来完成这些操作?
编辑:
感谢您提出替代方案,但我确实需要单个命令。一旦我弄清楚了,我将通过 ssh 使用 rsync,并将“强制命令”选项绑定到 ssh 密钥。我只能用该方法映射单个命令。我没有提到这一点,因为我试图让问题变得简单......
答案1
Rsync 非常擅长诸如rsync src1 src2 ... srcN dest_dir/
在单次调用中,您基本上只能备份到单个目标目录。对于两个目的地,您需要单独运行 rsync 协议两次。您可以发明自己的协议来有效地实现这一点,但它不会是经过考验的 rsync 协议。
有两对源目录和目标目录,
我将通过 ssh 使用 rsync 并带有“强制命令”选项
“两个目的地”要求与使用 Stock rsync 不兼容。考虑提升一个级别,这样就只有一个目的地。
例如,使用更简单的tar
管道,在每次调用时无条件发送所有位,我们可以使用:
cd /mnt && tar zcf - ssd_ext4/ ssd_ntfs/ |
ssh server 'cd /mnt && tar zxvf -'
既然我们要重命名
ssd_ext4
-->backup_ext4
和ssd_ntfs
-->backup_ntfs
我们最初需要在服务器上“使用符号链接修复它”。
cd /mnt
mkdir -p backup_{ext4,ntfs}
ln -s backup_ext4 ssd_ext4
ln -s backup_ntfs ssd_ntfs
我想人们可以说服 rsync 遵循类似的安排。我从来没有机会跳过这样的障碍,并且符号链接处理往往会被特殊对待。在搞乱生产之前,请在 QA 环境中仔细测试它。
双份
在服务器上,mkdir double_dest
.
现在,您可以将rsync
两个源目录连接到该目录double_dest/
,当某些位已经到达目的地时,可以利用 rsync 有效利用网络带宽的优势。
rsync 完成后,服务器可以自由地执行从 double_dest/ 到这些位的最终停留位置的其他本地磁盘到磁盘 rsync。执行本地复制可以减少错误的网络客户端可能写入超出预期位置的风险,甚至可以让您根据chroot()
需要进行利用。但它的代价是“双倍存储”成本——您必须购买两倍的存储空间,可能是廉价的旋转温彻斯特磁盘的形式。
需求工程
我真的需要单个命令。一旦我弄清楚了,我将通过 ssh 使用 rsync 并带有“强制命令”选项
不,您不需要单个命令。您可以选择将“单一命令”作为需求文档的一部分,但这往往会增加实施解决方案的成本。
您已经拥有现成的解决方案,就在您面前。我们应该告诉 sshd 有关单个强制命令的信息吗?不需要。只需定义一对这样的命令,每个命令都有一个不同的目标目录。问题解决了。
答案2
有几个人提到了rsync
的多源、单目标能力,@J_H 建议提升一个级别并使用符号链接,但为了连接所有点:
在备份服务器上,假设您的磁盘分区被 GPT 标记为“ssd_ext4”和“ssd_ntfs”:
for fs in ext4 ntfs
do
mkdir -p /backup/ssd_$fs
ln -s ssd_$fs /backup/backup_$fs
mount /dev/disk/by-partlabel/ssd_$fs /backup/ssd_$fs
done
[对于某些操作系统,设备更像是/dev/gpt/ssd_$fs
。]
然后您可以将备份从客户端推送到备份服务器上:
rsync ...options.... /mnt/ssd_ext4 /mnt/ssd_ntfs backup_server:/backup/