我有两台机器,A
并且B
。机器A
可以 ssh 进入B
。A
有很多可用空间。B
的数据处于某种危险的境地。 如何自动备份所有B
数据A
。它不必非常频繁,但应该是解放双手的。每次A
启动都足够频繁。我听说同步可以做到这一点。
答案1
要在大多数 Linux 发行版中每天执行此操作,您应该能够只输入命令rsync
(按照@guido 的回答)在脚本中并将脚本放入/etc/cron.daily
目录中。只要anacron
安装了(可能不是默认情况下),任何错过的cron.daily
作业都将在下次机器启动时捕获(如果机器切换,则在午夜运行)。
对于脚本你只需执行以下操作:
#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder
-z
如果备份是通过较慢的连接或者您想节省带宽,您可以添加(压缩)选项,但根据我的经验,它实际上会损害现代机器/网络的性能。
如果您想保留每个备份的日志,您可以执行以下操作:
#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
>/var/log/backup_log 2>&1
请注意,要使其作为 cron 作业工作,您必须具有无密码 ssh设置为根在 serverA 上登录到 serverB。它必须是 root 帐户(即键入/root/.ssh
),因为cron.daily
作业以 root 身份运行。
答案2
我建议使用rdiff 备份。我现在用它每天晚上自动增量备份我自己的数据(两个工作站、两台服务器和别人服务器上的一个帐户)。
我之前使用过 rsync,但后来改用 rdiff-backup,因为它更方便,并且可以对虚拟机磁盘映像等大文件进行增量备份。 rdiff-backup 很像我之前的 rsync 备份脚本,但是完成了正确的。
我已经将脚本文件放入/etc/cron.daily在存储备份的机器上,每天凌晨启动一次rdiff-backup,并从远程机器上获取数据。
答案3
除了前面的所有答案之外,这里还有一个依赖于 SSH 密钥的答案,它限制了使用该密钥登录时可以执行的操作。
在服务器A上
在这一点上,如果您创建一个单独的用户或使用现有的用户名之一,那并不重要,但如果是我,我会创建一个单独的用户。我将bkpuser
在下面的示例中使用两台服务器的用户名。
登录后bkpuser
,创建一个没有密码的 SSH 密钥。
在服务器B上
启用PubkeyAuthentication
在sshd_config
.
创建用户bkpuser
.设置一个非常复杂的密码,或者禁用该用户的密码登录(具体如何操作取决于您运行的 unix 和发行版)。重点是用户只能使用 SSH 密钥登录。确保对bkpuser
要备份的所有目录和文件具有读取权限。
将 A 上创建的密钥的公共部分复制到~bkpuser/.ssh/authorized_keys
B 上。编辑以在连接上自动运行命令。该命令不应该是指向 shell 脚本的指针;而是直接将 shell 脚本插入到密钥中。还包括一个限制,以便密钥只能从服务器 A 使用,而不能从其他服务器使用。在下面的示例中,我为服务器 A 提供了 IP 地址10.1.2.3
,并且假设我要备份的文件都位于/data
.
from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="cd /data;/usr/bin/tar -cf - *; /usr/bin/logger -t BACKUP -p daemon.info \"INFO: Backup-files on $HOST fetched from ${SSH_CLIENT%% *} by $USER\";" ssh-dss AA.....
在服务器A上
如果您使用的是支持条目的 cron 选项卡之一,请使用命令@reboot
将此类条目添加到s crontab 中。如果不允许,可以随时设置 - 如果是我的数据,我可能会每天都这样做。bkpuser
ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz
答案4
您可以使用 rsync 来实现此目的(以一种相反的方式):
serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup
在哪里:
-avz archive, compress and be verbose