在 CentOS Linux 上安装 rsync

rsync 是一个增量备份软件,可实现两端主机的文件同步;配合任务计划,rsync 能实现定时或间隔同步。

yum 安装或者更新:

[root@host ~]# yum install -y rsync
[root@host ~]# yum update -y rsync

编译安装:

1、先去官网下载最新版的 rsync :

https://rsync.samba.org/

如下图所示,复制 rsync 的下载链接:

下载最新版的 rsync
下载最新版的 rsync

2 、进入你的 CentOS ,先使用 yum 安装 wget(如果已经安装过,可忽略这步):

[root@host ~]# yum -y install wget

3 、Ricky 个人是喜欢把一些临时文件放到 /tmp 目录下,所以进入 /tmp 目录,使用 wget 命令把 rsync 的 tar.gz 包下载到这里,然后解压(或者下载到 PC 后,再通过 FTP 上传至 CentOS Linux ):

[root@host ~]# cd /tmp
[root@host tmp]# wget https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz
[root@host tmp]# tar -zxvf rsync-3.1.3.tar.gz

4 、进入解压出来的文件夹,在这里执行编译安装操作:

[root@host tmp]# cd rsync-3.1.3/
[root@host rsync-3.1.3]# ./configure --prefix=/usr/local/rsync
[root@host rsync-3.1.3]# make && make install

5 、删除掉这个文件夹:

[root@host rsync-3.1.3]# cd ..
[root@host tmp]# rm -rf rsync-3.1.3/

6 、添加一个软连接(否则会报 bash: rsync: command not found 的错误):

[root@tmp ~]# ln -s /usr/local/rsync/bin/rsync /usr/bin/rsync

注意:如果此时提示 /usr/bin/rsync 文件已经存在,那么可能您的 CentOS Linux 已经自带了 rsync ,此时使用 yum 命令移除 rsync(执行命令 yum remove -y rsync )或者删除这个 /usr/bin/rsync 文件(执行命令 rm -f /usr/bin/rsync )再重新建立软链接即可。

7 、使用下述命令查看 rsync 的版本号:

[root@tmp ~]# rsync --version
rsync  version 3.1.3  protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, no ACLs, xattrs, iconv, symtimes, prealloc

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
[root@tmp ~]#

至此,安装完成。

命令参数介绍:

  1. -v :显示 rsync 过程中的详细信息。可以使用 ” -vvvv ” 获取更详细的信息。
  2. -P :显示文件传输的进度信息(实际上 ” -P ” = ” –partial –progress ” ,其中的 ” –progress ” 才是显示进度信息的)。
  3. -n –dry-run :仅测试传输,而不实际传输。常和 ” -vvvv ” 配合使用来查看 rsync 是如何工作的。
  4. -a –archive :归档模式,表示递归传输并保持文件属性,等同于 ” -rtopgDl ” 。
  5. -r –recursive :递归到目录中去( -a 中已包含 -r )
  6. -t –times :保持 mtime 属性。强烈建议任何时候都加上 ” -t ” ,否则目标文件 mtime 会设置为系统时间,导致下次更新检查出 mtime 不同从而导致增量传输无效( -a 中已包含 -t )
  7. -o –owner :保持 owner 属性(属主,-a 中已包含 -o )。
  8. -g –group :保持 group 属性(属组,-a 中已包含 -g )。
  9. -p –perms :保持 perms 属性(权限,不包括特殊权限,-a 中已包含 -p )。
  10. -D :是 ” –device –specials ” 选项的组合,即也拷贝设备文件和特殊文件( -a 中已包含 -D )
  11. -l –links :如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象( -a 中已包含 -I )
  12. -z :传输时进行压缩提高效率。
  13. -R –relative :使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。
  14. –size-only :默认算法是检查文件大小和 mtime 不同的文件,使用此选项将只检查文件大小。
  15. -u –update :仅在源 mtime 比目标已存在文件的 mtime 新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
  16. -d –dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为 ” dir1/file1 ” ,则不会拷贝 dir1 目录,使用该选项将拷贝 dir1 但不拷贝 file1 。
  17. –max-size :限制 rsync 传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:” –max-size=1.5m ” )。
  18. –min-size :限制 rsync 传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
  19. –exclude :指定排除规则来排除不需要传输的文件。
  20. –delete :以源服务器为主,对目的服务器进行同步。多则删之,少则补之。注意 ” –delete ” 是在接收端执行的,所以它是在 exclude / include 规则生效之后才执行的。
  21. -b –backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用 ” ~ ” 做后缀。
  22. –backup-dir :指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
  23. -e :指定所要使用的远程 shell 程序,默认为 ssh 。
  24. –port :连接 daemon 时使用的端口号,默认为 873 端口。
  25. –password-file :daemon 模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程 shell 认证的密码,而是 rsync 模块认证的密码。
  26. -W –whole-file :rsync 将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
  27. –existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
  28. –ignore-existing :要求只更新目标端不存在的文件。
  29. –remove-source-files :要求删除源端已经成功传输的文件。

