CentOS 7 下对rsync学习并实践记录

2018-03-06  本文已影响342人  小钟钟同学

前言

PS:本人纯属服务端小白,白的不能再白!有些地方可能描述的不是很准确,还请方家多多指教!

学习参考地址:http://man.linuxde.net/rsync
故障排除参考地址:https://www.cnblogs.com/wang-xd/p/6551402.html

概念

rsync的作用

1:本地数据同步(类似cp复制命令)
2:远程数据同步(类似scp)

PS:与cp和scp 不同点是rsync是进行数据差异化的同步,也就是所谓的增量拷贝,就是如果数据已存在,不会覆盖已存在的数据,只有数据存在差异时候才进行同步。

安装

[root@bogon ~]# yum install -y rsync

安装完成后一个本地同步测试示例

# 把/etc/passwd 下的内容同步到/tmp/xiaozhong.yy 文件中
[root@bogon ~]# rsync -av /etc/passwd /tmp/xiaozhong.yy 
sending incremental file list
passwd

sent 1082 bytes  received 31 bytes  2226.00 bytes/sec
total size is 1008  speedup is 0.91
[root@bogon ~]# 

查看结果

[root@bogon ~]# cd /tmp/
[root@bogon tmp]# ll
total 8
-rwx------. 1 root root  836 Jan  7 23:59 ks-script-G_oEI7
drwx------. 3 root root   17 Jan  8 00:03 systemd-private-9882fb72393b441bb98a780056f573ce-vmtoolsd.service-VMJHMD
drwx------. 3 root root   17 Mar  5 09:10 systemd-private-ecd950f7e13240f9980360cc3aa9c10f-vmtoolsd.service-RHgTMS
drwx------. 3 root root   17 Jan  8 07:20 systemd-private-f1f1115c74d6454eb93f0eec2da78736-vmtoolsd.service-LFuDRy
-rw-r--r--. 1 root root 1008 Jan  7 23:59 xiaozhong.yy
-rw-------. 1 root root    0 Jan  7 23:49 yum.log
[root@bogon tmp]# 

[root@bogon tmp]# cat xiaozhong.yy  #查看内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
[root@bogon tmp]#

同步目录时候需要注意细节问题:加'/'和不加'/'的区别

[root@bogon rsync]# rsync -a test1 test2
[root@bogon rsync]# ls test2/
test1
[root@bogon rsync]# rm -f test2
rm: cannot remove ‘test2’: Is a directory
[root@bogon rsync]# rm -rf test2
[root@bogon rsync]# rsync -a test1/ test2/
[root@bogon rsync]# ls test2/
1  123.txt  2  3
[root@bogon rsync]# 

解释:
加'/' 表示只是把目录下的内容进行备份,
不加是连目录名一同进行备份处理!

同步的时候关于 --delete

说明:--delete 删除那些DST中SRC没有的文件。保持同步数据一致性

远程同步小示例

准备两台虚拟服务器:
192.168.74.128
192.168.74.129

示例1:通过ssh的方式备份数据(示例来自跟阿铭学linux)

命令:rsync test1/ 192.168.74.129:/tmp/test2/

[root@bogon rsync]# rsync test1/ 192.168.74.129:/tmp/test2/
The authenticity of host '192.168.74.129 (192.168.74.129)' can't be established.
ECDSA key fingerprint is b1:95:de:4a:27:95:46:fb:ff:b6:aa:3b:7f:6f:cc:89.
Are you sure you want to continue connecting (yes/no)? yes # 第一次需要输入yes
Warning: Permanently added '192.168.74.129' (ECDSA) to the list of known hosts.
root@192.168.74.129's password:  #输入192.168.74.129 root密码
skipping directory .
[root@bogon rsync]# 

查看192.168.74.129/tmp/test2/目录下的结果:
[图片上传失败...(image-67ec29-1520261550264)]

