rsync实现数据备份详解

RSYNC是Remote Sync 远程同步的简称,与SCP的比较,SCP= 无法备份大量数据,类似windows的复制,而rsync=边复制 ,边统计,边比较,可以备份大量数据。可以镜像保存整个目录树和文件系统。可以很容易做到保持原来文件的权限、时间、软硬链接等等。无须特殊权限即可安装。快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。支持匿名传输,以方便进行网站镜象。选择性保持:符号连接,硬链接,文件属性,权限,时间等。考虑到scp也是像类似的远程备份工具,为了便于比较,本文从以下几个方面来讲述如何用rsync进程远程备份。

一、scp远程拷贝文件

二、acl权限控制

三、rsync数据备份

四、Rsync+Inotify 实时同步

 说明:客户端(或称本地服务器):xiaolyu77  192.168.31.77 

    服务器(或称远程服务器):xiaolyu76 192.168.31.76

一、scp远程拷贝文件

  scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

1. scp的用法:

  可以man scp看一下:

 

rsync实现数据备份详解

rsync实现数据备份详解

rsync实现数据备份详解

rsync实现数据备份详解

rsync实现数据备份详解

scp的参数还是蛮多的,这里之所以不厌其烦的截图列出来,是想表达一种观点,任何新东西的学习其实都是有章可循的,那就是借助所给出的已知信息,比如man 一个命令,比如查看readme文件。这里简单翻译如下:

命令格式:scp [参数] [原路径] [目标路径]

命令参数:

    -1  强制scp命令使用协议ssh1  

    -2  强制scp命令使用协议ssh2

    -4  强制scp命令只使用IPv4寻址

    -6  强制scp命令只使用IPv6寻址

    -B  使用批处理模式(传输过程中不询问传输口令或短语)

    -C  允许压缩。(将-C标志传递给ssh,从而打开压缩功能) 

    -p 保留原文件的修改时间,访问时间和访问权限。  

    -q  不显示传输进度条。

    -r  递归复制整个目录。

    -v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

    -c cipher  以cipher将数据传输进行加密,这个选项将直接传递给ssh。  

    -F ssh_config  指定一个替代的ssh配置文件,此参数直接传递给ssh。

    -i identity_file  从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。

    -l limit  限定用户所能使用的带宽,以Kbit/s为单位。  

    -o ssh_option  如果习惯于使用ssh_config(5)中的参数传递方式, 

    -P port  注意是大写的P, port是指定数据传输用到的端口号  

    -S program  指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

2.用法及实例:

1. 从本地服务器复制到远程服务器:

 (1)复制文件:

       scp local_file remote_username@remote_ip:remote_folder   # 指定了ssh远程服务的用户名,scp复制时,需要输入密码。

       scp local_file remote_username@remote_ip:remote_file       # 指定了ssh远程服务的用户名,scp复制时,需要输入密码。

     说明:我看有人提出了,在这个地方可以不用写ssh远程登录的用户名(即scp local_file  remote_ip:remote_file),在命令执行时,会提示输入用户名和密码,本人亲身多次,不可以的,故该方法没有列出来。一般ssh登录默认是root用户,不写就代表是root用户。

   (2)复制目录:

       scp -r local_folder remote_username@remote_ip:remote_folder  #指定了ssh远程服务的用户名,命令执行后需要输入用户密码;

2. 从远程服务器复制到本地服务器: 

  从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。 

说明一下:因为我前面已经对root用户做了免秘钥登录了,所以就不用root用户做实验了,用普通用户。

实战1:上传本地文件到远程服务器指定目录下,如果用的是相对路径,默认在登录ssh服务器用户的根目录下。

#ssh本地客户端:

[root@xiaolyu77 ~]# cp /etc/passwd ./
[root@xiaolyu77 ~]# ls -ltr
total 48
-rw-r--r--. 1 root root 5890 Sep 16 08:58 install.log.syslog
-rw-r--r--. 1 root root 26271 Sep 16 09:00 install.log
-rw-------. 1 root root 1243 Sep 16 09:00 anaconda-ks.cfg
-rw-r--r-- 1 root root 1058 Sep 20 02:42 passwd
[root@xiaolyu77 ~]# scp passwd xiao@xiaolyu76:pass
xiao@xiaolyu76's password:
passwd 100% 1058 1.0KB/s 00:00