使用:

1 、关于路径是否尾随斜线的问题:

源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的:

  • 不带尾随斜线表示的是整个目录包括目录本身;
  • 带上尾随斜线表示的是目录中的文件,不包括目录本身。

比如:

[root@host ~]# rsync -a /etc /tmp
[root@host ~]# rsync -a /etc/ /tmp

第一个命令会在 /tmp 目录下创建 etc 目录。而第二个命令不会在 /tmp 目录下创建 etc 目录,源路径 /etc/ 中的所有文件都直接放在 /tmp 目录下。

2 、通过 ssh 免登录的方式来使用 rsync 同步:

因为 rsync 的使用方式比较多,配置过程也较为繁琐,这里 Ricky 目前只介绍通过 ssh 免登录的方式来使用 rsync 同步,同时写了一个名为 rsync.sh 的 Linux Shell 脚本来实现。

Ricky 这里创建了三台操作系统版本为 CentOS Linux 7.5.1804 的 VMware 虚拟机:

  • 其中一台的 IP 地址为 172.16.57.159 ,是 rsync 同步中的 master(主);
  • 另外两台的 IP 地址为 172.16.57.156 和 172.16.57.157 ,是 rsync 同步中的 slave(从);
  • slave 会去同步 master 指定文件夹下的所有文件。

1 、请根据上述步骤在这三台虚拟机上安装 rsync 。

2 、在 master 和 slave 上均写入下列脚本,在命令行界面输入:

[root@host ~]# vi /root/rsync.sh

键入小写字母 i ,进入编辑模式,将以下脚本复制粘贴进去(请根据实际需要进行相应地修改):

#!/bin/bash

read -p "您当前的服务器是源服务器(主)还是目标服务器(从)?如果是主输入 M ,如果是从输入 S :" RSYNC_TYPE

if [ "$RSYNC_TYPE" = "m" -o "$RSYNC_TYPE" = "M" ] ; then

        IS_EXIST_RSYNCUSER=`cut -d : -f 1 /etc/passwd | grep -c rsyncuser`
        if [ "$IS_EXIST_RSYNCUSER" = "0" ] ; then
                adduser rsyncuser
        fi

        if [ ! -x "/home/rsyncuser/.ssh" ] ; then
                mkdir -p /home/rsyncuser/.ssh
        fi

        cd /home/rsyncuser
        rm -f /home/rsyncuser/id_dsa
        rm -f /home/rsyncuser/id_dsa.pub
        rm -f /home/rsyncuser/id_rsa
        rm -f /home/rsyncuser/id_rsa.pub

        ssh-keygen -t rsa -f /home/rsyncuser/id_rsa -b 8192 -N ""

        echo `cat /home/rsyncuser/id_rsa.pub` >> /home/rsyncuser/.ssh/authorized_keys
        rm -f /home/rsyncuser/id_rsa.pub

        chown rsyncuser:rsyncuser /home/rsyncuser/.ssh -R

        echo 
        echo !!! 注意!!!目标服务器(从)全部配置完成后即可删除以下文件:/home/rsyncuser/id_rsa
        echo 您现在可以在 slave 上执行该脚本了。