Last login: Wed Feb 28 21:24:48 2018 from 192.168.74.1
[root@bogon ~]# ls /tmp/test2/
[root@bogon ~]# cd /tmp/test2/
[root@bogon test2]# ll
total 0
[root@bogon test2]# 

没有数据!有点奇怪!

原来是因为命令错误:
命令:rsync -avL test1/ 192.168.74.129:/tmp/test2/

[root@bogon rsync]# rsync -avL test1/ 192.168.74.129:/tmp/test2/
root@192.168.74.129's password: 
sending incremental file list
./
.123.txt
1
123.txt
2
3

sent 275 bytes  received 110 bytes  23.33 bytes/sec
total size is 0  speedup is 0.00

重新再查看129的目录下的数据,已经同步成功:

Last login: Wed Feb 28 21:24:48 2018 from 192.168.74.1
[root@bogon ~]# ls /tmp/test2/
[root@bogon ~]# cd /tmp/test2/
[root@bogon test2]# ll
total 0
[root@bogon test2]# ll
total 0
-rw-r--r--. 1 root root 0 Mar  5 09:31 1
-rw-r--r--. 1 root root 0 Mar  5 09:31 123.txt
-rw-r--r--. 1 root root 0 Mar  5 09:31 2
-rw-r--r--. 1 root root 0 Mar  5 09:31 3
[root@bogon test2]# 
示例2:通过ssh的方式免输入密码方式备份数据(示例来自跟阿铭学linux)

记得之前学习Centos7下-使用密钥认证方式登入服务器之前已经生成了对应的密钥对。
地址:https://www.jianshu.com/p/fba14eadf6be

我们把之前128生成的公钥也放到129下面的authorized_keys
在128的服务上使用的命令方式是:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.74.129
或
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.74.129

执行过程:

[root@bogon rsync]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.74.129
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.74.129's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.74.129'"
and check to make sure that only the key(s) you wanted were added.

[root@bogon rsync]# 

上面执行完成后尝试,在128服务器使用ssh连接129看看(登入成功查看对应的IP 说明 免密登入成功):