#ssh远端服务器:

[root@xiaolyu76 ~]# cd /home/xiao   #客户端登录ssh用的是该用户,相对目录,默认就是在此目录下。
[root@xiaolyu76 xiao]# mkdir pass
[root@xiaolyu76 xiao]# ls -l pass
total 0
[root@xiaolyu76 xiao]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Sep 20 02:54 pass
[root@xiaolyu76 xiao]# chmod 777 pass   #这个地方一定要注意,因为用的不是root用户,所以要给scp命令中ssh服务器端文件夹以777的权限。
[root@xiaolyu76 xiao]# ls -l
total 4
drwxrwxrwx 2 root root 4096 Sep 20 02:55 pass
[root@xiaolyu76 xiao]# ls -l pass
total 4
-rw-r--r-- 1 xiao xiao 1058 Sep 20 02:55 passwd
[root@xiaolyu76 xiao]#

rsync实现数据备份详解

rsync实现数据备份详解

注意:在客户端 执行 scp local_file remote_username@remote_ip:remote_folder 用的是普通用户登录ssh服务器,而不是root用户,

而我在服务器端创建的remote_folder文件夹(目录)用的是root用户,所以要给scp命令中ssh服务器端文件夹remote_folder以777权限。

否则在客户端执行scp命令时会报如下错误:

rsync实现数据备份详解

这是因为:对于文件夹(目录)来说777权限代表了:

r(Read,读取):      对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。

w(Write,写入):       对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

x(eXecute,执行): 对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

实战2:上传本地文件到远程服务器,不指定远程服务器的存放目录。默认在登录ssh服务器用户的根目录下。

#ssh本地客户机:

[root@xiaolyu77 ~]# scp passwd xiao@xiaolyu76:testscp
xiao@xiaolyu76's password: 
passwd 100% 1058 1.0KB/s 00:00 
[root@xiaolyu77 ~]#

#ssh远端服务器:

[root@xiaolyu76 xiao]# ls -l
total 8
drwxrwxrwx 2 root root 4096 Sep 20 02:55 pass
-rw-r--r-- 1 xiao xiao 1058 Sep 20 03:19 testscp  #注意和客户机比较文件大小。
[root@xiaolyu76 xiao]#

rsync实现数据备份详解

实战3. 从远程服务器下载文件夹到本地

[root@xiaolyu77 ~]# scp -r  xiao@xiaolyu76:/home/xiao/pass ./

rsync实现数据备份详解

总结:scp命令就是利用ssh登录,来远程复制文件。可以从本地到远程,也可以从远程到本地。当同一ip三次登录失败后,fail2ban一样会禁止该ip登录。就是说每执行一次scp命令,实际上就发起了一次ssh登录。

 二、acl权限控制

   这里为什么会谈到acl权限控制呢?因为后面我做那个rsync数据备份时,需要针对单个用户对单个目录设置权限,这就需要用到acl权限控制。

   什么是ACL 权限控制呢?ACL是Access Control List 的缩写,主要目的是针对在传统的三种身份和三种权限之外,提供更加细化的局部权限设定。官方手册来讲,它主要针对用户、用户组、以及掩码方面控制权限。
      简单去理解就是,ACL 可以针对单个用户、单个用户组来进行权限细化的控制。主要目的是提供传统的 owner,group,other 的 read,wirte,execute 权限之外的具体权限设置,可以针对单一用户或组来设置特定的权限。而在windows系统上,没有这个ACL,ACL是类Unix(Unix-like)操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行。主要包括ReiserFS, EXT2/EXT3/ext4, JFS, XFS等文件系统。

1. 判断当前文件系统是否支持acl。 

当然了,我们可以先man acl看一下,是否有相关的信息:

man acl 

rsync实现数据备份详解

也可以通过文件系统来判断:

 df -T -h