elif [ "$RSYNC_TYPE" = "s" -o "$RSYNC_TYPE" = "S" ] ; then

        echo
        echo !!! 注意!!!请先在 master 上执行该脚本!
        echo
        read -p "请输入源服务器(主)的 IP 地址 :" MASTER_IP
        read -p "请输入您要登录源服务器(主)所使用的 Linux 账号(比如:root ):" MASTER_NAME
        read -p "请输入目标服务器(本机)的 IP 地址 :" THIS_SERVER_IP
        read -p "请输入您要登录目标服务器(本机)所使用的 Linux 账号(比如:root ):" THIS_SERVER_NAME
        read -p "请输入源服务器(主)上的源路径(比如:/www/app/www.test.com ):" RPATH
        read -p "请输入目标服务器(本机)上的目标路径(比如:/www/app ,默认值为 /www/app ,直接回车即可):" LPATH

        if [ -z "${LPATH}" ];then
                LPATH=/www/app
        fi

        if [ -x "/home/rsync" ] ; then
                rm -f /home/rsync/id_rsa
                rm -f /home/rsync/id_dsa
        else
                mkdir /home/rsync
        fi

        ssh -t $MASTER_NAME@$MASTER_IP "sudo scp /home/rsyncuser/id_rsa $THIS_SERVER_NAME@$THIS_SERVER_IP:/tmp/id_rsa"
        if [ ! -f "/tmp/id_rsa" ] ; then
                echo 
                echo 错误!id_rsa 文件找不到!请确保源服务器(主)上有这个文件:/tmp/id_rsa ,同时上述 ssh 密码输入是正确的。
                exit
        fi
        mv /tmp/id_rsa /home/rsync/id_rsa
        chmod 0600 /home/rsync/id_rsa

        echo '#!/bin/sh

RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/home/rsync/id_rsa
RUSER=rsyncuser
RHOST=----RHOST----
RPATH=----RPATH----
LPATH=----LPATH----

$RSYNC -av --delete -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH
#$RSYNC -av --delete --exclude "WEB-INF/logs/" -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH' > /home/rsync/rsync.sh

        sed -i "s#----RHOST----#$MASTER_IP#g" /home/rsync/rsync.sh
        sed -i "s#----RPATH----#$RPATH#g" /home/rsync/rsync.sh
        sed -i "s#----LPATH----#$LPATH#g" /home/rsync/rsync.sh
        chmod +x /home/rsync/rsync.sh

        if [ -f "/var/spool/cron/root" ] ; then
                sed -i "/rsync.sh/d" /var/spool/cron/root
        fi
        echo "*/3 * * * * /home/rsync/rsync.sh" >> /var/spool/cron/root

        echo 
        echo =====================================================
        echo 即将执行同步 ...
        sh /home/rsync/rsync.sh
        echo 
        echo =====================================================
        echo 执行完毕。
        echo 在 slave 上将会定时执行同步(请用命令 crontab -l 查看);
        echo 如需手动同步,请在 slave 上执行:sh /home/rsync/rsync.sh 。
else
        echo 程序退出 ...
fi

按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。

注意:

( 1 )这里需要额外注意一下这条命令:ssh -t $MASTER_NAME@$MASTER_IP “sudo scp /home/rsyncuser/id_rsa $THIS_SERVER_NAME@$THIS_SERVER_IP:/tmp/id_rsa” :

这条命令是在 slave 上执行的,先在 slave 上用 ssh -t 命令远程登录 master ,然后再在 master 上执行 sudo scp 命令。如果 $MASTER_NAME 和 $THIS_SERVER_NAME 的值均等于 root ,那么您先输入的密码是 master 的 root 账号的密码,然后再输入 slave 的 root 账号的密码。

( 2 )为什么不直接 scp $MASTER_NAME@$MASTER_IP:/home/rsyncuser/id_rsa /tmp/id_rsa ?

如果此时 $MASTER_NAME = zhangsan 这样的普通账号,那么您不一定具有读取 /home/rsyncuser/id_rsa 文件的权限,这将导致传输文件失败。所以先使用 ssh -t 命令远程登录 master ,然后再在 master 上用 root 权限执行 scp 命令(也就是 sudo scp )即可把 id_rsa 文件传输到 slave 上。

