6.10 用rsync备份系统快照

备份数据是多数系统管理员的日常工作。我们可能要备份Web服务器上的数据,也可能要备份远端数据。rsync可以对位于不同位置的文件和目录进行备份,它可以借助差异计算以及压缩技术来最小化数据传输量。相对于cp命令,rsync的优势在于前者使用了高效的差异算法(difference algorithm)。另外,它还支持网络数据传输。在进行复制的同时,rsync会比较源端和目的端的文件,只有当文件有更新时才进行复制。rsync也支持压缩、加密等多种特性。让我们看看rsync的使用方法。

6.10.1 实战演练

将源目录复制到目的端(创建镜像):

  1. $ rsync -av source_path destination_path

其中-a表示要进行归档,-v(verbose)表示在stdout上打印出细节信息或进度。

上面的命令会以递归的方式将所有的文件从源路径复制到目的路径。我们可以指定本地路径,也可以指定远端路径。

路径格式可以是/home/slynux/data、slynux@192.168.0.6:/home/backups/data等。

/home/slynux/data指定了执行rsync命令主机上的绝对路径。slynux@192.168.0.6:/home/ backups/ data指定了路径 /home/backups/data位于IP地址为192.168.0.6的主机上,并以用户slynux的身份登录该主机。

要将数据备份到远程服务器或主机,可以使用:

  1. $ rsync -av source_dir username@host:PATH

如果需要在源端建立一份镜像,只需要定期运行同样的rsync命令即可。它只会对更改过的文件进行复制。

用下面的方法将远程主机上的数据恢复到本地主机:

  1. $ rsync -av username@host:PATH destination

rsync命令用SSH连接远程主机。用user@host这种形式设定远程主机的地址,其中user代表用户名,host代表远程主机的IP地址或域名。而PATH指定需要复制数据的绝对路径。rsync通常会询问SSH连接的密码。这可以通过使用SSH密钥来实现自动化(无需用户输入密码)。

请确保远程主机上安装并运行着OpenSSH。

在通过网络传输时,对数据进行压缩能够明显改善传输速度。我们可以用rsync的选项 -z指定在网络传输时使用数据压缩。例如:

  1. $ rsync -avz source destination

6.10 用rsync备份系统快照 - 图1 就路径格式而言,如果我们在source_path末尾使用/,那么rsync会将sourch_path尾端目录中的所有内容复制到目的端。如果没有使用/rsync会将sourch_path尾端目录本身复制到目的端。-

例如,下面的命令会复制test目录中的内容:

  1. $ rsync -av /home/test/ /home/backups

下面的命令则会将test目录复制到目的端:

  1. $ rsync -av /home/test /home/backups

6.10 用rsync备份系统快照 - 图2 如果在destination_path末尾使用/,那么rsync会将来自源端的内容复制到目的端目录中。

如果没有使用/rsync会在目的端路径尾部创建一个同名目录,然后将源端内容复制到这个目录中。-

例如:

  1. $ rsync -av /home/test /home/backups/

该命令将源端(/home/test)的内容复制到已有目录backups中。

  1. $ rsync -av /home/test /home/backups

该命令在目的端创建目录backups,并将源端(/home/test)的内容复制到此目录中。

6.10.2 补充内容

可以通过命令行选项来指定rsync命令的其他功能。让我们看看这些选项。

  • 在归档时用rsync排除部分文件

当对远端内容进行归档时,有些文件并不需要进行更新。我们可以告知rsync将某些文件从此次操作中排除。有两个选项可以用来排除文件:

  1. --exclude PATTERN

可以通过通配符指定需要排除的文件。例如:

  1. $ rsync -avz /home/code/some_code /mnt/disk/backup/code --exclude "*.txt"

这条命令不对.txt文件进行备份。

或者我们可以通过一个列表文件指定需要排除的文件。

就用--exclude-from FILEPATH

  • 在更新rsync备份时,删除不存在的文件

我们对文件进行归档,然后将归档文件传输到远端备份。当需要更新备份数据时,再创建一个tar文件并传输到远端。默认情况下,rsync并不会在目的端删除那些在源端已不存在的文件。如果要删除这些已不存在文件,使用rsync--delete选项:

  1. $ rsync -avz SOURCE DESTINATION --delete
  • 定期调度备份

你可以创建一个cron任务以定期进行备份。

下面是一个简单的例子:

  1. $ crontab -e

添加上这么一行:

  1. 0 */10 * * * rsync -avz /home/code user@IP_ADDRESS:/home/backups

上面的crontabrsync调度为每10个小时运行一次。

*/10crontab语法中的小时位(hour position),/10指定每10小时执行一次备份。如果 */10出现在分钟位(minutes postion),那就是每10分钟执行一次备份。

请参阅9.8节了解如何配置crontab