CentOS 7 下对rsync学习并实践记录
前言
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
此类异常问题解决总结:
-
密码真的输入错误,用户名真的错误
-
secrets file = /etc/rsync.password指定的密码文件和实际密码文件名称不一致
-
/etc/rsync.password文件权限不是600
-
rsync_backup:123456密码配置文件后面注意不要有空格
-
rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称