3 、在 master 和 slave 上均创建下列文件夹:

[root@host ~]# mkdir -p /www/app/www.test.com

4 、在 master 上写入下列文件:

[root@master ~]# echo "ccie.lol" > /www/app/www.test.com/index.html

在 slave1( 172.16.57.156 )上写入下列文件:

[root@slave1 ~]# echo "Ricky" > /www/app/www.test.com/index.html

slave2( 172.16.57.157 )上不写入任何文件。

5 、先在 master 上执行 rsync.sh 脚本:

[root@master ~]# sh /root/rsync.sh
您当前的服务器是源服务器(主)还是目标服务器(从)?如果是主输入 M ,如果是从输入 S :M
Generating public/private rsa key pair.
Your identification has been saved in /home/rsyncuser/id_rsa.
Your public key has been saved in /home/rsyncuser/id_rsa.pub.
The key fingerprint is:
SHA256:hHMoh/tC+p5EIiV50N/5L1r358lHXtGV88J4zloSE7A root@master
The key's randomart image is:
+---[RSA 8192]----+
|..        ..    .|
| o.  . o   ..  o.|
|o o.o.=.o E  +  =|
| +  .+o+    + +.o|
|. . +  .S    * ..|
| . = .  .   . + o|
|  . o . ...  + o.|
|   o o .........o|
|   .+ .. .  .o+. |
+----[SHA256]-----+

!!! 注意!!!目标服务器(从)全部配置完成后即可删除以下文件:/home/rsyncuser/id_rsa
您现在可以在 slave 上执行该脚本了。
[root@master ~]#

6 、再在 slave1( 172.16.57.156 )上执行 rsync.sh 脚本:

[root@slave1 ~]# sh /root/rsync.sh
您当前的服务器是源服务器(主)还是目标服务器(从)?如果是主输入 M ,如果是从输入 S :S

!!! 注意!!!请先在 master 上执行该脚本!

请输入源服务器(主)的 IP 地址 :172.16.57.159
请输入您要登录源服务器(主)所使用的 Linux 账号(比如:root ):root
请输入目标服务器(本机)的 IP 地址 :172.16.57.156
请输入您要登录目标服务器(本机)所使用的 Linux 账号(比如:root ):root
请输入源服务器(主)上的源路径(比如:/www/app/www.test.com ):/www/app/www.test.com
请输入目标服务器(本机)上的目标路径(比如:/www/app ,默认值为 /www/app ,直接回车即可):/www/app
The authenticity of host '172.16.57.159 (172.16.57.159)' can't be established.
ECDSA key fingerprint is SHA256:hl/4irEfCS0RGtoNl3f4mM+KZzQ2Y19hyBr/AmeThro.
ECDSA key fingerprint is MD5:1e:bb:4a:47:8a:ba:b6:f2:5b:4e:93:88:52:f3:bd:6c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.57.159' (ECDSA) to the list of known hosts.
root@172.16.57.159's password: 
The authenticity of host '172.16.57.156 (172.16.57.156)' can't be established.
ECDSA key fingerprint is SHA256:hl/4irEfCS0RGtoNl3f4mM+KZzQ2Y19hyBr/AmeThro.
ECDSA key fingerprint is MD5:1e:bb:4a:47:8a:ba:b6:f2:5b:4e:93:88:52:f3:bd:6c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.57.156' (ECDSA) to the list of known hosts.
root@172.16.57.156's password: 
id_rsa                                                                                           100% 6367     2.3MB/s   00:00    
Connection to 172.16.57.159 closed.

=====================================================
即将执行同步 ...
receiving incremental file list
www.test.com/
www.test.com/index.html

sent 53 bytes  received 145 bytes  396.00 bytes/sec
total size is 9  speedup is 0.05

=====================================================
执行完毕。
在 slave 上将会定时执行同步(请用命令 crontab -l 查看);
如需手动同步,请在 slave 上执行:sh /home/rsync/rsync.sh 。
[root@slave1 ~]#

