美文网首页
CentOS 7 下对rsync学习并实践记录

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

作者: 小钟钟同学 | 来源:发表于2018-03-06 00:19 被阅读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客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称

    相关文章

      网友评论

          本文标题:CentOS 7 下对rsync学习并实践记录

          本文链接:https://www.haomeiwen.com/subject/uaekfftx.html