[root@bogon rsync]# ssh 192.168.74.129
Last login: Mon Mar  5 09:30:13 2018 from 192.168.74.1
[root@bogon ~]# hostname
bogon
[root@bogon ~]# ipconfig
-bash: ipconfig: command not found
[root@bogon ~]# ifcongif
-bash: ifcongif: command not found
[root@bogon ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.74.129  netmask 255.255.255.0  broadcast 192.168.74.255
        ether 00:0c:29:6a:c4:38  txqueuelen 1000  (Ethernet)
        RX packets 1396  bytes 112339 (109.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 527  bytes 69682 (68.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 4  bytes 340 (340.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 340 (340.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@bogon ~]# 

再重新尝试示例1的命令看看是否还需要输入密码:

[root@bogon ~]# rsync -avL test1/ 192.168.74.129:/tmp/test2/
sending incremental file list
rsync: change_dir "/root//test1" failed: No such file or directory (2)

sent 12 bytes  received 12 bytes  2.29 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]

rsync -avL test1/ 192.168.74.129:/tmp/test2/

出现了错误是因为:当前不是在对应的test1目录下

[root@bogon ~]# cd rsync/
[root@bogon rsync]# ll
total 0
drwxr-xr-x. 2 root root 64 Mar  5 09:32 test1
drwxr-xr-x. 2 root root 64 Mar  5 09:32 test2
[root@bogon rsync]# rsync -avL test1/ 192.168.74.129:/tmp/test2/
sending incremental file list

sent 77 bytes  received 12 bytes  7.74 bytes/sec
total size is 0  spee
示例3:通过后台服务的方式

(来自跟阿铭学linux)
说明:这种方式是在远程主机上搭建一个rsync的服务器,在服务器上配置好rsync的配置文件信息,然后本机作为rsync的一个客户端连接远程的rsync的服务器。

配置128-rsync服务器步骤:
(1):在128主机上建立并配置rsync的配置文件【/etc/rsyncd.conf】。

[root@bogon rsync]# nano /etc/rsyncd.conf

[root@bogon rsync]# nano /etc/rsyncd.conf 

# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

# configuration example:

# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
  GNU nano 2.3.1                                        File: /etc/rsyncd.conf                                                                             Modified  

# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# [ftp]
#        path = /home/ftp
#        comment = ftp export area
port = 873
log file = /var/log/rsync.log
pid file = /var/run/rsyncd.pid  
address = 192.168.74.128

[test]
path = /root/rsync
use chroot = yes
max connections = 4
read only = no
list = true
uid = root
gid = root
auth users = test
secrets file = /ect/rsyncd.password
hosts allow = 192.168.74.129

文件内容:

#全局配置
port = 873 
log file = /var/log/rsync.log
pid file = /var/run/rsyncd.pid  
address = 192.168.74.128
#模块配置(可以配置多模块,模块名可以自定义)
[test]
path = /root/rsync
use chroot = yes
max connections = 4
read only = no
list = true
uid = root
gid = root
auth users = test
secrets file = /ect/rsyncd.password
hosts allow = 192.168.74.129

PS:如果想查阅更多的关于配置文件的参数信息可以使用:

man rsyncd.conf

参数信息说明:
port --- 指定在哪个端口启动rsyncd服务,默认873端口

log file --- 指定日志文件

pid file ---指定pid文件,该文件主要的涉及到服务的启动和停止等进程的管理操作

address --- 指定启动rsyncd服务器的IP,如你的机器有多个IP,就可以指定其中一个为启动IP,如果不指定该参数,则默认是在全部的IP上启动。

[] ---:指定模块的名称

path --- 指定数据存放的路径

use chroot true|false : 表示在传输文件前,首先chroot 到path参数所指定的目录下。目的是:实现额外的完全防护,但缺点是需要root权限,并且不能备份指向外部的符号连接所指向的目录文件(软连接文件)。默认情况是true,但是如果需要同步的目录下包含有软连接文件的话,那么就设置为false!

max connections --- 指定最大的连接数,默认是0 ,表示没限制。

read only true|false --- 如果是true, 则不能上传到该模块指定的路径下。

list --- 表示当用户查询该服务器上的可用模块是,该模块是否要列出,设置为true,则显示出来!反之不显示!

uid/gid --- 指定传输文件是以那个用户/组的身份进行传输。

auth users --- 指定传输时要使用的用户名。

secrets file --- 指定密码文件,该参数联通上面的uth users 参数如果不指定,则不使用密码验证。另外注意:该密码文件的权限一定要设置为 600 。

hosts allow --- 表示可以连接该模块的主机,可以是ip或网段, 如果是多个,中间使用空格分开。

PS:配置文件修改完成后,不需要重启rsyncd服务!修改完后会直接的生效。

(2):编辑secrets file并保持且赋予600权限。

[root@bogon rsync]# nano /etc/rsyncd.password

  GNU nano 2.3.1                                       File: /etc/rsyncd.password                                                                                    

test:test123


[root@bogon rsync]# chmod 600 /etc/rsyncd.password 
[root@bogon rsync]# 

(3):开始后台启动rsyncd服务

[root@bogon rsync]# rsync --daemon --config=/etc/rsyncd.conf 

(4) 查看启动日志,并查看启动端口:

[root@bogon rsync]# cat /var/log/rsync.log 
2018/03/05 10:49:56 [2570] rsyncd version 3.0.9 starting, listening on port 873
[root@bogon rsync]# 

PS: 如果需要开启启动rsyncd服务,需把

rsync --daemon --config=/etc/rsyncd.conf 

写入到:

/etc/rc.d/rc.local

(5)先关闭两台服务器的防火墙,后期线上在进行设置相关端口规则
分别执行:

[root@bogon rsync]# systemctl stop firewalld
[root@bogon rsync]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
[root@bogon rsync]#

(6)在客户机129上执行相关的同步命令

[root@bogon test2]# rsync -avL test@192.168.74.128::test/test1/ /tmp/test5/

错误现象:

[root@bogon test2]# rsync -avL test@192.168.74.128::test/test1/ /tmp/test5/
Password: 
@ERROR: auth failed on module test
rsync error: error starting client-server protocol (code 5) at main.c(1516) [Receiver=3.0.9]
[root@bogon test2]# 

输入的密码是:test123 结果认证错!

在128上修改模块的密码为123456 并且重启一下服务器:

[root@bogon rsync]# rsync --daemon --config=/etc/rsyncd.conf 
[root@bogon rsync]# failed to create pid file /var/run/rsyncd.pid: File exists

[root@bogon rsync]# 
[root@bogon rsync]# ps -ef|grep rsyncd
root       2694   2443  0 11:06 pts/1    00:00:00 grep --color=auto rsyncd
[root@bogon rsync]# rm -rf /var/run/rsyncd.pid 
[root@bogon rsync]# rsync --daemon --config=/etc/rsyncd.conf 
[root@bogon rsync]# 

发现问题所在是因为配置文件信息密码路径有误。

/ect/rsyncd.password
改为
/etc/rsyncd.password

最终修正一下相关配置文件信息为:

port = 873
log file = /var/log/rsync.log
pid file = /var/run/rsyncd.pid
address = 192.168.74.128

[test]
path = /root/rsync
use chroot = false
max connections = 4
read only = no
list = true
uid = root
gid = root
auth users = test
secrets file = /etc/rsyncd.password
hosts allow = 192.168.74.129

PS:如果use chroot = true,则同步的时候会出现软件文件权限的问题,因为在128服务器下有一个软连接的文件。
需要修改为 :use chroot = false

(7)在129服务器上执行同步命令的时候,还是需要输入密码的方式,为了实现免输入密码的方式,可以再129的地方建立一个自动输入密码的文件

主要的方式是:
(7.1)在客户端(129)指定密码文件,如把密码文件放置到 /etc/pass下

[root@localhost test5]# nano /etc/pass

  GNU nano 2.3.1                                          File: /etc/pass                                                                                            

xiaozhong

PS:注意此密码和128中配置的用户名对应的密码是一致的哟!

[root@localhost test5]# cat /etc/pass
xiaozhong
[root@localhost test5]# 

(7.2)修改文件权限

[root@localhost test5]# chmod 600 /etc/pass
[root@localhost test5]# 

(7.3)修改同步的命令,指定密码

rsync -avL test@192.168.74.128::test/test1/ /tmp/test8/ --password-file=/etc/pass

[root@localhost test5]# rsync -avL test@192.168.74.128::test/test1/ /tmp/test8/ --password-file=/etc/pass
receiving incremental file list
created directory /tmp/test8
./
.123.txt
1
123.txt
2
3

sent 152 bytes  received 343 bytes  990.00 bytes/sec
total size is 0  speedup is 0.00
[root@localhost test5]# 
》在129上把本机一些目录同步到128服务端的命令测试:
[root@localhost test5]# rsync -avzP  --delete --password-file='/etc/pass' --exclude-from=/etc/rsync_exclude.list  /etc/pass test@192.168.74.128::test  
sending incremental file list
pass
          10 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)

sent 111 bytes  received 27 bytes  276.00 bytes/sec
total size is 10  speedup is 0.07
[root@localhost test5]# 

查看一下128同步的结果

[root@localhost rsync]# ll
total 4
-rw-------. 1 root root 10 Mar  5 21:54 pass
drwxr-xr-x. 2 root root 64 Mar  5 09:32 test1
drwxr-xr-x. 2 root root 64 Mar  5 09:32 test2
[root@localhost rsync]# cat pass 
xiaozhong
[root@localhost rsync]# 

[root@localhost www]# rsync -avzP --delete --password-file='/etc/pass' --exclude-from=/etc/rsync_exclude.list /data/ test@192.168.74.128::test

[root@localhost rsync]# ll
total 0
-rwxr-xr-x.  1 root root   0 Feb 28 21:26 343.txt
drwxr-xr-x. 10 root root 175 Jan 15 21:36 app
drwxr-xr-x.  6 root root 187 Jan 11 04:26 bak
drwxr-xr-x.  2 root root  24 Jan 10 01:55 logs
drwxr-xr-x.  2 root root   6 Jan 10 01:45 redis
drwxr-xr-x.  3 root root  41 Jan 10 02:05 www
[root@localhost rsync]# 

[root@localhost www]# rsync -avzP --delete --password-file='/etc/pass' --exclude-from=/etc/rsync_exclude.list /data/www/ test@192.168.74.128::test

[root@localhost rsync]# ll
total 4
drwxr-xr-x. 2 root root   6 Jan 10 21:24 __pycache__
-rw-r--r--. 1 root root 874 Jan 10 21:23 tasks.py
[root@localhost rsync]# 

遇到的问题处理:

1:启动rsyncd服务的时候失败:
查看日志信息显示:


2018/03/05 21:05:48 [2192] rsyncd version 3.0.9 starting, listening on port 873
2018/03/05 21:05:48 [2192] bind() failed: Cannot assign requested address (address-family 2)
2018/03/05 21:05:48 [2192] unable to bind any inbound sockets on port 873
2018/03/05 21:05:48 [2192] rsync error: error in socket IO (code 10) at socket.c(555) [Receiver=3.0.9]

可能原因:因为端口没开,或是因为防火墙没关闭@@@,可能是虚拟机重启后防火墙设置失效了!再重新进行关闭进行测试!

[root@bogon rsync]# systemctl stop firewalld
[root@bogon rsync]# systemctl disable firewalld

可是关闭了还是不行!!后来发现是登入错了服务器!!!!不是在128里启动的服务器!

2:取消使用用户认证后,


image.png

在129上进行同步出现了
错误信息:


image.png

原因:
原因是有文件没有写的权限,导致备份数据库权限不够,两种解决办法:

1)、将服务端rsyncd.conf配置文件的uid和gid分别修改成root,重载下,/etc/rc.d/init.d/xinetd reload,再次执行同步,同步成功

2)、将需要同步的文件夹及下属文件赋予777权限(chmod -R 777 xxx),再次执行同步,同步成功

注意:如果使用第一种办法,那么在执行完同步后,为了安全,记得将uid和gid修改回来,或修改成nobody

3),问题的原始因为配置文件里的
use chroot = true 默认是开启的true

use chroot = false 即可

3:恢复使用用户认证继续测试..@ERROR: auth failed on module test

错误原因:
128配置文件的密码目录写错

secrets file = /ect/rsyncd.password
应该是:
secrets file = /etc/rsyncd.password

#全局配置
port = 873 
log file = /var/log/rsync.log
pid file = /var/run/rsyncd.pid  
address = 192.168.74.128
#模块配置(可以配置多模块,模块名可以自定义)
[test]
path = /root/rsync
use chroot = yes
max connections = 4
read only = no
list = true
uid = root
gid = root
auth users = test
secrets file = /ect/rsyncd.password
hosts allow = 192.168.74.129

此类异常问题解决总结:

  1. 密码真的输入错误,用户名真的错误

  2. secrets file = /etc/rsync.password指定的密码文件和实际密码文件名称不一致

  3. /etc/rsync.password文件权限不是600

  4. rsync_backup:123456密码配置文件后面注意不要有空格

  5. rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称

上一篇下一篇

猜你喜欢

热点阅读