这里需要注意的是,master 上的源路径 Ricky 设置为:/www/app/www.test.com ,而 slave 上的目标路径设置为:/www/app ,都是不尾随斜线的。最终的效果是 slave 会先在 /www/app 文件夹下创建一个 www.test.com 文件夹(如果文件夹已存在则不会创建),然后再把 master 的 /www/app/www.test.com 文件夹下的所有文件同步到 slave 的 /www/app/www.test.com 文件夹下。

现在可以看到 slave1 的 /www/app/www.test.com/index.html 文件已经被更新:

[root@slave1 ~]# cat /www/app/www.test.com/index.html
ccie.lol
[root@slave1 ~]#

7 、最后在 slave2( 172.16.57.157 )上执行 rsync.sh 脚本:

[root@slave2 ~]# sh /root/rsync.sh 
您当前的服务器是源服务器(主)还是目标服务器(从)?如果是主输入 M ,如果是从输入 S :S

!!! 注意!!!请先在 master 上执行该脚本!

请输入源服务器(主)的 IP 地址 :172.16.57.159
请输入您要登录源服务器(主)所使用的 Linux 账号(比如:root ):root
请输入目标服务器(本机)的 IP 地址 :172.16.57.157
请输入您要登录目标服务器(本机)所使用的 Linux 账号(比如:root ):root
请输入源服务器(主)上的源路径(比如:/www/app/www.test.com ):/www/app/www.test.com
请输入目标服务器(本机)上的目标路径(比如:/www/app ,默认值为 /www/app ,直接回车即可):/www/app
The authenticity of host '172.16.57.159 (172.16.57.159)' can't be established.
ECDSA key fingerprint is SHA256:hl/4irEfCS0RGtoNl3f4mM+KZzQ2Y19hyBr/AmeThro.
ECDSA key fingerprint is MD5:1e:bb:4a:47:8a:ba:b6:f2:5b:4e:93:88:52:f3:bd:6c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.57.159' (ECDSA) to the list of known hosts.
root@172.16.57.159's password: 
The authenticity of host '172.16.57.157 (172.16.57.157)' can't be established.
ECDSA key fingerprint is SHA256:hl/4irEfCS0RGtoNl3f4mM+KZzQ2Y19hyBr/AmeThro.
ECDSA key fingerprint is MD5:1e:bb:4a:47:8a:ba:b6:f2:5b:4e:93:88:52:f3:bd:6c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.57.157' (ECDSA) to the list of known hosts.
root@172.16.57.157's password: 
id_rsa                                                                                           100% 6367     2.2MB/s   00:00    
Connection to 172.16.57.159 closed.

=====================================================
即将执行同步 ...
receiving incremental file list
www.test.com/
www.test.com/index.html

sent 47 bytes  received 145 bytes  128.00 bytes/sec
total size is 9  speedup is 0.05

=====================================================
执行完毕。
在 slave 上将会定时执行同步(请用命令 crontab -l 查看);
如需手动同步,请在 slave 上执行:sh /home/rsync/rsync.sh 。
[root@slave2 ~]#

现在可以看到 slave2 的 /www/app/www.test.com/index.html 文件也被创建了:

[root@slave2 ~]# cat /www/app/www.test.com/index.html
ccie.lol
[root@slave2 ~]#

8 、现在 master 上的私钥文件可以删除掉了(如果今后还需要添加更多的 slave ,那么请不用删除该文件):

[root@master ~]# rm -f /home/rsyncuser/id_rsa

9 、现在两台 slave 每三分钟会执行一次同步脚本:

[root@slave1 ~]# crontab -l
*/3 * * * * /home/rsync/rsync.sh
[root@slave1 ~]#

手工执行该脚本也是可以的:

[root@slave1 ~]# /home/rsync/rsync.sh
receiving incremental file list

sent 25 bytes  received 111 bytes  272.00 bytes/sec
total size is 13  speedup is 0.10
[root@slave1 ~]#

至此,配置完成。

 

参考自:

  • https://www.cnblogs.com/f-ck-need-u/p/7220009.html
  • https://blog.csdn.net/tangxinzhuan/article/details/78790153
打赏作者
这里是 “ CCIE 工程师社区 ” 官方的捐款通道,您是否可以考虑请我们喝杯咖啡呢?

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

Was this article helpful?

Related Articles

Leave A Comment?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据