rsync实现数据备份详解

最好用如下两个命令来判断当前文件系统是否支持

dumpe2fs -h /dev/sda1 |grep acl
或者
tune2fs -l /dev/sda1 | grep options

rsync实现数据备份详解

2. ACL相关命令详解:

ACL操作的命令主要有三个:getfacl 、setfacl 和chacl,但是常用的就getfacl 和 setfacl 。

(1) 查看 ACL 权限

语法:getfacl filename

(2) 设置 ACL 权限

语法:setfacl [-bkRd] [-m|-x acl 参数]  目标文件名
选项介绍:
-m:设置后续的 acl 参数,不可与-x 一起使用
-x: 删除后续的 acl 参数,不可与-m 一起使用
-b:删除所有的 acl 参数
-k:删除默认的 acl 参数
-R:递归设置 acl 参数
-d:设置默认 acl 参数,只对目录有效

  先来看看在ACL里面每一个名词的定义,这些名词我大多从man page上摘下来虽然有些枯燥,但是对于理解下面的内容还是很有帮助的。

rsync实现数据备份详解

简单翻译如下:

  ACL是由一系列的Access Entry所组成的,每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。Access Entry有三个组成部分:Entry tag type, qualifier (optional), permission。 我们先来看一下最重要的Entry tag type,它有以下几个类型:

  ACL_USER_OBJ:相当于Linux里file_owner的permission

  ACL_USER:定义了额外的用户可以对此文件拥有的permission

  ACL_GROUP_OBJ:相当于Linux里group的permission

  ACL_GROUP:定义了额外的组可以对此文件拥有的permission

  ACL_MASK:定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)

  ACL_OTHER:相当于Linux里other的permission

我们来举例说明一下,我就用getfacl命令来查看一个已经定义好的ACL文件。

rsync实现数据备份详解

前面三个以#开头的定义了文件名,file owner和group。这些信息没有太大的作用,接下来我们可以用--omit-header来省略掉。 

user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有read and write permission user:miao:rwx 定义了ACL_USER,这样用户miao就拥有了对文件的读写权限,实现了我们一开始要达到的目的 group::--- 定义了ACL_GROUP_OBJ,说明文件的group对该文件没有权限。 group:develop:r-- 定义了ACL_GROUP,使得develop组拥有了对文件的read and write permission mask::rw- 定义了ACL_MASK的权限为read write and execute permission other::--- 定义了ACL_OTHER,说明其它组的用户对该文件没有权限 

从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能,那么接下来我们就来看一下如何设置一个文件的ACL:
如何设置ACL文件

首先我们还是要讲一下设置ACL文件的格式,从上面的例子中我们可以看到每一个Access Entry都是由三个被:号分隔开的字段所组成,第一个就是Entry tag type。

user 对应了ACL_USER_OBJ和ACL_USER

group 对应了ACL_GROUP_OBJ和ACL_GROUP

mask 对应了ACL_MASK

other 对应了ACL_OTHER

第二个字段称之为qualifier,也就是上面例子中的miao和develop组,它定义了特定用户和特定组对于文件的权限。这里我们也可以发现只有user和group才有qualifier,其他的都为空。第三个字段就是我们熟悉的permission了。它和Linux的permission一样定义,这里就不多讲了。

通俗一点就是说:ACL参数主要由三部分组成,结构如下:

四种身份:对应身份的名称:三种权限。

[u|g|o|m]:[用户名|组名]:[rwx] 

只有user和group才可以有对应的名称,其余的都为空。

好了,下面进入实战,在实战中,讲述如何设置文件和目录的ACL权限。只要一个文件或目录被设置了ACL权限,那么它就被称为ACL文件。

3.实战: 实战1:针对某一个特定用户,做一个ACL文件,并用getfacl命令来查看。

