6.10 用rsync备份系统快照
备份数据是多数系统管理员的日常工作。我们可能要备份Web服务器上的数据,也可能要备份远端数据。rsync
可以对位于不同位置的文件和目录进行备份,它可以借助差异计算以及压缩技术来最小化数据传输量。相对于cp
命令,rsync
的优势在于前者使用了高效的差异算法(difference algorithm)。另外,它还支持网络数据传输。在进行复制的同时,rsync
会比较源端和目的端的文件,只有当文件有更新时才进行复制。rsync
也支持压缩、加密等多种特性。让我们看看rsync
的使用方法。
6.10.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的身份登录该主机。
要将数据备份到远程服务器或主机,可以使用:
- $ rsync -av source_dir username@host:PATH
如果需要在源端建立一份镜像,只需要定期运行同样的rsync
命令即可。它只会对更改过的文件进行复制。
用下面的方法将远程主机上的数据恢复到本地主机:
- $ rsync -av username@host:PATH destination
rsync
命令用SSH连接远程主机。用user@host这种形式设定远程主机的地址,其中user代表用户名,host代表远程主机的IP地址或域名。而PATH
指定需要复制数据的绝对路径。rsync
通常会询问SSH连接的密码。这可以通过使用SSH密钥来实现自动化(无需用户输入密码)。
请确保远程主机上安装并运行着OpenSSH。
在通过网络传输时,对数据进行压缩能够明显改善传输速度。我们可以用rsync
的选项 -z
指定在网络传输时使用数据压缩。例如:
- $ rsync -avz source destination
就路径格式而言,如果我们在
source_path
末尾使用/
,那么rsync
会将sourch_path
尾端目录中的所有内容复制到目的端。如果没有使用/
,rsync
会将sourch_path
尾端目录本身复制到目的端。-
例如,下面的命令会复制test目录中的内容:
- $ rsync -av /home/test/ /home/backups
下面的命令则会将test目录复制到目的端:
- $ rsync -av /home/test /home/backups
如果在
destination_path
末尾使用/
,那么rsync
会将来自源端的内容复制到目的端目录中。如果没有使用
/
,rsync
会在目的端路径尾部创建一个同名目录,然后将源端内容复制到这个目录中。-
例如:
- $ rsync -av /home/test /home/backups/
该命令将源端(/home/test)的内容复制到已有目录backups中。
- $ rsync -av /home/test /home/backups
该命令在目的端创建目录backups,并将源端(/home/test)的内容复制到此目录中。
6.10.2 补充内容
可以通过命令行选项来指定rsync
命令的其他功能。让我们看看这些选项。
- 在归档时用
rsync
排除部分文件
当对远端内容进行归档时,有些文件并不需要进行更新。我们可以告知rsync
将某些文件从此次操作中排除。有两个选项可以用来排除文件:
--exclude PATTERN
可以通过通配符指定需要排除的文件。例如:
- $ rsync -avz /home/code/some_code /mnt/disk/backup/code --exclude "*.txt"
这条命令不对.txt文件进行备份。
或者我们可以通过一个列表文件指定需要排除的文件。
就用--exclude-from FILEPATH
。
- 在更新
rsync
备份时,删除不存在的文件
我们对文件进行归档,然后将归档文件传输到远端备份。当需要更新备份数据时,再创建一个tar
文件并传输到远端。默认情况下,rsync
并不会在目的端删除那些在源端已不存在的文件。如果要删除这些已不存在文件,使用rsync
的 --delete
选项:
- $ rsync -avz SOURCE DESTINATION --delete
- 定期调度备份
你可以创建一个cron
任务以定期进行备份。
下面是一个简单的例子:
- $ crontab -e
添加上这么一行:
- 0 */10 * * * rsync -avz /home/code user@IP_ADDRESS:/home/backups
上面的crontab
将rsync
调度为每10个小时运行一次。
*/10
在crontab
语法中的小时位(hour position),/10
指定每10小时执行一次备份。如果 */10
出现在分钟位(minutes postion),那就是每10分钟执行一次备份。
请参阅9.8节了解如何配置crontab
。