Linux系统下,有很多用于数据备份的工具。 除了前面介绍的tar、cpio、dd命令之外,本节介绍另一个用于备份数据的命令,那就是rsync。
从字面上看,rsync可以理解为sync(远程同步),但它不仅可以远程同步数据(类似于scp命令),还可以在本地同步数据(类似于cp命令)。 与cp或scp不同的一点是,使用rsync命令备份数据时,不会直接覆盖之前的数据(如果数据已经存在),而是先判断现有数据与新数据的区别数据。 只有当数据不同时才覆盖不同的部分。
在学习系统中的rsync命令之前,请确认您的Linux系统中已经安装了该命令。 如果没有,可以直接使用 yum -y rsync 命令安装。
在讲解rsync的用法之前,为了让大家对这个命令有一个整体的了解,这里举一个例子:
[root@ ~]# rsync -av /etc/ /tmp/1.txt
文件列表
已发送 34 字节 15 字节 98.00 字节/秒
总大小为 1432 为 29.22
本例中,通过执行rsync命令,将/etc/文件本地同步到/tmp/目录下,并重命名为1.txt。
另外,rsync命令还支持数据的远程同步,即将本地数据备份到远程机器上。 例如,如果我们知道远程机器的IP地址是192.168.188.128,那么使用rsync命令备份文件的执行命令是:
[root@ ~]# rsync -av /etc/192.168.188.128:/tmp/1.txt
主机 '192.168.188.128 (192.168.188.128)' 的 不能是 。
ECDSA 密钥为 26:e3:97:e7:bb:ae:17:33:ea:aa:Oc:5f:37:Oe:9e:fa。
您确定要这样做吗(是/否)? 是的
:将“192.l68.l88.l28”(ECDSA)添加到已知主机列表中。
root@192.168.188.128的:文件列表
发送 31 字节 12 字节 7.82 字节/秒
总大小为 1432 为 54.91
注意,第一次远程连接时,会提示是否继续连接,输入yes即可。 另外,当连接成功建立后,需要输入目标系统的root密码。
通过上面两个例子,读者应该能够对“rsync既支持本地备份数据,又支持远程备份数据”有一个直观的认识。 那么,如何使用rsync命令呢?
rsync命令的基本格式有很多种,分别是:
[root@ ~]# rsync [] SRC DEST
[root@ ~]# rsync [] SRC [USER@]HOST:DEST
[root@ ~]# rsync [] [USER@]HOST:SRC DEST
[root@ ~]# rsync [] [USER@]HOST::SRC DEST
[root@ ~]# rsync [] SRC [USER@]HOST::DEST
对于以上五种命令格式,rsync有5种不同的工作模式:
要知道,使用rsync远程传输数据(备份数据)之前,需要进行登录认证。 这个过程需要使用ssh协议或者rsync协议来完成。 rsync命令中,如果使用单个冒号(:),则默认使用ssh协议; 否则,如果使用两个冒号 (::),则使用 rsync 协议。
ssh协议和rsync协议的区别在于rsync协议在使用时需要额外的配置,增加了工作量,但优点是更安全; 相反,ssh协议使用方便,不需要配置,但存在泄露服务器密码的风险。
另外,上述格式中各参数的含义如下:
rsync命令提供的功能如表1所示。
表1 rsync选项及功能选项
-A
这是归档模式,意味着文件被递归传输,保留所有属性,相当于 -r、-l、-p、-t、-g、-o、-D 选项。 -a 选项后面可以跟一个 --no-,这意味着关闭 -r、-l、-p、-t、-g、-o 和 -D 之一。 例如,-a --no-l 相当于 -r、-p、-t、-g、-o、-D 选项。
-r
意味着以递归方式处理子目录。 主要用于目录。 如果单独传输文件,则不需要添加-r选项,但传输目录时必须添加-r选项。
-v
表示打印一些信息,如文件列表、文件数量等。
-l
表示保留软连接。
-L
表示软链接被视为常规文件。 如果SRC中有软链接文件,添加该选项会将软链接指向的目标文件复制到DEST。
-p
表示保留文件权限。
-o
表示维护文件所有者信息。
-G
表示维护文件组信息。
-D
表示保存设备文件信息。
-t
表示保留文件时间信息。
--
表示删除DEST中SRC中不存在的文件。
--=
表示指定排除不需要传输的文件。 等号后跟文件名,可以是通配符模式(例如 *.txt)。
--
表示在同步过程中可以看到同步进程状态,如同步文件数量统计、同步文件传输速度等。
-u
表示DEST中比SRC更新的文件将被排除并且不会被覆盖。
-z
使用此选项,将在传输过程中执行压缩。
上面仅列出了 async 命令的一些常用选项。 对于初学者来说,只需记住最常用的选项,例如 -a、-v、-z、-- 和 --。
如果想查看async提供的所有选项,可以直接执行async命令。
为了更好地展示各个选项的功能,需要做一些准备工作。 执行以下命令:
#新建rsync目录
[root@ ~]# mkdir rsync
[root@ ~]# cd rsync
#在rsync目录下创建test1目录
[root@rsync]# mkdir test1
[root@rsync]# cd test1
#在test1目录下,分别创建名为1、2、3、/root.123.txt的文件。
[root@test1]# touch 1 2 3 /root/123.txt
[root@test1]# ln -s /root/123.txt ./123.txt
[root@test1]# ls -l
总计 0
-rw-r--r--。 1 根 根 0 0ct 23 07:34 1
。 1 根 13 0ct 23 08:34 123.txt -> /root/123.txt
-rw-r--r--。 1 根 0 0ct 23 07:34 2
-rw-r--r--。 1 根 0 0ct 23 07:34 3
[root@test1]# cd ..
#返回rsync目录
[根@rsync]#
在此基础上,我们选取了下面几个常用的选项来给大家举例说明它们的用法。
rsync -a 选项 首先我们看一下-a选项的用法,如下:
[root@rsync]# rsync -a test1 test2
[root@rsync]#ls test2
测试1
[root@rsync]# ls test2/test1/
1 123.txt 2 3
这里有一个问题。 我们原本想把test1目录的内容直接放到test2目录中,但是结果rsync命令新建了一个test2目录,然后把test1放到了test2中。
如果想将test1目录下的内容直接备份到test2目录下,则需要将上面的命令修改为:
[root@rsync]#rm -rf test2
[root@rsync]# rsync -a test1/ test2/
[root@rsync]#ls test2/
1 123.txt 2 3
可以看到,只需在test1和test2目录后面添加/斜杠即可。
前面提到,使用 -a 选项相当于同时使用 -r、-l、-p、-t、-g、-o、-D 选项,并且 -a 还可以与 - 一起使用-不-。 我们来看看-l选项的作用:
[root@rsync]# rm -rf test2
[root@rsync]# rsync -av test1/ test2/
文件列表
测试2
./
非文件“123.txt”
已发送 200 字节 72 字节 544.00 字节/秒
总大小为 13 为 0.05
这里使用-v选项,可以看到在复制过程中跳过了非普通文件123.txt。 事实上,123.txt是一个软链接文件。 如果不使用-l选项,系统将忽略软链接文件。 rsync -- 选项如表1所示。 -- 选项用于 -- 删除DEST中SRC中不存在的文件。 例如:
#复制test1目录下的数据
[root@rsync]# rsync -a test1/ test2
#删除test1/123.txt文件
[root@rsync]# rm -f test1/123.txt
[root@rsync]#ls test1/
1 2 3
[root@rsync]# rsync -av test1/ test2/
文件列表
./
已发送 55 字节 15 字节 140.00 字节/秒
总大小为 0 为 0.00
[root@rsync]#ls test2/
1 123.txt 2 3
可以看到,删除test1目录下的123.txt文件后,再次备份并没有对test2目录下的123.txt文件产生任何影响。
使用下面的--选项再次执行复制命令,如下图:
[root@rsync]# rsync -av --test1/ test2/
文件列表
123.txt
已发送 52 字节 12 字节 128.00 字节/秒
总大小为 0 为 0.00
[root@rsync]#ls test2/
1 2 3
可以看到,使用--选项备份数据时,一旦test1目录发生改变,test2也会随之改变。
不仅如此,如果文件添加到DEST但不包含在SRC中,那么使用--选项进行同步备份操作时,DEST添加的文件将会被删除。 例如:
[root@rsync]# 触摸测试2/4
[root@rsync]#ls test1/
1 2 3
[root@rsync]#ls test2/
1 2 3 4
[root@rsync]# rsync -a -- test1/ test2/
[root@rsync]#ls test2/
1 2 3
由于篇幅限制,本节不会给出 rsync 命令其他选项的具体使用示例。 有兴趣的读者可以自己编写代码进行测试。