[root@xiaolyu77 tmp]# mkdir -m 700 ./acldir && ll -d ./acldir/ drwx------ 2 root root 4096 Sep 20 08:42 ./acldir/ [root@xiaolyu77 tmp]# su hello [hello@xiaolyu77 tmp]$ cd ./acldir/ bash: cd: ./acldir/: Permission denied  #权限不够,用户hello对该目录没有x权限。 [hello@xiaolyu77 tmp]$ exit exit [root@xiaolyu77 tmp]# setfacl -m u:hello:x ./acldir/ #针对用户hello设置目录acldir权限为x。 [root@xiaolyu77 tmp]# ll -d ./acldir/ drwx--x---+ 2 root root 4096 Sep 20 08:42 ./acldir/ 
#通过setacl设置权限后,会在权限末尾添加一个"+",同时文件原本权限也将发生变化。 [root@xiaolyu77 tmp]# getfacl ./acldir/  #通过getacl查看原始目录的权限。 # file: acldir/ # owner: root # group: root user::rwx user:hello:--x #hello用户对此目录有x权限。 group::--- mask::--x other::--- #只有hello用户对此目录有x权限,其它用户还是没有权限。 [root@xiaolyu77 tmp]# su hello [hello@xiaolyu77 tmp]$ cd ./acldir/ #hello用户对此目录有x权限,可以进入此目录。
[hello@xiaolyu77 acldir]$

在文件permission的最后多了一个+号,当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件,这个+号就是用来提示我们的。我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义。

rsync实现数据备份详解

实战2:针对某一个特定组,做一个ACL文件,并用getfacl 查看。

[root@xiaolyu77 tmp]# setfacl -m g:miao:rx ./acldir/ #针对miao组用户,设置目录acldir的rx权限 [root@xiaolyu77 tmp]# ll -d ./acldir/ drwxr-x---+ 2 root root 4096 Sep 20 08:42 ./acldir/ [root@xiaolyu77 tmp]# getfacl ./acldir/ # file: acldir/ # owner: root # group: root user::rwx user:hello:--x group::--- group:miao:r-x   #miao组中的用户对该目录具有rx权限。 mask::r-x other::--- [root@xiaolyu77 tmp]# su miao #miao用户属于miao组。 [miao@xiaolyu77 tmp]$ cd ./acldir/ #miao组用户对acldir目录具有rx权限 [miao@xiaolyu77 acldir]$ id miao uid=501(miao) gid=501(miao) groups=501(miao) [miao@xiaolyu77 acldir]$

rsync实现数据备份详解

实战3:为文件 aclfile 增加 acl 权限,使 miao 组的所有用户都能读写执行该文件

[root@xiaolyu77 tmp]# touch aclfile.sh [root@xiaolyu77 tmp]# chmod 700 aclfile.sh [root@xiaolyu77 tmp]# ll aclfile.sh -rwx------ 1 root root 0 Sep 20 09:39 aclfile.sh [root@xiaolyu77 tmp]# echo "date" >> ./aclfile.sh [root@xiaolyu77 tmp]# cat ./aclfile.sh date [root@xiaolyu77 tmp]# ./aclfile.sh Tue Sep 20 09:40:54 CST 2016 [root@xiaolyu77 tmp]# su miao [miao@xiaolyu77 tmp]$ echo "echo $HOME" >> ./aclfile.sh bash: ./aclfile.sh: Permission denied [miao@xiaolyu77 tmp]$ cat ./aclfile.sh cat: ./aclfile.sh: Permission denied [miao@xiaolyu77 tmp]$ ./aclfile.sh bash: ./aclfile.sh: Permission denied [miao@xiaolyu77 tmp]$ exit exit [root@xiaolyu77 tmp]# setfacl -m g:miao:rwx ./aclfile.sh [root@xiaolyu77 tmp]# ll ./aclfile.sh -rwxrwx---+ 1 root root 5 Sep 20 09:40 ./aclfile.sh [root@xiaolyu77 tmp]# getfacl ./aclfile.sh # file: aclfile.sh # owner: root # group: root user::rwx group::--- group:miao:rwx mask::rwx other::--- [root@xiaolyu77 tmp]# su miao [miao@xiaolyu77 tmp]$ cat ./aclfile.sh date [miao@xiaolyu77 tmp]$ echo "echo $PWD" >> ./aclfile.sh [miao@xiaolyu77 tmp]$ ./aclfile.sh Tue Sep 20 09:43:18 CST 2016 /tmp [miao@xiaolyu77 tmp]$

rsync实现数据备份详解

实战4:删除文件aclfile 上,关于 miao 组的 acl 权限

[root@xiaolyu77 tmp]# setfacl -x g:miao ./aclfile.sh [root@xiaolyu77 tmp]# ll aclfile.sh -rwx------+ 1 root root 15 Sep 20 09:43 aclfile.sh [root@xiaolyu77 tmp]# getfacl ./aclfile.sh # file: aclfile.sh # owner: root # group: root user::rwx group::--- mask::--- other::--- [root@xiaolyu77 tmp]#  

rsync实现数据备份详解

实战5:删除目录 acldir 的所有 ACL 权限

[root@xiaolyu77 tmp]# setfacl -b ./acldir [root@xiaolyu77 tmp]# ll -d ./acldir drwx------ 2 root root 4096 Sep 20 08:42 ./acldir [root@xiaolyu77 tmp]# getfacl ./acldir # file: acldir # owner: root # group: root user::rwx group::--- other::--- [root@xiaolyu77 tmp]#

rsync实现数据备份详解

4.重点:ACL_MASK和Effective permission

这里需要重点讲一下ACL_MASK,因为这是掌握ACL的另一个关键,在Linux file permission里面大家都知道比如对于rw-rw-r--来说, 当中的那个rw-是指文件组的permission. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立。如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group permission了。

让我们看一下下面的这个例子:

rsync实现数据备份详解

这里说明test.sh文件只有file owner: root拥有read, write, execute/search permission。admin组只有read and write permission,现在我们想让用户john也对test.sh具有和root一样的permission。

rsync实现数据备份详解

这里我们看到john已经拥有了rwx的permission,mask值也被设定为rwx,那是因为它规定了ACL_USER,ACL_GROUP和ACL_GROUP_OBJ的最大值,现在我们再来看test.sh的Linux permission,它已经变成了:

那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢?它会被permission deny。原因在于实际上admin组的用户只有read and write permission,这里当中显示的rwx是ACL_MASK的值而不是group的permission。 所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的permission,以免发生混淆。 下面我们再来继续看一个例子,假如现在我们设置test.sh的mask为read only,那么admin组的用户还会有write permission吗?

rsync实现数据备份详解

这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--,这是什么意思呢?让我们再来回顾一下ACL_MASK的定义。它规定了ACL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大权限。那么在我们这个例子中他们的最大权限也就是read only。虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限。也就是说ACL_USER和ACL_GROUP_OBJ及ACL_GROUP它们的实际权限不能超过mask的权限(因为mask定义了它们三个当中最大权限)。 这时我们再来查看test.sh的Linux file permission时它的group permission也会显示其mask的值( r--)

Default ACL

上面我们所有讲的都是Access ACL,也就是对新创建的文件,没有涉及到ACL权限继承的问题。下面我简单讲一下Default ACL。Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL。 同样我们来做一个试验说明,比如现在root用户建立了一个dir目录:

它希望所有在此目录下建立的文件都可以被john用户所访问,那么我们就应该对dir目录设置Default ACL。

rsync实现数据备份详解

 这里我们可以看到ACL定义了default选项,john用户拥有了default的read, write, excute/search permission。所有没有定义的default都将从file permission里copy过来,现在root用户在dir下建立一个test.txt文件。

rsync实现数据备份详解

这里我们看到在dir下建立的文件john用户自动就有了read,write,excute/search permissionpermission。
想一想:为什么这里./dir/test.txt文件的mask的权限只有rw吗?这是因为对于从目录继承过来的文件的ACL权限,mask最大只能是rw。结果就是

CL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大实际权限只能是rw。也就是说系统为了安全起见,不允许直接继承的权限带x。如果想要改变,可以手工修改文件的mask的值。这样的话,CL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大实际权限可能也会跟着变化。

rsync实现数据备份详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7bbf65f5df5a30491413a6dbab442f27.html